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 1d692b6d2..4c31aefec 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 @@ -9,9 +9,6 @@ package org.eclipse.hawkbit.ui.artifacts.smtable; import java.io.Serializable; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; @@ -21,6 +18,7 @@ import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.SoftwareModuleTypeBeanQuery; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; @@ -34,9 +32,7 @@ import org.vaadin.spring.events.EventBus; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.AbstractField; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.FormLayout; import com.vaadin.ui.Label; @@ -82,16 +78,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se private CommonDialogWindow window; - private String originalDescriptionValue; - - private String originalVendorValue; - - private String originalNameValue; - - private String originalVersionValue; - - private String originalComboBoxValue; - private Boolean editSwModule = Boolean.FALSE; private Long baseSwModuleId; @@ -126,8 +112,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se this.baseSwModuleId = baseSwModuleId; createRequiredComponents(); createWindow(); - /* populate selected target values to edit. */ - populateValuesOfSwModule(); nameTextField.setEnabled(false); versionTextField.setEnabled(false); typeComboBox.setEnabled(false); @@ -178,12 +162,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se versionTextField.clear(); descTextArea.clear(); typeComboBox.clear(); - - originalDescriptionValue = null; - originalVendorValue = null; - originalComboBoxValue = null; - originalNameValue = null; - originalVersionValue = null; } private void createWindow() { @@ -193,11 +171,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se final Label madatoryStarLabel = new Label("*"); madatoryStarLabel.setStyleName("v-caption v-required-field-indicator"); madatoryStarLabel.setWidth(null); - - /* - * The main layout of the window contains mandatory info, textboxes - * (controller Id, name & description) and action buttons layout - */ addStyleName("lay-color"); setSizeUndefined(); @@ -211,39 +184,14 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se setCompositionRoot(formLayout); - /* add main layout to the window */ - window = SPUIComponentProvider.getWindow(i18n.get("upload.caption.add.new.swmodule"), null, + populateValuesOfSwModule(); + window = SPUIWindowDecorator.getWindow(i18n.get("upload.caption.add.new.swmodule"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveOrUpdate(), event -> closeThisWindow(), null, formLayout, i18n); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); typeComboBox.focus(); } - private Map getMandatoryFields(final FormLayout formLayout) { - 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.getId(), Boolean.FALSE); - } - } - return requiredFields; - } - - 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; - } - - /** - * Add new SW module. - */ private void addNewBaseSoftware() { final String name = HawkbitCommonUtil.trimAndNullIfEmpty(nameTextField.getValue()); final String version = HawkbitCommonUtil.trimAndNullIfEmpty(versionTextField.getValue()); @@ -302,9 +250,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getVendor())); descTextArea.setValue(swModle.getDescription() == null ? HawkbitCommonUtil.SP_STRING_EMPTY : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getDescription())); - originalDescriptionValue = descTextArea.getValue(); - originalVendorValue = vendorTextField.getValue(); - originalComboBoxValue = swModle.getType().getName(); if (swModle.getType().isDeleted()) { typeComboBox.addItem(swModle.getType().getName()); } 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 0c47772ea..2c6dcd702 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 @@ -9,10 +9,7 @@ package org.eclipse.hawkbit.ui.artifacts.smtype; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.EntityFactory; @@ -37,10 +34,8 @@ import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.shared.ui.colorpicker.Color; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.AbstractField; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Component; import com.vaadin.ui.Label; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.components.colorpicker.ColorChangeListener; @@ -91,15 +86,11 @@ 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(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(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, "", @@ -107,7 +98,6 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout tagDesc.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagDesc())); singleMultiOptionGroup(); } @@ -122,23 +112,8 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout } @Override - public void createWindow() { - reset(); - window = SPUIComponentProvider.getWindow(i18n.get("caption.add.type"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields(), - getEditedFields(), i18n); - } - - private Map getMandatoryFields() { - final Map requiredFields = new HashMap<>(); - final Iterator iterate = getFormLayout().iterator(); - while (iterate.hasNext()) { - final Component c = iterate.next(); - if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getId(), Boolean.FALSE); - } - } - return requiredFields; + protected String getWindowCaption() { + return i18n.get("caption.add.type"); } /** @@ -189,14 +164,11 @@ 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()); - setOriginalTagDesc(selectedTypeTag.getDescription()); typeKey.setValue(selectedTypeTag.getKey()); - setOriginalTypeKey(selectedTypeTag.getKey()); if (selectedTypeTag.getMaxAssignments() == Integer.MAX_VALUE) { assignOptiongroup.setValue(multiAssignStr); } else { 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 d920d2f58..e6fb5e957 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 @@ -12,10 +12,13 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; @@ -27,9 +30,14 @@ import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; +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.event.FieldEvents.TextChangeListener; import com.vaadin.event.FieldEvents.TextChangeNotifier; import com.vaadin.server.FontAwesome; +import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractField; import com.vaadin.ui.AbstractLayout; import com.vaadin.ui.AbstractOrderedLayout; @@ -37,7 +45,7 @@ import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; -import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Field; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; @@ -47,9 +55,9 @@ import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; /** - * TODO: AbstractColorPicker und FlexibleOptionGroupItemComponent Superclass for - * pop-up-windows including a minimize and close icon in the upper right corner - * and a save and cancel button at the bottom. + * + * Table pop-up-windows including a minimize and close icon in the upper right + * corner and a save and cancel button at the bottom. Is not intended to reuse. */ public class CommonDialogWindow extends Window implements Serializable { @@ -75,7 +83,7 @@ public class CommonDialogWindow extends Window implements Serializable { private final ClickListener cancelButtonClickListener; - private Map orginalValues; + private final Map orginalValues; private final List> allComponents; @@ -97,7 +105,7 @@ public class CommonDialogWindow extends Window implements Serializable { */ public CommonDialogWindow(final String caption, final Component content, final String helpLink, final ClickListener saveButtonClickListener, final ClickListener cancelButtonClickListener, - final FormLayout formLayout, final I18N i18n) { + final AbstractLayout layout, final I18N i18n) { checkNotNull(saveButtonClickListener); checkNotNull(cancelButtonClickListener); this.caption = caption; @@ -105,21 +113,45 @@ public class CommonDialogWindow extends Window implements Serializable { this.helpLink = helpLink; this.saveButtonClickListener = saveButtonClickListener; this.cancelButtonClickListener = cancelButtonClickListener; - this.allComponents = getAllComponents(formLayout); + this.orginalValues = new HashMap<>(); + this.allComponents = getAllComponents(layout); this.i18n = i18n; init(); } - public void setSaveButtonEnabled(final boolean enabled) { - saveButton.setEnabled(enabled); + @Override + public void close() { + super.close(); + orginalValues.clear(); + removeListeners(); + allComponents.clear(); + this.saveButton.setEnabled(false); } - public void setCancelButtonEnabled(final boolean enabled) { - cancelButton.setEnabled(enabled); + private void removeListeners() { + for (final AbstractField field : allComponents) { + removeTextListener(field); + removeValueChangeListener(field); + } } - public HorizontalLayout getButtonsLayout() { - return buttonsLayout; + private void removeTextListener(final AbstractField field) { + if (!(field instanceof TextChangeNotifier)) { + return; + } + for (final Object listener : field.getListeners(TextChangeEvent.class)) { + if (listener instanceof ChangeListener) { + ((TextChangeNotifier) field).removeTextChangeListener((ChangeListener) listener); + } + } + } + + private void removeValueChangeListener(final AbstractField field) { + for (final Object listener : field.getListeners(ValueChangeEvent.class)) { + if (listener instanceof ChangeListener) { + field.removeValueChangeListener((ChangeListener) listener); + } + } } private final void init() { @@ -152,39 +184,44 @@ public class CommonDialogWindow extends Window implements Serializable { addListeners(); } - private final void setOrginaleValues() { + public final void setOrginaleValues() { for (final AbstractField field : allComponents) { orginalValues.put(field, field.getValue()); } + saveButton.setEnabled(isSaveButtonEnabledAfterValueChange(null, null)); } private final void addListeners() { for (final AbstractField field : allComponents) { - field.addValueChangeListener(event -> saveButton.setEnabled(isSaveButtonEnabled())); + field.addValueChangeListener(new ChangeListener(field)); if (field instanceof TextChangeNotifier) { - ((TextChangeNotifier) field) - .addTextChangeListener(event -> saveButton.setEnabled(isSaveButtonEnabled())); + ((TextChangeNotifier) field).addTextChangeListener(new ChangeListener(field)); } } - saveButton.addClickListener(event -> save()); + saveButton.addClickListener(event -> close()); + cancelButton.addClickListener(event -> close()); } - private void save() { - saveButton.setEnabled(false); - setOrginaleValues(); + private boolean isSaveButtonEnabledAfterValueChange(final Component currentChangedComponent, + final Object newValue) { + return isMandatoyFieldNotEmpty(currentChangedComponent, newValue) + && isValuesChanged(currentChangedComponent, newValue); } - private boolean isSaveButtonEnabled() { - return isMandatoyFieldNotEmpty() && isValuesChanged(); - } - - private boolean isValuesChanged() { + private boolean isValuesChanged(final Component currentChangedComponent, final Object newValue) { for (final AbstractField field : allComponents) { - final Object currentValue = field.getValue(); - final Object orginalValue = orginalValues.get(field); + Object orginalValue = orginalValues.get(field); + Object currentValue = field.getValue(); + if (field.equals(currentChangedComponent)) { + currentValue = newValue; + } - if (!Objects.equals(currentValue, orginalValue)) { + if (String.class.equals(field.getType())) { + orginalValue = Strings.emptyToNull((String) orginalValue); + currentValue = Strings.emptyToNull((String) orginalValue); + } + if (!Objects.equals(orginalValue, currentValue)) { return true; } @@ -202,14 +239,34 @@ public class CommonDialogWindow extends Window implements Serializable { return false; } - private boolean isMandatoyFieldNotEmpty() { - for (final AbstractField field : allComponents) { - // TODO empty string. - if (field.isRequired() && field.getValue() == null) { + private boolean isMandatoyFieldNotEmpty(final Component currentChangedComponent, final Object newValue) { + final List> requiredComponents = allComponents.stream().filter(field -> field.isRequired()) + .collect(Collectors.toList()); + + for (final AbstractField field : requiredComponents) { + Object value = field.getValue(); + if (field.equals(currentChangedComponent)) { + value = newValue; + } + + if (String.class.equals(field.getType())) { + value = Strings.emptyToNull((String) value); + } + + if (Set.class.equals(field.getType())) { + value = emptyToNull((Set) value); + } + + if (value == null) { return false; } } return true; + + } + + private static Object emptyToNull(final Set c) { + return (c == null || c.isEmpty()) ? null : c; } private List> getAllComponents(final AbstractLayout abstractLayout) { @@ -299,4 +356,30 @@ public class CommonDialogWindow extends Window implements Serializable { buttonsLayout.setComponentAlignment(helpLinkComponent, Alignment.MIDDLE_RIGHT); } + public AbstractComponent getButtonsLayout() { + return this.buttonsLayout; + } + + private class ChangeListener implements ValueChangeListener, TextChangeListener { + + private final Field field; + + public ChangeListener(final Field field) { + super(); + this.field = field; + } + + @Override + public void textChange(final TextChangeEvent event) { + saveButton.setEnabled(isSaveButtonEnabledAfterValueChange(field, event.getText())); + + } + + @Override + public void valueChange(final ValueChangeEvent event) { + saveButton.setEnabled(isSaveButtonEnabledAfterValueChange(field, field.getValue())); + } + + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java index d0e509f7e..f3f5c5a06 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java @@ -14,7 +14,6 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.model.BaseEntity; import org.eclipse.hawkbit.repository.model.DistributionSet; -import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.UserDetailsFormatter; import org.eclipse.hawkbit.ui.decorators.SPUIButtonDecorator; import org.eclipse.hawkbit.ui.decorators.SPUIComboBoxDecorator; @@ -33,11 +32,8 @@ import com.vaadin.server.FontAwesome; import com.vaadin.server.Resource; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.Button; -import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.Component; -import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Link; @@ -141,25 +137,6 @@ public final class SPUIComponentProvider { return SPUILabelDecorator.getDeocratedLabel(name, type); } - /** - * Get window component. - * - * @param caption - * window caption - * @param id - * window id - * @param type - * type of window - * @return Window - */ - public static CommonDialogWindow getWindow(final String caption, final String id, final String type, - final Component content, final ClickListener saveButtonClickListener, - final ClickListener cancelButtonClickListener, final String helpLink, final FormLayout formLayout, - final I18N i18n) { - return SPUIWindowDecorator.getDeocratedWindow(caption, id, type, content, saveButtonClickListener, - cancelButtonClickListener, helpLink, formLayout, i18n); - } - /** * Get window component. * diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/decorators/SPUIWindowDecorator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/decorators/SPUIWindowDecorator.java index 242d8931a..d7cc0f9d4 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/decorators/SPUIWindowDecorator.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/decorators/SPUIWindowDecorator.java @@ -13,9 +13,9 @@ import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; +import com.vaadin.ui.AbstractLayout; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; -import com.vaadin.ui.FormLayout; import com.vaadin.ui.Window; /** @@ -44,13 +44,13 @@ public final class SPUIWindowDecorator { * window type * @return Window */ - public static CommonDialogWindow getDeocratedWindow(final String caption, final String id, final String type, + public static CommonDialogWindow getWindow(final String caption, final String id, final String type, final Component content, final ClickListener saveButtonClickListener, - final ClickListener cancelButtonClickListener, final String helpLink, final FormLayout formLayout, + final ClickListener cancelButtonClickListener, final String helpLink, final AbstractLayout layout, final I18N i18n) { final CommonDialogWindow window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener, - cancelButtonClickListener, formLayout, i18n); + cancelButtonClickListener, layout, i18n); if (null != id) { window.setId(id); } 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 4a566cb51..6dcb1af0b 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 @@ -8,7 +8,6 @@ */ package org.eclipse.hawkbit.ui.distributions.disttype; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -27,6 +26,7 @@ import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.distributions.event.DistributionSetTypeEvent; import org.eclipse.hawkbit.ui.distributions.event.DistributionSetTypeEvent.DistributionSetTypeEnum; import org.eclipse.hawkbit.ui.layouts.CreateUpdateTypeLayout; +import org.eclipse.hawkbit.ui.utils.CommonDialogWindowHelper; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; @@ -43,7 +43,6 @@ import com.vaadin.data.util.IndexedContainer; import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.AbstractField; import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; @@ -91,8 +90,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private IndexedContainer originalSelectedTableContainer; - private String originalTypeKey; - @Override protected void createRequiredComponents() { @@ -102,15 +99,11 @@ 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(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(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, "", @@ -118,7 +111,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout tagDesc.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, getOriginalTagDesc())); } @Override @@ -190,8 +182,9 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout selectedTable.setImmediate(true); selectedTable.setVisibleColumns(DIST_TYPE_NAME, DIST_TYPE_MANDATORY); selectedTable.setColumnHeaders(i18n.get("header.dist.twintable.selected"), STAR); - selectedTable.setColumnExpandRatio(DIST_TYPE_NAME, 0.75f); - selectedTable.setColumnExpandRatio(DIST_TYPE_MANDATORY, 0.25f); + selectedTable.setColumnExpandRatio(DIST_TYPE_NAME, 0.75F); + selectedTable.setColumnExpandRatio(DIST_TYPE_MANDATORY, 0.25F); + selectedTable.setRequired(true); } private void addTooltTipToSelectedTable() { @@ -251,11 +244,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout selectedTableContainer.addContainerProperty(DIST_TYPE_MANDATORY, CheckBox.class, null); } - private void listenerMandatoryCheckboxChanged(final ValueChangeEvent event) { - - window.setSaveButtonEnabled(true); - } - private void createOriginalSelectedTableContainer() { originalSelectedTableContainer = new IndexedContainer(); @@ -268,24 +256,29 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private void addSMType() { final Set selectedIds = (Set) sourceTable.getValue(); - if (selectedIds != null && !selectedIds.isEmpty()) { - for (final Long id : selectedIds) { - addTargetTableData(id); - } - window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); + if (selectedIds == null) { + return; } + for (final Long id : selectedIds) { + addTargetTableData(id); + } + // TODO: Add Table to window + // window.updateRequiredFields(selectedTable.getId(), + // hasContentChanged()); } private void removeSMType() { @SuppressWarnings("unchecked") final Set selectedIds = (Set) selectedTable.getValue(); - if (selectedIds != null && !selectedIds.isEmpty()) { - for (final Long id : selectedIds) { - addSourceTableData(id); - selectedTable.removeItem(id); - window.updateRequiredFields(selectedTable.getId(), hasContentChanged()); - } + if (selectedIds == null) { + return; + } + for (final Long id : selectedIds) { + addSourceTableData(id); + selectedTable.removeItem(id); + // window.updateRequiredFields(selectedTable.getId(), + // hasContentChanged()); } } @@ -294,26 +287,27 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout if (originalSelectedTableContainer == null) { originalSelectedTableContainer = new IndexedContainer(); } + // is new softwareModule added? 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); + // window.updateEditedFields(selectedTable.getId(), + // Boolean.TRUE); return Boolean.TRUE; } } + // is softwareModule removed and at least one softwareModule is selected for (final Iterator itemIterator = originalSelectedTableContainer.getItemIds().iterator(); itemIterator .hasNext();) { final long itemId = (Long) itemIterator.next(); if (selectedTableContainer.size() > 0 && !selectedTableContainer.containsId(itemId)) { - window.updateEditedFields(selectedTable.getId(), Boolean.TRUE); + // window.updateEditedFields(selectedTable.getId(), + // Boolean.TRUE); return Boolean.TRUE; } } - if (selectedTableContainer.size() > 0) { - window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); - } return Boolean.FALSE; } @@ -524,7 +518,7 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout super.optionValueChanged(event); if (updateTypeStr.equals(event.getProperty().getValue())) { - window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); + // window.updateRequiredFields(selectedTable.getId(), Boolean.TRUE); selectedTable.getContainerDataSource().removeAllItems(); getSourceTableData(); distTypeSelectLayout.setEnabled(false); @@ -582,15 +576,12 @@ 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()); - setOriginalTagDesc(selectedTypeTag.getDescription()); typeKey.setValue(selectedTypeTag.getKey()); - setOriginalTypeKey(selectedTypeTag.getKey()); if (distributionSetManagement.countDistributionSetsByType(selectedTypeTag) <= 0) { distTypeSelectLayout.setEnabled(true); selectedTable.setEnabled(true); @@ -621,20 +612,19 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout @SuppressWarnings("unchecked") private void addTargetTableforUpdate(final SoftwareModuleType swModuleType, final boolean mandatory) { - Item saveTblitem; - if (selectedTableContainer != null) { - saveTblitem = selectedTableContainer.addItem(swModuleType.getId()); - sourceTable.removeItem(swModuleType.getId()); - saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); - saveTblitem.getItemProperty(DIST_TYPE_MANDATORY).setValue(new CheckBox("", mandatory)); - final CheckBox mandatoryCheckbox = (CheckBox) selectedTableContainer - .getContainerProperty(swModuleType.getId(), DIST_TYPE_MANDATORY).getValue(); - mandatoryCheckbox.addValueChangeListener(this::listenerMandatoryCheckboxChanged); - - final Item originalItem = originalSelectedTableContainer.addItem(swModuleType.getId()); - originalItem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); - originalItem.getItemProperty(DIST_TYPE_MANDATORY).setValue(new CheckBox("", mandatory)); + if (selectedTableContainer == null) { + return; } + final Item saveTblitem = selectedTableContainer.addItem(swModuleType.getId()); + sourceTable.removeItem(swModuleType.getId()); + saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); + saveTblitem.getItemProperty(DIST_TYPE_MANDATORY).setValue(new CheckBox("", mandatory)); + final CheckBox mandatoryCheckbox = (CheckBox) selectedTableContainer + .getContainerProperty(swModuleType.getId(), DIST_TYPE_MANDATORY).getValue(); + + final Item originalItem = originalSelectedTableContainer.addItem(swModuleType.getId()); + originalItem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); + originalItem.getItemProperty(DIST_TYPE_MANDATORY).setValue(new CheckBox("", mandatory)); } @Override @@ -653,37 +643,17 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout } @Override - public void createWindow() { - reset(); - window = SPUIComponentProvider.getWindow(i18n.get("caption.add.type"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields(), - getEditedFields(), i18n); + protected String getWindowCaption() { + return i18n.get("caption.add.type"); } - private Map getMandatoryFields() { - final Map requiredFields = new HashMap<>(); - final Iterator iterate = getFormLayout().iterator(); - while (iterate.hasNext()) { - final Component c = iterate.next(); - if (c instanceof AbstractField && ((AbstractField) c).isRequired()) { - requiredFields.put(c.getId(), Boolean.FALSE); - } - } + protected Map getMandatoryFields() { + final Map requiredFields = CommonDialogWindowHelper.getMandatoryFields(getFormLayout()); // Selected SoftwareModulesType 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) { @@ -718,14 +688,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; - } + // @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/distributions/dstable/DistributionSetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetDetails.java index 75f7071ea..95441ae57 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetDetails.java @@ -259,8 +259,8 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet @Override protected void onEdit(final ClickEvent event) { - final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(); distributionAddUpdateWindowLayout.populateValuesOfDistribution(getSelectedBaseEntityId()); + final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(); newDistWindow.setCaption(getI18n().get("caption.update.dist")); UI.getCurrent().addWindow(newDistWindow); newDistWindow.setVisible(Boolean.TRUE); 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 6beb7d5b7..5b3266f02 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 @@ -8,10 +8,6 @@ */ package org.eclipse.hawkbit.ui.layouts; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - import javax.annotation.PreDestroy; import org.eclipse.hawkbit.repository.SpPermissionChecker; @@ -24,6 +20,7 @@ import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper; import org.eclipse.hawkbit.ui.colorpicker.ColorPickerLayout; import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; @@ -38,11 +35,9 @@ import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.server.Page; import com.vaadin.shared.ui.colorpicker.Color; -import com.vaadin.ui.AbstractField; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.FormLayout; import com.vaadin.ui.GridLayout; @@ -103,42 +98,13 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected GridLayout mainLayout; protected VerticalLayout contentLayout; - protected boolean tagPreviewBtnClicked = false; + protected boolean tagPreviewBtnClicked; private String colorPicked; protected String tagNameValue; protected String tagDescValue; - private Color originalSelectedColor; - private String originalTagDesc; - private String originalTagName; - - protected void createWindow() { - reset(); - setWindow( - SPUIComponentProvider.getWindow(i18n.get("caption.add.tag"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, - this, this::save, this::discard, null, getMandatoryFields(), getEditedFields(), i18n)); - } - - 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.getId(), null); - } - } - return requiredFields; - } - - 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); - return changeMap; - } + protected abstract String getWindowCaption(); /** * Save new tag / update new tag. @@ -171,7 +137,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent setSizeUndefined(); createRequiredComponents(); buildLayout(); - createWindow(); addListeners(); eventBus.subscribe(this); } @@ -193,8 +158,6 @@ 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(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"), @@ -202,7 +165,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagDesc.setId(SPUIDefinitions.NEW_TARGET_TAG_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); - tagDesc.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTagDesc)); tagNameComboBox = SPUIComponentProvider.getComboBox(null, "", "", null, null, false, "", i18n.get("label.combobox.tag")); @@ -245,6 +207,10 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent mainLayout.setSizeFull(); mainLayout.addComponent(contentLayout, 0, 0); + colorPickerLayout.setVisible(false); + mainLayout.addComponent(colorPickerLayout, 1, 0); + mainLayout.setComponentAlignment(colorPickerLayout, Alignment.MIDDLE_CENTER); + setCompositionRoot(mainLayout); tagName.focus(); } @@ -264,13 +230,10 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected void previewButtonClicked() { if (!tagPreviewBtnClicked) { setColor(); - mainLayout.getComponent(1, 0); - mainLayout.addComponent(colorPickerLayout, 1, 0); - mainLayout.setComponentAlignment(colorPickerLayout, Alignment.MIDDLE_CENTER); - } else { - mainLayout.removeComponent(colorPickerLayout); } + tagPreviewBtnClicked = !tagPreviewBtnClicked; + colorPickerLayout.setVisible(tagPreviewBtnClicked); } private void setColor() { @@ -307,6 +270,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent } else { resetTagNameField(); } + window.setOrginaleValues(); } protected void resetTagNameField() { @@ -314,7 +278,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagName.clear(); tagDesc.clear(); restoreComponentStyles(); - mainLayout.removeComponent(colorPickerLayout); colorPickerLayout.setSelectedColor(colorPickerLayout.getDefaultColor()); colorPickerLayout.getSelPreview().setColor(colorPickerLayout.getSelectedColor()); tagPreviewBtnClicked = false; @@ -344,7 +307,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); } - window.reset(); // close the color picker layout tagPreviewBtnClicked = false; // reset the selected color - Set default color @@ -352,7 +314,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent getPreviewButtonColor(ColorPickerConstants.DEFAULT_COLOR); colorPickerLayout.getSelPreview() .setColor(ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - mainLayout.removeComponent(colorPickerLayout); + window.setOrginaleValues(); } /** @@ -367,16 +329,12 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent // hide target name combo comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); - mainLayout.removeComponent(colorPickerLayout); // Default green color colorPickerLayout.setSelectedColor(colorPickerLayout.getDefaultColor()); colorPickerLayout.getSelPreview().setColor(colorPickerLayout.getSelectedColor()); tagPreviewBtnClicked = false; - if (window != null) { - window.reset(); - } } /** @@ -466,7 +424,9 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent colorPickerLayout.getColorSelect().setColor(colorPickerLayout.getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), originalSelectedColor); + // TODO: + // window.checkColorChange(colorPickerLayout.getId(), + // colorPickerLayout.getSelectedColor(), originalSelectedColor); } protected void closeWindow() { @@ -519,13 +479,11 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent public CommonDialogWindow getWindow() { reset(); + window = SPUIWindowDecorator.getWindow(getWindowCaption(), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, + this::save, this::discard, null, mainLayout, i18n); return window; } - public void setWindow(final CommonDialogWindow window) { - this.window = window; - } - /** * Value change listeners implementations of sliders. */ @@ -677,40 +635,8 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent return formLayout; } - public Color getSelectedColorOriginal() { - return originalSelectedColor; - } - - public void setSelectedColorOriginal(final Color selectedColorOriginal) { - 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 6ede668b0..47451d662 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 @@ -34,14 +34,13 @@ import com.vaadin.ui.themes.ValoTheme; * Superclass defining common properties and methods for creating/updating * types. */ -public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { +public abstract class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { private static final long serialVersionUID = 5732904956185988397L; protected String createTypeStr; protected String updateTypeStr; protected TextField typeKey; - 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"; @@ -154,7 +153,6 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); } - window.reset(); restoreComponentStyles(); getPreviewButtonColor(ColorPickerConstants.DEFAULT_COLOR); getColorPickerLayout().getSelPreview() @@ -181,8 +179,11 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { createDynamicStyleForComponents(tagName, typeKey, tagDesc, colorPickedPreview); getColorPickerLayout().getColorSelect().setColor(getColorPickerLayout().getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), - getOriginalSelectedColor()); + + // TODO: + // window.checkColorChange(colorPickerLayout.getId(), + // colorPickerLayout.getSelectedColor(), + // getOriginalSelectedColor()); } /** @@ -236,14 +237,12 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { getColorPickerLayout().getColorSelect().setColor(getColorPickerLayout().getSelectedColor()); createDynamicStyleForComponents(tagName, typeKey, tagDesc, ColorPickerConstants.DEFAULT_COLOR); getPreviewButtonColor(ColorPickerConstants.DEFAULT_COLOR); - setSelectedColorOriginal(getColorPickerLayout().getDefaultColor()); } else { getColorPickerLayout().setSelectedColor(ColorPickerHelper.rgbToColorConverter(color)); getColorPickerLayout().getSelPreview().setColor(getColorPickerLayout().getSelectedColor()); getColorPickerLayout().getColorSelect().setColor(getColorPickerLayout().getSelectedColor()); createDynamicStyleForComponents(tagName, typeKey, tagDesc, color); getPreviewButtonColor(color); - setSelectedColorOriginal(ColorPickerHelper.rgbToColorConverter(color)); } } @@ -302,12 +301,4 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { // is implemented in the inherited class } - public String getOriginalTypeKey() { - return originalTypeKey; - } - - 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 90dd8a6a6..939753380 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 @@ -9,7 +9,6 @@ package org.eclipse.hawkbit.ui.management.dstable; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import javax.annotation.PostConstruct; @@ -25,6 +24,7 @@ import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.DistributionSetTypeBeanQuery; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; import org.eclipse.hawkbit.ui.management.event.DragEvent; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; @@ -44,10 +44,8 @@ import org.vaadin.spring.events.EventBus; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.AbstractField; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.FormLayout; import com.vaadin.ui.TextArea; @@ -137,18 +135,12 @@ 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(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(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")); @@ -156,23 +148,17 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { 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); - reqMigStepCheckbox.addValueChangeListener( - event -> window.checkMandatoryEditedValueBoolean(event, reqMigStepCheckbox, originalReqMigStep)); } /** @@ -374,9 +360,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { originalDistVersion = null; originalReqMigStep = Boolean.FALSE; - if (window != null) { - window.reset(); - } } private void populateRequiredComponents() { @@ -408,44 +391,20 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { 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); - window = SPUIComponentProvider.getWindow(i18n.get("caption.add.new.dist"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), event -> discardDistribution(), - null, getMandatoryFields(), getEditedFields(), i18n); - window.getButtonsLayout().removeStyleName("actionButtonsMargin"); populateRequiredComponents(); resetComponents(); + window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.dist"), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), event -> discardDistribution(), + null, formLayout, i18n); + window.getButtonsLayout().removeStyleName("actionButtonsMargin"); 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.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. */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java index dc7e347cd..0bf9ef81b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java @@ -77,8 +77,8 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail @Override protected void onEdit(final ClickEvent event) { - final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(); distributionAddUpdateWindowLayout.populateValuesOfDistribution(getSelectedBaseEntityId()); + final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(); newDistWindow.setCaption(getI18n().get("caption.update.dist")); UI.getCurrent().addWindow(newDistWindow); newDistWindow.setVisible(Boolean.TRUE); 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 1522c19c3..9544776a6 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 @@ -151,18 +151,14 @@ 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()); - setOriginalTagDesc(selectedDistTag.getDescription()); if (null == selectedDistTag.getColour()) { setTagColor(getColorPickerLayout().getDefaultColor(), ColorPickerConstants.DEFAULT_COLOR); - setSelectedColorOriginal(getColorPickerLayout().getDefaultColor()); } else { setTagColor(ColorPickerHelper.rgbToColorConverter(selectedDistTag.getColour()), selectedDistTag.getColour()); - setSelectedColorOriginal(ColorPickerHelper.rgbToColorConverter(selectedDistTag.getColour())); } } } @@ -181,4 +177,8 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat permChecker.hasUpdateDistributionPermission()); } + @Override + protected String getWindowCaption() { + return i18n.get("caption.add.tag"); + } } 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 6c2193adb..fb7307f5f 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 @@ -10,7 +10,6 @@ package org.eclipse.hawkbit.ui.management.targettable; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -21,6 +20,7 @@ import org.eclipse.hawkbit.repository.model.TargetIdName; import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.management.event.DragEvent; import org.eclipse.hawkbit.ui.management.event.TargetTableEvent; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; @@ -36,8 +36,6 @@ import org.vaadin.spring.events.EventBus; 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.TextArea; @@ -96,16 +94,10 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { 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(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.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", @@ -113,7 +105,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.TARGET_ADD_DESC); descTextArea.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY); - descTextArea.addTextChangeListener(event -> window.checkMandatoryEditedTextField(event, originalTargetDesc)); } private void buildLayout() { @@ -192,24 +183,12 @@ 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, + window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.target"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), - event -> discardTargetListner(), null, getMandatoryFields(), getEditedFields(), i18n); + event -> discardTargetListner(), null, formLayout, 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.getId(), Boolean.FALSE); - } - } - return requiredFields; - } - private Map getEditedFields() { final Map editedFields = new HashMap<>(); editedFields.put(controllerIDTextField.getId(), Boolean.FALSE); @@ -234,9 +213,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { originalTargetDesc = null; originalTargetName = null; - if (window != null) { - window.reset(); - } } private void closeThisWindow() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java index e7553eaba..ffaa39411 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java @@ -106,8 +106,12 @@ public class TargetDetails extends AbstractTableDetailsLayout { if (getSelectedBaseEntity() == null) { return; } - final Window newDistWindow = targetAddUpdateWindowLayout.getWindow(); targetAddUpdateWindowLayout.populateValuesOfTarget(getSelectedBaseEntity().getControllerId()); + openWindow(); + } + + private void openWindow() { + final Window newDistWindow = targetAddUpdateWindowLayout.getWindow(); newDistWindow.setCaption(getI18n().get("caption.update.dist")); UI.getCurrent().addWindow(newDistWindow); newDistWindow.setVisible(Boolean.TRUE); 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 8bba7f2f2..765704da8 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,18 +88,14 @@ 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()); - setOriginalTagDesc(selectedTargetTag.getDescription()); if (null == selectedTargetTag.getColour()) { setTagColor(getColorPickerLayout().getDefaultColor(), ColorPickerConstants.DEFAULT_COLOR); - setSelectedColorOriginal(getColorPickerLayout().getDefaultColor()); } else { setTagColor(ColorPickerHelper.rgbToColorConverter(selectedTargetTag.getColour()), selectedTargetTag.getColour()); - setSelectedColorOriginal(ColorPickerHelper.rgbToColorConverter(selectedTargetTag.getColour())); } } } @@ -152,4 +148,9 @@ public class CreateUpdateTargetTagLayoutWindow extends AbstractCreateUpdateTagLa setOptionGroupDefaultValue(permChecker.hasCreateTargetPermission(), permChecker.hasUpdateTargetPermission()); } + @Override + protected String getWindowCaption() { + return i18n.get("caption.add.tag"); + } + } 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 18e06814a..071b9c749 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 @@ -10,9 +10,7 @@ package org.eclipse.hawkbit.ui.rollout.rollout; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.DistributionSetManagement; @@ -34,6 +32,7 @@ import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.DistributionSetIdName; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.filtermanagement.TargetFilterBeanQuery; import org.eclipse.hawkbit.ui.management.footer.ActionTypeOptionGroupLayout; import org.eclipse.hawkbit.ui.management.footer.ActionTypeOptionGroupLayout.ActionTypeOption; @@ -61,7 +60,6 @@ import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Validator; import com.vaadin.data.validator.IntegerRangeValidator; import com.vaadin.data.validator.RegexpValidator; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; @@ -175,24 +173,12 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { public CommonDialogWindow getWindow() { - window = SPUIComponentProvider.getWindow(i18n.get("caption.configure.rollout"), null, + window = SPUIWindowDecorator.getWindow(i18n.get("caption.configure.rollout"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onRolloutSave(), event -> onDiscard(), - uiProperties.getLinks().getDocumentation().getRolloutView(), getMandatoryFields(), getEditedFields(), - i18n); + uiProperties.getLinks().getDocumentation().getRolloutView(), this, i18n); return window; } - private Map getMandatoryFields() { - final Map requiredFields = new HashMap<>(); - 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; - } - /** * Reset the field values. */ @@ -212,10 +198,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { actionTypeOptionGroupLayout.selectDefaultOption(); totalTargetsCount = 0L; rolloutForEdit = null; - - if (window != null) { - window.reset(); - } } private void resetFields() { @@ -303,15 +285,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { totalTargetsLabel = createTotalTargetsLabel(); targetFilterQuery = createTargetFilterQuery(); actionTypeOptionGroupLayout.addStyleName(SPUIStyleDefinitions.ROLLOUT_ACTION_TYPE_LAYOUT); - actionTypeOptionGroupLayout.getActionTypeOptionGroup() - .addValueChangeListener(this::listenerActionGroupValueChanged); - } - - private void listenerActionGroupValueChanged(final ValueChangeEvent event) { - if (window != null) { - window.checkMandatoryEditedValue(event, actionTypeOptionGroupLayout.getActionTypeOptionGroup(), - originalActionGroup.toString()); - } } private Label createGroupSizeLabel() { @@ -331,16 +304,9 @@ 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"); @@ -397,8 +363,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { totalTargetsLabel.setVisible(false); } onGroupNumberChange(event); - window.setRequiredFieldWhenUpdate(event, targetFilterQueryCombo); - window.checkMandatoryEditedValue(event, targetFilterQueryCombo, originalTargetFilterQueryCombo); } private String getTotalTargetMessage() { @@ -604,62 +568,27 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { descriptionField.setId(SPUIComponentIdProvider.ROLLOUT_DESCRIPTION_ID); descriptionField.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY); descriptionField.setSizeUndefined(); - descriptionField.addTextChangeListener(this::listenerDescriptionTextFieldChanged); return descriptionField; } - private void listenerDescriptionTextFieldChanged(final TextChangeEvent event) { - if (window != null) { - window.checkMandatoryEditedTextField(event, originalDescription); - } - } - private TextField createErrorThreshold() { final TextField errorField = getTextfield("prompt.error.threshold"); errorField.addValidator(new ThresholdFieldValidator()); errorField.setId(SPUIComponentIdProvider.ROLLOUT_ERROR_THRESOLD_ID); 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) { - window.checkMandatoryEditedTextField(event, originalErrorThreshold); - } - } - - private void listenerErrorThresholdValueChanged(final ValueChangeEvent event, final TextField errorField) { - if (window != null) { - window.setRequiredFieldWhenUpdate(event, errorField); - } - } - private TextField createTriggerThreshold() { final TextField thresholdField = getTextfield("prompt.tigger.threshold"); thresholdField.setId(SPUIComponentIdProvider.ROLLOUT_TRIGGER_THRESOLD_ID); thresholdField.addValidator(new ThresholdFieldValidator()); 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) { - window.checkMandatoryEditedTextField(event, originalTriggerThreshold); - } - } - private TextField createNoOfGroupsField() { final TextField noOfGroupsField = getTextfield("prompt.number.of.groups"); noOfGroupsField.setId(SPUIComponentIdProvider.ROLLOUT_NO_OF_GROUPS_ID); @@ -667,16 +596,9 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroupsField.setSizeUndefined(); noOfGroupsField.setMaxLength(3); noOfGroupsField.addValueChangeListener(this::onGroupNumberChange); - noOfGroupsField.addTextChangeListener(this::listenerNoOfGroupsTextFieldChanged); return noOfGroupsField; } - private void listenerNoOfGroupsTextFieldChanged(final TextChangeEvent event) { - if (window != null) { - window.checkMandatoryEditedTextField(event, originalNoOfGroups); - } - } - private void onGroupNumberChange(final ValueChangeEvent event) { if (noOfGroups.isValid() && !Strings.isNullOrEmpty(noOfGroups.getValue())) { groupSizeLabel.setValue(getTargetPerGroupMessage(String.valueOf(getGroupSize()))); @@ -684,9 +606,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } else { groupSizeLabel.setVisible(false); } - if (window != null) { - window.setRequiredFieldWhenUpdate(event, noOfGroups); - } } private ComboBox createDistributionSetCombo() { @@ -697,16 +616,9 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { dsSet.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); dsSet.setId(SPUIComponentIdProvider.ROLLOUT_DS_ID); dsSet.setSizeUndefined(); - dsSet.addValueChangeListener(this::listenerDistributionSetChanged); return dsSet; } - private void listenerDistributionSetChanged(final ValueChangeEvent event) { - if (window != null) { - window.checkMandatoryEditedValue(event, distributionSet, originalDistributionSet); - } - } - private void populateDistributionSet() { final Container container = createDsComboContainer(); distributionSet.setContainerDataSource(container); @@ -724,23 +636,9 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { final TextField rolloutNameField = getTextfield("textfield.name"); 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) { - window.checkMandatoryEditedTextField(event, originalRolloutName); - } - } - - private void listenerRolloutNameValueChanged(final ValueChangeEvent event, final TextField rolloutNameField) { - if (window != null) { - window.setRequiredFieldWhenUpdate(event, rolloutNameField); - } - } - private String getRolloutName() { return HawkbitCommonUtil.trimAndNullIfEmpty(rolloutName.getValue()); } @@ -870,19 +768,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } } - private Map getEditedFields() { - final Map changeMap = new HashMap<>(); - 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; - } - private void disableRequiredFieldsOnEdit() { distributionSet.setEnabled(false); errorThreshold.setEnabled(false); 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 b40c3d93d..97bd4bd35 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 @@ -431,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.getWindow(); addTargetWindow.setCaption(i18n.get("caption.update.rollout")); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/CommonDialogWindowHelper.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/CommonDialogWindowHelper.java new file mode 100644 index 000000000..c906a87dd --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/CommonDialogWindowHelper.java @@ -0,0 +1,32 @@ +package org.eclipse.hawkbit.ui.utils; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.vaadin.ui.AbstractField; +import com.vaadin.ui.Component; +import com.vaadin.ui.FormLayout; + +public class CommonDialogWindowHelper { + + /** + * Run through a FormLayout and collect all required Component's IDs in a + * Map + * + * @param formLayout + * Form to be analysed + * @return Map with all required component's IDs + */ + public static Map getMandatoryFields(final FormLayout formLayout) { + 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.getId(), Boolean.FALSE); + } + } + return requiredFields; + } +}