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 a9baad65b..43ccbe36f 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 @@ -193,7 +193,7 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se oldVendorValue = null; if (window != null) { - window.resetRequiredFieldsValues(); + window.resetMandatoryAndEditedFields(); } } @@ -223,7 +223,7 @@ 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)); + getMandatoryFields(formLayout), null); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); nameTextField.focus(); } 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 8578ad2a4..9a87c625d 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 @@ -132,7 +132,8 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout public void createWindow() { reset(); window = SPUIComponentProvider.getWindow(i18n.get("caption.add.type"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields()); + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields(), + getEditedFields()); } private Map getMandatoryFields() { 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 4388ee98a..142cd3998 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 @@ -74,6 +74,8 @@ public class CommonDialogWindow extends Window implements Serializable { private Map requiredFields; + private final Map editedFields; + @Autowired private I18N i18n; @@ -93,7 +95,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 Map requiredFields) { + final Map requiredFields, final Map editedFields) { checkNotNull(saveButtonClickListener); checkNotNull(cancelButtonClickListener); this.caption = caption; @@ -102,6 +104,7 @@ public class CommonDialogWindow extends Window implements Serializable { this.saveButtonClickListener = saveButtonClickListener; this.cancelButtonClickListener = cancelButtonClickListener; this.requiredFields = requiredFields; + this.editedFields = editedFields; init(); } @@ -110,32 +113,32 @@ public class CommonDialogWindow extends Window implements Serializable { if (StringUtils.isNotBlank(event.getText())) { if (StringUtils.isNotBlank(textfield.getCaption())) { - getRequiredFields().put(textfield.getCaption(), Boolean.TRUE); + requiredFields.put(textfield.getCaption(), Boolean.TRUE); } getRequiredFields().put(textfield.getId(), Boolean.TRUE); } else { if (StringUtils.isNotBlank(textfield.getCaption())) { - getRequiredFields().put(textfield.getCaption(), Boolean.FALSE); + requiredFields.put(textfield.getCaption(), Boolean.FALSE); } - getRequiredFields().put(textfield.getId(), Boolean.FALSE); + requiredFields.put(textfield.getId(), Boolean.FALSE); } - checkMandatoryFields(); + checkMandatoryFieldsFilled(); } public void checkMandatoryComboBox(final ValueChangeEvent event, final AbstractSelect select) { if (event.getProperty().getValue() != null) { if (StringUtils.isNotBlank(select.getCaption())) { - getRequiredFields().put(select.getCaption(), Boolean.TRUE); + requiredFields.put(select.getCaption(), Boolean.TRUE); } - getRequiredFields().put(select.getId(), Boolean.TRUE); + requiredFields.put(select.getId(), Boolean.TRUE); } else { if (StringUtils.isNotBlank(select.getCaption())) { - getRequiredFields().put(select.getCaption(), Boolean.FALSE); + requiredFields.put(select.getCaption(), Boolean.FALSE); } - getRequiredFields().put(select.getId(), Boolean.FALSE); + requiredFields.put(select.getId(), Boolean.FALSE); } - checkMandatoryFields(); + checkMandatoryFieldsFilled(); } /** @@ -143,7 +146,7 @@ public class CommonDialogWindow extends Window implements Serializable { * mandatory fields are filled the save button is enabled. Otherwise the * save button is disabled. */ - private void checkMandatoryFields() { + private void checkMandatoryFieldsFilled() { for (final Map.Entry entry : requiredFields.entrySet()) { if (entry.getValue() == null || entry.getValue().equals(Boolean.FALSE)) { @@ -154,35 +157,56 @@ public class CommonDialogWindow extends Window implements Serializable { saveButton.setEnabled(true); } - public void updateRequiredFields(final String fieldId, final Boolean filled) { + private void checkExistsChanges() { - getRequiredFields().put(fieldId, filled); - checkMandatoryFields(); + 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 checkChanges(final String newText, final String oldText) { + 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))) { - saveButton.setEnabled(true); + editedFields.put(fieldName, Boolean.TRUE); } else { - saveButton.setEnabled(false); + editedFields.put(fieldName, Boolean.FALSE); } + checkExistsChanges(); } - public void checkColorChange(final Color newColor, final Color oldColor) { + public void checkColorChange(final String fieldName, final Color newColor, final Color oldColor) { if (newColor.equals(oldColor)) { - setSaveButtonEnabled(false); + editedFields.put(fieldName, Boolean.FALSE); } else { - setSaveButtonEnabled(true); + editedFields.put(fieldName, Boolean.TRUE); } + checkExistsChanges(); } - public void resetRequiredFieldsValues() { - // Reset mandatory fields are filled marker - if (getRequiredFields() != null) { - for (final Map.Entry entry : getRequiredFields().entrySet()) { + 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); } } 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 3ba71fce5..ffc0de8ee 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 @@ -154,9 +154,9 @@ public final class SPUIComponentProvider { 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 Map requiredFields) { + final Map requiredFields, final Map editedFields) { return SPUIWindowDecorator.getDeocratedWindow(caption, id, type, content, saveButtonClickListener, - cancelButtonClickListener, helpLink, requiredFields); + cancelButtonClickListener, helpLink, requiredFields, editedFields); } /** 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 f9ce37158..b627851db 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 @@ -47,10 +47,10 @@ public final class SPUIWindowDecorator { public static CommonDialogWindow getDeocratedWindow(final String caption, final String id, final String type, final Component content, final ClickListener saveButtonClickListener, final ClickListener cancelButtonClickListener, final String helpLink, - final Map requiredFields) { + final Map requiredFields, final Map editedFields) { final CommonDialogWindow window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener, - cancelButtonClickListener, requiredFields); + cancelButtonClickListener, requiredFields, editedFields); 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 4b97ce7dd..b71eaac23 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 @@ -677,7 +677,8 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout public void createWindow() { reset(); window = SPUIComponentProvider.getWindow(i18n.get("caption.add.type"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields()); + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields(), + getEditedFields()); } private Map getMandatoryFields() { 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 720f61cff..f7a067bfd 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 @@ -115,8 +115,9 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected void createWindow() { reset(); - setWindow(SPUIComponentProvider.getWindow(i18n.get("caption.add.tag"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null, getMandatoryFields())); + setWindow( + SPUIComponentProvider.getWindow(i18n.get("caption.add.tag"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, + this, this::save, this::discard, null, getMandatoryFields(), getEditedFields())); } private Map getMandatoryFields() { @@ -131,6 +132,13 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent return requiredFields; } + protected Map getEditedFields() { + final Map changeMap = new HashMap<>(); + changeMap.put(tagDesc.getCaption(), Boolean.FALSE); + changeMap.put(colorPickerLayout.getId(), Boolean.FALSE); + return changeMap; + } + /** * Save new tag / update new tag. * @@ -213,7 +221,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected void listenerTagDescTextAreaChanged(final TextChangeEvent event) { - window.checkChanges(event.getText(), tagDescOriginal); + window.checkChanges(tagDesc.getCaption(), event.getText(), tagDescOriginal); } protected void buildLayout() { @@ -375,7 +383,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagPreviewBtnClicked = false; if (window != null) { - window.resetRequiredFieldsValues(); + window.resetMandatoryAndEditedFields(); } } @@ -466,7 +474,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent colorPickerLayout.getColorSelect().setColor(colorPickerLayout.getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getSelectedColor(), selectedColorOriginal); + window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), selectedColorOriginal); } protected void closeWindow() { 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 f2ef71af1..ea77d885b 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 @@ -186,7 +186,7 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { createDynamicStyleForComponents(tagName, typeKey, tagDesc, colorPickedPreview); getColorPickerLayout().getColorSelect().setColor(getColorPickerLayout().getSelPreview().getColor()); } - window.checkColorChange(colorPickerLayout.getSelectedColor(), selectedColorOriginal); + window.checkColorChange(colorPickerLayout.getId(), colorPickerLayout.getSelectedColor(), selectedColorOriginal); } /** @@ -206,6 +206,7 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { protected void createOptionGroup(final boolean hasCreatePermission, final boolean hasUpdatePermission) { optiongroup = new OptionGroup("Select Action"); + optiongroup.setId(SPUIComponentIdProvider.OPTION_GROUP); optiongroup.addStyleName(ValoTheme.OPTIONGROUP_SMALL); optiongroup.addStyleName("custom-option-group"); optiongroup.setNullSelectionAllowed(false); 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 82cf2390c..4a6a29e93 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 @@ -179,11 +179,15 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { } private void listenerDistNameTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, distNameTextField); + if (!editDistribution) { + window.checkMandatoryTextField(event, distNameTextField); + } } private void listenerDistVersionTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, distVersionTextField); + if (!editDistribution) { + window.checkMandatoryTextField(event, distVersionTextField); + } } /** @@ -410,7 +414,7 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { changedComponents.clear(); if (window != null) { - window.resetRequiredFieldsValues(); + window.resetMandatoryAndEditedFields(); } } @@ -519,9 +523,8 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { resetComponents(); window = SPUIComponentProvider.getWindow(i18n.get("caption.add.new.dist"), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), event -> discardDistribution(), - null, getMandatoryFields()); + null, getMandatoryFields(), null); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); - return window; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java index de0938e7e..bc27e7aa3 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java @@ -17,6 +17,7 @@ import javax.annotation.PostConstruct; import org.eclipse.hawkbit.repository.model.Action.ActionType; import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.hene.flexibleoptiongroup.FlexibleOptionGroup; import org.vaadin.hene.flexibleoptiongroup.FlexibleOptionGroupItemComponent; @@ -78,6 +79,7 @@ public class ActionTypeOptionGroupLayout extends HorizontalLayout { private void createOptionGroup() { actionTypeOptionGroup = new FlexibleOptionGroup(); + actionTypeOptionGroup.setId(SPUIComponentIdProvider.ROLLOUT_ACTION_BUTTON_ID); actionTypeOptionGroup.addItem(ActionTypeOption.SOFT); actionTypeOptionGroup.addItem(ActionTypeOption.FORCED); actionTypeOptionGroup.addItem(ActionTypeOption.AUTO_FORCED); 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 9bd3972f0..8ea8665d6 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 @@ -244,7 +244,7 @@ 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()); + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), event -> discardTargetListner(), null, getMandatoryFields(), null); return window; } @@ -259,7 +259,7 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { } return requiredFields; } - + /** * clear all fields of Target Edit Window. */ @@ -274,7 +274,7 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { editTarget = Boolean.FALSE; if (window != null) { - window.resetRequiredFieldsValues(); + window.resetMandatoryAndEditedFields(); } } 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 2e419724b..566ac4528 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 @@ -150,26 +150,47 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private TextArea targetFilterQuery; + private Boolean updateMode = Boolean.FALSE; + + private String distributionSetOriginal; + + private Object actionGroupOriginal; + + private String rolloutNameOriginal; + + private String errorThresholdOriginal;; + + private String triggerThresholdOriginal; + + private String descriptionOriginal; + /** * Create components and layout. */ public void init() { - setSizeUndefined(); createRequiredComponents(); buildLayout(); } 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()); + uiProperties.getLinks().getDocumentation().getRolloutView(), getMandatoryFields(), getEditedFields()); return window; } - private Map getMandatoryFields() { + 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); @@ -195,16 +216,14 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { setDefaultSaveStartGroupOption(); totalTargetsLabel.setVisible(false); groupSizeLabel.setVisible(false); - removeComponent(targetFilterQuery); - if (getComponent(1, 3) == null) { - addComponent(targetFilterQueryCombo, 1, 3); - } + removeComponent(1, 2); + addComponent(targetFilterQueryCombo, 1, 2); actionTypeOptionGroupLayout.selectDefaultOption(); totalTargetsCount = 0L; rolloutForEdit = null; if (window != null) { - window.resetRequiredFieldsValues(); + window.resetMandatoryAndEditedFields(); } } @@ -284,7 +303,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroups = createNoOfGroupsField(); groupSizeLabel = createGroupSizeLabel(); - triggerThreshold = createTriggerThresold(); + triggerThreshold = createTriggerThreshold(); errorThreshold = createErrorThreshold(); description = createDescription(); errorThresholdOptionGroup = createErrorThresholdOptionGroup(); @@ -293,6 +312,20 @@ 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) { + if (!updateMode) { + window.checkMandatoryComboBox(event, actionTypeOptionGroupLayout.getActionTypeOptionGroup()); + } + if (event.getProperty().getValue() != null) { + window.checkChanges(actionTypeOptionGroupLayout.getActionTypeOptionGroup().getId(), + event.getProperty().getValue().toString(), actionGroupOriginal.toString()); + } + } } private Label createGroupSizeLabel() { @@ -578,9 +611,20 @@ 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) { + if (!updateMode) { + window.checkMandatoryTextField(event, description); + return; + } + window.checkChanges(description.getId(), event.getText(), descriptionOriginal); + } + } + private TextField createErrorThreshold() { final TextField errorField = getTextfield("prompt.error.threshold"); errorField.addValidator(new ThresholdFieldValidator()); @@ -592,11 +636,16 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void listenerErrorThresholdTextFieldChanged(final TextChangeEvent event) { - - window.checkMandatoryTextField(event, errorThreshold); + if (window != null) { + if (!updateMode) { + window.checkMandatoryTextField(event, errorThreshold); + return; + } + window.checkChanges(errorThreshold.getId(), event.getText(), errorThresholdOriginal); + } } - private TextField createTriggerThresold() { + private TextField createTriggerThreshold() { final TextField thresholdField = getTextfield("prompt.tigger.threshold"); thresholdField.setId(SPUIComponentIdProvider.ROLLOUT_TRIGGER_THRESOLD_ID); thresholdField.addValidator(new ThresholdFieldValidator()); @@ -607,7 +656,13 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void listenerTriggerThresholdTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, triggerThreshold); + if (window != null) { + if (!updateMode) { + window.checkMandatoryTextField(event, triggerThreshold); + return; + } + window.checkChanges(triggerThreshold.getId(), event.getText(), triggerThresholdOriginal); + } } private TextField createNoOfGroupsField() { @@ -622,7 +677,13 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void listenerNoOfGroupsTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, noOfGroups); + if (window != null) { + if (!updateMode) { + window.checkMandatoryTextField(event, noOfGroups); + return; + } + window.checkChanges(noOfGroups.getId(), event.getText(), noOfGroups.getValue()); + } } private void onGroupNumberChange() { @@ -647,7 +708,16 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void listenerDistributionSetChanged(final ValueChangeEvent event) { - window.checkMandatoryComboBox(event, distributionSet); + if (window != null) { + if (!updateMode) { + window.checkMandatoryComboBox(event, distributionSet); + return; + } + if (event.getProperty().getValue() != null) { + window.checkChanges(distributionSet.getId(), event.getProperty().getValue().toString(), + distributionSetOriginal); + } + } } private void populateDistributionSet() { @@ -673,7 +743,13 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void listenerRolloutNameTextFieldChanged(final TextChangeEvent event) { - window.checkMandatoryTextField(event, rolloutName); + if (window != null) { + if (!updateMode) { + window.checkMandatoryTextField(event, rolloutName); + return; + } + window.checkChanges(rolloutName.getId(), event.getText(), rolloutNameOriginal); + } } private String getRolloutName() { @@ -691,7 +767,8 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { public void validate(final Object value) { try { if (HawkbitCommonUtil.trimAndNullIfEmpty(noOfGroups.getValue()) == null - || HawkbitCommonUtil.trimAndNullIfEmpty((String) targetFilterQueryCombo.getValue()) == null) { + || (HawkbitCommonUtil.trimAndNullIfEmpty((String) targetFilterQueryCombo.getValue()) == null + && targetFilterQuery.getValue() == null)) { uiNotification .displayValidationError(i18n.get("message.rollout.noofgroups.or.targetfilter.missing")); } else { @@ -781,12 +858,42 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroups.setEnabled(false); targetFilterQuery.setValue(rolloutForEdit.getTargetFilterQuery()); - removeComponent(targetFilterQueryCombo); - addComponent(targetFilterQuery, 1, 3); + removeComponent(1, 2); + addComponent(targetFilterQuery, 1, 2); totalTargetsCount = targetManagement.countTargetByTargetFilterQuery(rolloutForEdit.getTargetFilterQuery()); totalTargetsLabel.setValue(getTotalTargetMessage()); totalTargetsLabel.setVisible(true); + + setOriginalValues(); + } + + private void setOriginalValues() { + distributionSetOriginal = distributionSet.getValue().toString(); + actionGroupOriginal = actionTypeOptionGroupLayout.getActionTypeOptionGroup().getValue(); + rolloutNameOriginal = rolloutName.getValue(); + triggerThresholdOriginal = triggerThreshold.getValue(); + errorThresholdOriginal = errorThreshold.getValue(); + descriptionOriginal = description.getValue(); + } + + 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); + } + return changeMap; } private void disableRequiredFieldsOnEdit() { @@ -852,7 +959,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { public String getValue() { return value; } - } enum ERRORTHRESOLDOPTIONS { @@ -870,6 +976,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { public String getValue() { return value; } - } + } 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 20c2ca710..d3b17da5f 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 @@ -28,6 +28,7 @@ import org.eclipse.hawkbit.repository.model.Rollout; import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus; +import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.grid.AbstractGrid; import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData; import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer; @@ -62,7 +63,6 @@ import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.UI; -import com.vaadin.ui.Window; import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent; import com.vaadin.ui.renderers.HtmlRenderer; @@ -438,7 +438,7 @@ public class RolloutListGrid extends AbstractGrid { private void onUpdate(final ContextMenuData contextMenuData) { addUpdateRolloutWindow.populateData(contextMenuData.getRolloutId()); - final Window addTargetWindow = addUpdateRolloutWindow.getWindow(); + final CommonDialogWindow addTargetWindow = addUpdateRolloutWindow.createUpdateWindow(); 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/rollout/rollout/RolloutListHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java index 1a3d2d7a5..22c57740f 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.getWindow(); + final Window addTargetWindow = addUpdateRolloutWindow.createAddWindow(); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index 5b3ad793b..c18815b2b 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -468,10 +468,10 @@ rollout.group.label.target.truncated = {0} targets has been truncated in the lis prompt.number.of.groups = Number of groups prompt.tigger.threshold = Trigger threshold prompt.error.threshold = Error threshold -prompt.distribution.set = Distribution set +prompt.distribution.set = Distribution Set caption.configure.rollout = Configure Rollout caption.update.rollout = Update Rollout -prompt.target.filter = Custom target filter +prompt.target.filter = Custom Target Filter message.rollout.nonzero.group.number = Number of groups must be greater than zero message.rollout.max.group.number = Number of groups must not be greater than 500 message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists. diff --git a/hawkbit-ui/src/main/resources/messages_de.properties b/hawkbit-ui/src/main/resources/messages_de.properties index 2ac5ed9c2..2eab56ffa 100644 --- a/hawkbit-ui/src/main/resources/messages_de.properties +++ b/hawkbit-ui/src/main/resources/messages_de.properties @@ -436,7 +436,7 @@ header.rolloutgroup.target.message = Messages rollout.group.label.target.truncated = {0} targets has been truncated in the list due the target size limit of {1} -distribution.details.header = Distribution set +distribution.details.header = Distribution Set target.details.header = Target header.caption.mandatory = Mandatory header.caption.typename = SoftwareModuleType @@ -461,7 +461,7 @@ prompt.error.threshold = Error threshold prompt.distribution.set = Distribution Set caption.configure.rollout = Configure Rollout caption.update.rollout = Update Rollout -prompt.target.filter = Custom target filter +prompt.target.filter = Custom Target Filter message.rollout.nonzero.group.number = Number of groups must be greater than zero message.rollout.max.group.number = Number of groups must not be greater than 500 message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists. diff --git a/hawkbit-ui/src/main/resources/messages_en.properties b/hawkbit-ui/src/main/resources/messages_en.properties index 459695844..b1a6bb970 100644 --- a/hawkbit-ui/src/main/resources/messages_en.properties +++ b/hawkbit-ui/src/main/resources/messages_en.properties @@ -448,10 +448,10 @@ menu.title = Software Provisioning prompt.number.of.groups = Number of groups prompt.tigger.threshold = Trigger threshold prompt.error.threshold = Error threshold -prompt.distribution.set = Distribution set +prompt.distribution.set = Distribution Set caption.configure.rollout = Configure Rollout caption.update.rollout = Update Rollout -prompt.target.filter = Custom target filter +prompt.target.filter = Custom Target Filter message.rollout.nonzero.group.number = Number of groups must be greater than zero message.rollout.max.group.number = Number of groups must not be greater than 500 message.rollout.duplicate.check = Rollout [ {0} ] must be unique, entered value already exists.