diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java index 50127e227..b561667a9 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareManagement.java @@ -132,7 +132,7 @@ public class JpaSoftwareManagement implements SoftwareManagement { final JpaSoftwareModuleType type = softwareModuleTypeRepository.findOne(sm.getId()); boolean updated = false; - if (sm.getDescription() != null && !sm.getDescription().equals(type.getDescription())) { + if (sm.getDescription() == null || !sm.getDescription().equals(type.getDescription())) { type.setDescription(sm.getDescription()); updated = true; } diff --git a/hawkbit-ui/pom.xml b/hawkbit-ui/pom.xml index 08d225c62..b90e36e88 100644 --- a/hawkbit-ui/pom.xml +++ b/hawkbit-ui/pom.xml @@ -200,6 +200,10 @@ org.springframework.security spring-security-web + + org.apache.commons + commons-collections4 + com.vaadin 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 6a5a07a40..c8eb74313 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 @@ -10,6 +10,8 @@ package org.eclipse.hawkbit.ui.artifacts.smtable; import java.io.Serializable; +import javax.annotation.PostConstruct; + import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.SoftwareModule; @@ -18,18 +20,17 @@ 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; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; -import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UINotification; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; import org.vaadin.spring.events.EventBus; -import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.ComboBox; @@ -38,8 +39,6 @@ import com.vaadin.ui.FormLayout; import com.vaadin.ui.Label; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; -import com.vaadin.ui.UI; -import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; /** @@ -66,8 +65,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se @Autowired private transient EntityFactory entityFactory; - private Label mandatoryLabel; - private TextField nameTextField; private TextField versionTextField; @@ -80,14 +77,20 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se private CommonDialogWindow window; - private String oldDescriptionValue; - - private String oldVendorValue; - private Boolean editSwModule = Boolean.FALSE; private Long baseSwModuleId; + private FormLayout formLayout; + + /** + * Initialize Distribution Add and Edit Window. + */ + @PostConstruct + void init() { + createRequiredComponents(); + } + /** * Create window for new software module. * @@ -95,11 +98,7 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se * module. */ public CommonDialogWindow createAddSoftwareModuleWindow() { - - editSwModule = Boolean.FALSE; - createRequiredComponents(); - createWindow(); - return window; + return createUpdateSoftwareModuleWindow(null); } /** @@ -110,17 +109,11 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se * @return reference of {@link com.vaadin.ui.Window} to update software * module. */ - public Window createUpdateSoftwareModuleWindow(final Long baseSwModuleId) { - - editSwModule = Boolean.TRUE; + public CommonDialogWindow createUpdateSoftwareModuleWindow(final Long baseSwModuleId) { this.baseSwModuleId = baseSwModuleId; - createRequiredComponents(); - createWindow(); - /* populate selected target values to edit. */ + resetComponents(); populateValuesOfSwModule(); - nameTextField.setEnabled(false); - versionTextField.setEnabled(false); - typeComboBox.setEnabled(false); + createWindow(); return window; } @@ -145,13 +138,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.ADD_SW_MODULE_DESCRIPTION); - addDescriptionTextChangeListener(); - addVendorTextChangeListener(); - - /* Label for mandatory symbol */ - mandatoryLabel = new Label(i18n.get("label.mandatory.field")); - mandatoryLabel.setStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - mandatoryLabel.addStyleName(ValoTheme.LABEL_SMALL); typeComboBox = SPUIComponentProvider.getComboBox(i18n.get("upload.swmodule.type"), "", "", null, null, true, null, i18n.get("upload.swmodule.type")); @@ -159,46 +145,34 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se typeComboBox.setStyleName(SPUIDefinitions.COMBO_BOX_SPECIFIC_STYLE + " " + ValoTheme.COMBOBOX_TINY); typeComboBox.setNewItemsAllowed(Boolean.FALSE); typeComboBox.setImmediate(Boolean.TRUE); - populateTypeNameCombo(); - - resetOldValues(); } - /** - * - */ private void populateTypeNameCombo() { typeComboBox.setContainerDataSource(HawkbitCommonUtil.createLazyQueryContainer( new BeanQueryFactory(SoftwareModuleTypeBeanQuery.class))); typeComboBox.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); - } - private void resetOldValues() { - oldDescriptionValue = null; - oldVendorValue = null; + private void resetComponents() { + + vendorTextField.clear(); + nameTextField.clear(); + versionTextField.clear(); + descTextArea.clear(); + typeComboBox.clear(); + editSwModule = Boolean.FALSE; } - /** - * Build the window content and get an instance of customDialogWindow - * - */ private void createWindow() { - 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(); - final FormLayout formLayout = new FormLayout(); - formLayout.addComponent(mandatoryLabel); + formLayout = new FormLayout(); + formLayout.setCaption(null); formLayout.addComponent(typeComboBox); formLayout.addComponent(nameTextField); formLayout.addComponent(versionTextField); @@ -207,24 +181,17 @@ 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, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveOrUpdate(), event -> closeThisWindow(), null); + window = SPUIWindowDecorator.getWindow(i18n.get("upload.caption.add.new.swmodule"), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveOrUpdate(), null, null, formLayout, i18n); window.getButtonsLayout().removeStyleName("actionButtonsMargin"); - nameTextField.focus(); + + nameTextField.setEnabled(!editSwModule); + versionTextField.setEnabled(!editSwModule); + typeComboBox.setEnabled(!editSwModule); + + typeComboBox.focus(); } - private void addDescriptionTextChangeListener() { - descTextArea.addTextChangeListener(event -> window.setSaveButtonEnabled(hasDescriptionChanged(event))); - } - - private void addVendorTextChangeListener() { - vendorTextField.addTextChangeListener(event -> window.setSaveButtonEnabled(hasVendorChanged(event))); - } - - /** - * Add new SW module. - */ private void addNewBaseSoftware() { final String name = HawkbitCommonUtil.trimAndNullIfEmpty(nameTextField.getValue()); final String version = HawkbitCommonUtil.trimAndNullIfEmpty(versionTextField.getValue()); @@ -232,10 +199,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se final String description = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue()); final String type = typeComboBox.getValue() != null ? typeComboBox.getValue().toString() : null; - if (!mandatoryCheck(name, version, type)) { - return; - } - if (HawkbitCommonUtil.isDuplicate(name, version, type)) { uiNotifcation.displayValidationError( i18n.get("message.duplicate.softwaremodule", new Object[] { name, version })); @@ -248,8 +211,6 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se new Object[] { newBaseSoftwareModule.getName() + ":" + newBaseSoftwareModule.getVersion() })); eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.NEW_ENTITY, newBaseSoftwareModule)); } - // close the window - closeThisWindow(); } } @@ -269,13 +230,16 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.UPDATED_ENTITY, newSWModule)); } - closeThisWindow(); } /** * fill the data of a softwareModule in the content of the window */ private void populateValuesOfSwModule() { + if (baseSwModuleId == null) { + return; + } + editSwModule = Boolean.TRUE; final SoftwareModule swModle = softwareManagement.findSoftwareModuleById(baseSwModuleId); nameTextField.setValue(swModle.getName()); versionTextField.setValue(swModle.getVersion()); @@ -283,49 +247,10 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getVendor())); descTextArea.setValue(swModle.getDescription() == null ? HawkbitCommonUtil.SP_STRING_EMPTY : HawkbitCommonUtil.trimAndNullIfEmpty(swModle.getDescription())); - oldDescriptionValue = descTextArea.getValue(); - oldVendorValue = vendorTextField.getValue(); if (swModle.getType().isDeleted()) { typeComboBox.addItem(swModle.getType().getName()); } typeComboBox.setValue(swModle.getType().getName()); - window.setSaveButtonEnabled(Boolean.FALSE); - } - - /** - * Method to close window. - */ - private void closeThisWindow() { - window.close(); - UI.getCurrent().removeWindow(window); - } - - /** - * Validation check - Mandatory. - * - * @param name - * as String - * @param version - * as version - * @return boolena as flag - */ - private boolean mandatoryCheck(final String name, final String version, final String type) { - boolean isValid = true; - if (name == null || version == null || type == null) { - if (name == null) { - nameTextField.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - } - if (version == null) { - versionTextField.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - } - if (type == null) { - typeComboBox.addStyleName(SPUIStyleDefinitions.SP_COMBOFIELD_ERROR); - } - - uiNotifcation.displayValidationError(i18n.get("message.mandatory.check")); - isValid = false; - } - return isValid; } private void saveOrUpdate() { @@ -336,12 +261,8 @@ public class SoftwareModuleAddUpdateWindow extends CustomComponent implements Se } } - private boolean hasDescriptionChanged(final TextChangeEvent event) { - return !(event.getText().equals(oldDescriptionValue) && vendorTextField.getValue().equals(oldVendorValue)); - } - - private boolean hasVendorChanged(final TextChangeEvent event) { - return !(event.getText().equals(oldVendorValue) && descTextArea.getValue().equals(oldDescriptionValue)); + public FormLayout getFormLayout() { + return formLayout; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java index 99fe185e5..56367f230 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java @@ -44,7 +44,6 @@ import com.vaadin.ui.UI; /** * Header of Software module table. - * */ @SpringComponent @ViewScope diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java index d6ecd70dd..ce7631c26 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 @@ -11,13 +11,11 @@ package org.eclipse.hawkbit.ui.artifacts.smtype; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum; -import org.eclipse.hawkbit.ui.colorpicker.ColorPickerConstants; import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper; import org.eclipse.hawkbit.ui.common.SoftwareModuleTypeBeanQuery; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; @@ -34,12 +32,10 @@ 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.Alignment; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Label; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.components.colorpicker.ColorChangeListener; -import com.vaadin.ui.components.colorpicker.ColorSelector; import com.vaadin.ui.themes.ValoTheme; /** @@ -48,8 +44,7 @@ import com.vaadin.ui.themes.ValoTheme; */ @SpringComponent @ViewScope -public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout - implements ColorChangeListener, ColorSelector { +public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout { private static final long serialVersionUID = -5169398523815919367L; private static final Logger LOG = LoggerFactory.getLogger(CreateUpdateSoftwareTypeLayout.class); @@ -69,7 +64,7 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout @Override protected void addListeners() { super.addListeners(); - optiongroup.addValueChangeListener(this::createOptionValueChanged); + optiongroup.addValueChangeListener(this::optionValueChanged); } @Override @@ -95,7 +90,6 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TYPE_DESC, false, "", i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); - tagDesc.setId(SPUIDefinitions.NEW_SOFTWARE_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); @@ -113,10 +107,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); + protected String getWindowCaption() { + return i18n.get("caption.add.type"); } /** @@ -126,15 +118,16 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout * ValueChangeEvent */ @Override - protected void createOptionValueChanged(final ValueChangeEvent event) { + protected void optionValueChanged(final ValueChangeEvent event) { - super.createOptionValueChanged(event); + super.optionValueChanged(event); if (updateTypeStr.equals(event.getProperty().getValue())) { assignOptiongroup.setEnabled(false); } else { assignOptiongroup.setEnabled(true); } + assignOptiongroup.select(singleAssignStr); } /** @@ -176,7 +169,6 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout } else { assignOptiongroup.setValue(singleAssignStr); } - setColorPickerComponentsColor(selectedTypeTag.getColour()); } } @@ -198,10 +190,6 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout @Override protected void save(final ClickEvent event) { - if (!mandatoryValuesPresent()) { - return; - } - final SoftwareModuleType existingSMTypeByKey = swTypeManagementService .findSoftwareModuleTypeByKey(typeKey.getValue()); final SoftwareModuleType existingSMTypeByName = swTypeManagementService @@ -211,7 +199,6 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout createNewSWModuleType(); } } else { - updateSWModuleType(existingSMTypeByName); } } @@ -233,22 +220,14 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout SoftwareModuleType newSWType = entityFactory.generateSoftwareModuleType(typeKeyValue, typeNameValue, typeDescValue, assignNumber); newSWType.setColour(colorPicked); - - if (null != typeDescValue) { - newSWType.setDescription(typeDescValue); - } - + newSWType.setDescription(typeDescValue); newSWType.setColour(colorPicked); - newSWType = swTypeManagementService.createSoftwareModuleType(newSWType); uiNotification.displaySuccess(i18n.get("message.save.success", new Object[] { newSWType.getName() })); - closeWindow(); eventBus.publish(this, new SoftwareModuleTypeEvent(SoftwareModuleTypeEnum.ADD_SOFTWARE_MODULE_TYPE, newSWType)); - } else { uiNotification.displayValidationError(i18n.get("message.error.missing.typenameorkey")); - } } @@ -258,51 +237,15 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout final String typeDescValue = HawkbitCommonUtil.trimAndNullIfEmpty(tagDesc.getValue()); if (null != typeNameValue) { existingType.setName(typeNameValue); - - existingType.setDescription(null != typeDescValue ? typeDescValue : null); - + existingType.setDescription(typeDescValue); existingType.setColour(ColorPickerHelper.getColorPickedString(getColorPickerLayout().getSelPreview())); swTypeManagementService.updateSoftwareModuleType(existingType); uiNotification.displaySuccess(i18n.get("message.update.success", new Object[] { existingType.getName() })); - closeWindow(); eventBus.publish(this, new SoftwareModuleTypeEvent(SoftwareModuleTypeEnum.UPDATE_SOFTWARE_MODULE_TYPE, existingType)); - } else { uiNotification.displayValidationError(i18n.get("message.tag.update.mandatory")); } - - } - - /** - * Open color picker on click of preview button. Auto select the color based - * on target tag if already selected. - */ - @Override - protected void previewButtonClicked() { - if (!tagPreviewBtnClicked) { - final String selectedOption = (String) optiongroup.getValue(); - if (StringUtils.isNotEmpty(selectedOption) && selectedOption.equalsIgnoreCase(updateTypeStr)) { - if (null != tagNameComboBox.getValue()) { - final SoftwareModuleType typeSelected = swTypeManagementService - .findSoftwareModuleTypeByName(tagNameComboBox.getValue().toString()); - if (null != typeSelected) { - getColorPickerLayout().setSelectedColor(typeSelected.getColour() != null - ? ColorPickerHelper.rgbToColorConverter(typeSelected.getColour()) - : ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - } - } else { - getColorPickerLayout().setSelectedColor( - ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - } - } - getColorPickerLayout().getSelPreview().setColor(getColorPickerLayout().getSelectedColor()); - mainLayout.addComponent(colorPickerLayout, 1, 0); - mainLayout.setComponentAlignment(colorPickerLayout, Alignment.MIDDLE_CENTER); - } else { - mainLayout.removeComponent(colorPickerLayout); - } - tagPreviewBtnClicked = !tagPreviewBtnClicked; } @Override diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/colorpicker/ColorPickerLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/colorpicker/ColorPickerLayout.java index 7d2046bd9..2c6191bc8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/colorpicker/ColorPickerLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/colorpicker/ColorPickerLayout.java @@ -13,6 +13,7 @@ import java.util.Set; import org.eclipse.hawkbit.ui.common.CoordinatesToColor; import org.eclipse.hawkbit.ui.management.tag.SpColorPickerPreview; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import com.vaadin.shared.ui.colorpicker.Color; import com.vaadin.ui.AbstractColorPicker.Coordinates2Color; @@ -47,6 +48,7 @@ public class ColorPickerLayout extends GridLayout { setColumns(2); setRows(4); + setId(SPUIComponentIdProvider.COLOR_PICKER_LAYOUT); init(); @@ -71,6 +73,7 @@ public class ColorPickerLayout extends GridLayout { colorSelect.setWidth("220px"); redSlider = createRGBSlider("", "red"); + redSlider.setId(SPUIComponentIdProvider.COLOR_PICKER_RED_SLIDER); greenSlider = createRGBSlider("", "green"); blueSlider = createRGBSlider("", "blue"); 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 29519f162..725ff4b9b 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 @@ -10,32 +10,69 @@ package org.eclipse.hawkbit.ui.common; import static com.google.common.base.Preconditions.checkNotNull; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +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.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleBorderWithIcon; +import org.eclipse.hawkbit.ui.layouts.AbstractCreateUpdateTagLayout; +import org.eclipse.hawkbit.ui.management.targettable.TargetAddUpdateWindowLayout; +import org.eclipse.hawkbit.ui.utils.I18N; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; +import org.vaadin.hene.flexibleoptiongroup.FlexibleOptionGroupItemComponent; +import com.google.common.base.Strings; +import com.google.common.collect.Sets; +import com.vaadin.data.Container.ItemSetChangeEvent; +import com.vaadin.data.Container.ItemSetChangeListener; +import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.data.validator.NullValidator; +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; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; +import com.vaadin.ui.Field; +import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; import com.vaadin.ui.Link; +import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; +import com.vaadin.ui.themes.ValoTheme; /** * - * 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 { +public class CommonDialogWindow extends Window implements Serializable { - private static final long serialVersionUID = -1321949234316858703L; + private static final long serialVersionUID = 1L; private final VerticalLayout mainLayout = new VerticalLayout(); @@ -57,6 +94,14 @@ public class CommonDialogWindow extends Window { private final ClickListener cancelButtonClickListener; + private final ClickListener close = event -> close(); + + private final Map orginalValues; + + private final List> allComponents; + + private final I18N i18n; + /** * Constructor. * @@ -72,28 +117,83 @@ public class CommonDialogWindow extends Window { * the cancelButtonClickListener */ public CommonDialogWindow(final String caption, final Component content, final String helpLink, - final ClickListener saveButtonClickListener, final ClickListener cancelButtonClickListener) { + final ClickListener saveButtonClickListener, final ClickListener cancelButtonClickListener, + final AbstractLayout layout, final I18N i18n) { checkNotNull(saveButtonClickListener); - checkNotNull(cancelButtonClickListener); this.caption = caption; this.content = content; this.helpLink = helpLink; this.saveButtonClickListener = saveButtonClickListener; this.cancelButtonClickListener = cancelButtonClickListener; - + this.orginalValues = new HashMap<>(); + this.allComponents = getAllComponents(layout); + this.i18n = i18n; init(); } + @Override + public void close() { + super.close(); + orginalValues.clear(); + removeListeners(); + allComponents.clear(); + this.saveButton.setEnabled(false); + } + + private void removeListeners() { + for (final AbstractField field : allComponents) { + removeTextListener(field); + removeValueChangeListener(field); + removeItemSetChangeistener(field); + } + } + + private void removeItemSetChangeistener(final AbstractField field) { + if (!(field instanceof Table)) { + return; + } + for (final Object listener : field.getListeners(ItemSetChangeEvent.class)) { + if (listener instanceof ChangeListener) { + ((Table) field).removeItemSetChangeListener((ChangeListener) listener); + } + } + } + + 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() { if (content instanceof AbstractOrderedLayout) { ((AbstractOrderedLayout) content).setSpacing(true); ((AbstractOrderedLayout) content).setMargin(true); } + if (content instanceof GridLayout) { + addStyleName("marginTop"); + } if (null != content) { mainLayout.addComponent(content); } + + createMandatoryLabel(); + final HorizontalLayout buttonLayout = createActionButtonsLayout(); mainLayout.addComponent(buttonLayout); mainLayout.setComponentAlignment(buttonLayout, Alignment.TOP_CENTER); @@ -104,6 +204,173 @@ public class CommonDialogWindow extends Window { center(); setModal(true); addStyleName("fontsize"); + setOrginaleValues(); + addListeners(); + } + + /** + * saves the original values in a Map so we can use them for detecting + * changes + */ + public final void setOrginaleValues() { + for (final AbstractField field : allComponents) { + Object value = field.getValue(); + + if (field instanceof Table) { + value = Sets.newHashSet(((Table) field).getContainerDataSource().getItemIds()); + } + orginalValues.put(field, value); + } + saveButton.setEnabled(isSaveButtonEnabledAfterValueChange(null, null)); + } + + private final void addListeners() { + for (final AbstractField field : allComponents) { + if (field instanceof TextChangeNotifier) { + ((TextChangeNotifier) field).addTextChangeListener(new ChangeListener(field)); + } + + if (field instanceof Table) { + ((Table) field).addItemSetChangeListener(new ChangeListener(field)); + } else { + field.addValueChangeListener(new ChangeListener(field)); + } + } + + saveButton.addClickListener(close); + cancelButton.addClickListener(close); + } + + private boolean isSaveButtonEnabledAfterValueChange(final Component currentChangedComponent, + final Object newValue) { + return isMandatoryFieldNotEmptyAndValid(currentChangedComponent, newValue) + && isValuesChanged(currentChangedComponent, newValue); + } + + private boolean isValuesChanged(final Component currentChangedComponent, final Object newValue) { + for (final AbstractField field : allComponents) { + Object originalValue = orginalValues.get(field); + if (field instanceof CheckBox && originalValue == null) { + originalValue = Boolean.FALSE; + } + final Object currentValue = getCurrentVaue(currentChangedComponent, newValue, field); + + if (!isValueEquals(field, originalValue, currentValue)) { + return true; + } + } + return false; + } + + private boolean isValueEquals(final AbstractField field, final Object orginalValue, final Object currentValue) { + if (Set.class.equals(field.getType())) { + return CollectionUtils.isEqualCollection(CollectionUtils.emptyIfNull((Collection) orginalValue), + CollectionUtils.emptyIfNull((Collection) currentValue)); + } + + if (String.class.equals(field.getType())) { + return Objects.equals(Strings.emptyToNull((String) orginalValue), + Strings.emptyToNull((String) currentValue)); + } + + return Objects.equals(orginalValue, currentValue); + } + + private Object getCurrentVaue(final Component currentChangedComponent, final Object newValue, + final AbstractField field) { + Object currentValue = field.getValue(); + if (field instanceof Table) { + currentValue = ((Table) field).getContainerDataSource().getItemIds(); + } + + if (field.equals(currentChangedComponent)) { + currentValue = newValue; + } + return currentValue; + } + + private boolean shouldMandatoryLabelShown() { + for (final AbstractField field : allComponents) { + if (field.isRequired()) { + return true; + } + } + + return false; + } + + private boolean isMandatoryFieldNotEmptyAndValid(final Component currentChangedComponent, final Object newValue) { + + boolean valid = true; + final List> requiredComponents = allComponents.stream().filter(field -> field.isRequired()) + .collect(Collectors.toList()); + + requiredComponents.addAll(allComponents.stream().filter(this::hasNullValidator).collect(Collectors.toList())); + + for (final AbstractField field : requiredComponents) { + Object value = getCurrentVaue(currentChangedComponent, newValue, field); + + if (String.class.equals(field.getType())) { + value = Strings.emptyToNull((String) value); + } + + if (Set.class.equals(field.getType())) { + value = emptyToNull((Collection) value); + } + + if (value == null) { + return false; + } + + // We need to loop through the entire loop for validity testing. + // Otherwise the UI will only mark the + // first field with errors and then stop. If there are several + // fields with errors, this is bad. + field.setValue(value); + if (!field.isValid()) { + valid = false; + } + } + + return valid; + } + + private static Object emptyToNull(final Collection c) { + return (c == null || c.isEmpty()) ? null : c; + } + + private boolean hasNullValidator(final Component component) { + + if (component instanceof AbstractField) { + final AbstractField fieldComponent = (AbstractField) component; + for (final Validator validator : fieldComponent.getValidators()) { + if (validator instanceof NullValidator) { + return true; + } + } + } + return false; + } + + private List> getAllComponents(final AbstractLayout abstractLayout) { + final List> components = new ArrayList<>(); + + final Iterator iterate = abstractLayout.iterator(); + while (iterate.hasNext()) { + final Component c = iterate.next(); + if (c instanceof AbstractLayout) { + components.addAll(getAllComponents((AbstractLayout) c)); + } + + if (c instanceof AbstractField) { + components.add((AbstractField) c); + } + + if (c instanceof FlexibleOptionGroupItemComponent) { + components.add(((FlexibleOptionGroupItemComponent) c).getOwner()); + } + } + return components; } private HorizontalLayout createActionButtonsLayout() { @@ -122,12 +389,34 @@ public class CommonDialogWindow extends Window { return buttonsLayout; } + private void createMandatoryLabel() { + + if (!shouldMandatoryLabelShown()) { + return; + } + + final Label mandatoryLabel = new Label(i18n.get("label.mandatory.field")); + mandatoryLabel.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_TINY); + + if (content instanceof TargetAddUpdateWindowLayout) { + ((TargetAddUpdateWindowLayout) content).getFormLayout().addComponent(mandatoryLabel); + } else if (content instanceof SoftwareModuleAddUpdateWindow) { + ((SoftwareModuleAddUpdateWindow) content).getFormLayout().addComponent(mandatoryLabel); + } else if (content instanceof AbstractCreateUpdateTagLayout) { + ((AbstractCreateUpdateTagLayout) content).getMainLayout().addComponent(mandatoryLabel); + } + + mainLayout.addComponent(mandatoryLabel); + } + private void createCancelButton() { cancelButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, "Cancel", "", "", true, FontAwesome.TIMES, SPUIButtonStyleBorderWithIcon.class); cancelButton.setSizeUndefined(); cancelButton.addStyleName("default-color"); - cancelButton.addClickListener(cancelButtonClickListener); + if (cancelButtonClickListener != null) { + cancelButton.addClickListener(cancelButtonClickListener); + } buttonsLayout.addComponent(cancelButton); buttonsLayout.setComponentAlignment(cancelButton, Alignment.MIDDLE_LEFT); @@ -140,6 +429,7 @@ public class CommonDialogWindow extends Window { saveButton.setSizeUndefined(); saveButton.addStyleName("default-color"); saveButton.addClickListener(saveButtonClickListener); + saveButton.setEnabled(false); buttonsLayout.addComponent(saveButton); buttonsLayout.setComponentAlignment(saveButton, Alignment.MIDDLE_RIGHT); buttonsLayout.setExpandRatio(saveButton, 1.0F); @@ -155,16 +445,52 @@ public class CommonDialogWindow extends Window { buttonsLayout.setComponentAlignment(helpLinkComponent, Alignment.MIDDLE_RIGHT); } - public void setSaveButtonEnabled(final boolean enabled) { - saveButton.setEnabled(enabled); + public AbstractComponent getButtonsLayout() { + return this.buttonsLayout; } - public void setCancelButtonEnabled(final boolean enabled) { - cancelButton.setEnabled(enabled); + private class ChangeListener implements ValueChangeListener, TextChangeListener, ItemSetChangeListener { + + 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())); + } + + @Override + public void containerItemSetChange(final ItemSetChangeEvent event) { + if (!(field instanceof Table)) { + return; + } + final Table table = (Table) field; + saveButton.setEnabled( + isSaveButtonEnabledAfterValueChange(table, table.getContainerDataSource().getItemIds())); + } } - public HorizontalLayout getButtonsLayout() { - return buttonsLayout; + /** + * Adds the component manually to the allComponents-List and adds a + * ValueChangeListener to it. Necessary in Update Distribution Type as the + * CheckBox concerned is an ItemProperty... + * + * @param component + * AbstractField + */ + public void updateAllComponents(final AbstractField component) { + + allComponents.add(component); + component.addValueChangeListener(new ChangeListener(component)); } } 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 170ea8dcc..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,10 +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.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Link; @@ -140,24 +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) { - return SPUIWindowDecorator.getDeocratedWindow(caption, id, type, content, saveButtonClickListener, - cancelButtonClickListener, helpLink); - } - /** * Get window component. * @@ -204,6 +183,8 @@ public final class SPUIComponentProvider { /** * Get Label UI component. * * + * @param caption + * set the caption of the textArea * @param style * set style * @param styleName 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 9f436fd65..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 @@ -9,9 +9,11 @@ package org.eclipse.hawkbit.ui.decorators; import org.eclipse.hawkbit.ui.common.CommonDialogWindow; +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.Window; @@ -42,12 +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 ClickListener cancelButtonClickListener, final String helpLink, final AbstractLayout layout, + final I18N i18n) { final CommonDialogWindow window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener, - cancelButtonClickListener); + 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 cf4c09def..2a12bc859 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 @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.ui.distributions.disttype; import java.util.List; +import java.util.Map; import java.util.Set; import org.eclipse.hawkbit.repository.DistributionSetManagement; @@ -16,7 +17,6 @@ import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; -import org.eclipse.hawkbit.ui.colorpicker.ColorPickerConstants; import org.eclipse.hawkbit.ui.colorpicker.ColorPickerHelper; import org.eclipse.hawkbit.ui.common.DistributionSetTypeBeanQuery; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; @@ -49,8 +49,6 @@ import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.components.colorpicker.ColorChangeListener; -import com.vaadin.ui.components.colorpicker.ColorSelector; import com.vaadin.ui.themes.ValoTheme; /** @@ -58,8 +56,7 @@ import com.vaadin.ui.themes.ValoTheme; */ @SpringComponent @ViewScope -public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout - implements ColorChangeListener, ColorSelector { +public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout { private static final long serialVersionUID = -5169398523815877767L; private static final Logger LOG = LoggerFactory.getLogger(CreateUpdateDistSetTypeLayout.class); @@ -82,8 +79,12 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private Table sourceTable; private Table selectedTable; - private IndexedContainer selectedTablecontainer; - private IndexedContainer sourceTablecontainer; + private IndexedContainer selectedTableContainer; + private IndexedContainer sourceTableContainer; + + private IndexedContainer originalSelectedTableContainer; + + private Map mandatoryCheckboxMap; @Override protected void createRequiredComponents() { @@ -103,7 +104,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.DIST_SET_TYPE_DESC, false, "", i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); - tagDesc.setId(SPUIDefinitions.NEW_DISTRIBUTION_TYPE_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); @@ -159,9 +159,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout return twinColumnLayout; } - /** - * - */ private void buildSelectedTable() { selectedTable = new Table(); @@ -176,13 +173,14 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout selectedTable.addStyleName("dist_type_twin-table"); selectedTable.setSizeFull(); createSelectedTableContainer(); - selectedTable.setContainerDataSource(selectedTablecontainer); + selectedTable.setContainerDataSource(selectedTableContainer); addTooltTipToSelectedTable(); 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() { @@ -218,14 +216,13 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout sourceTable.addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES); sourceTable.addStyleName(ValoTheme.TABLE_SMALL); sourceTable.setImmediate(true); - // sourceTable sourceTable.setSizeFull(); sourceTable.addStyleName("dist_type_twin-table"); sourceTable.setSortEnabled(false); - sourceTablecontainer = new IndexedContainer(); - sourceTablecontainer.addContainerProperty(DIST_TYPE_NAME, String.class, ""); - sourceTablecontainer.addContainerProperty(DIST_TYPE_DESCRIPTION, String.class, ""); - sourceTable.setContainerDataSource(sourceTablecontainer); + sourceTableContainer = new IndexedContainer(); + sourceTableContainer.addContainerProperty(DIST_TYPE_NAME, String.class, ""); + sourceTableContainer.addContainerProperty(DIST_TYPE_DESCRIPTION, String.class, ""); + sourceTable.setContainerDataSource(sourceTableContainer); sourceTable.setVisibleColumns(new Object[] { DIST_TYPE_NAME }); sourceTable.setColumnHeaders(i18n.get("header.dist.twintable.available")); @@ -237,20 +234,29 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private void createSelectedTableContainer() { - selectedTablecontainer = new IndexedContainer(); - selectedTablecontainer.addContainerProperty(DIST_TYPE_NAME, String.class, ""); - selectedTablecontainer.addContainerProperty(DIST_TYPE_DESCRIPTION, String.class, ""); - selectedTablecontainer.addContainerProperty(DIST_TYPE_MANDATORY, CheckBox.class, null); + selectedTableContainer = new IndexedContainer(); + selectedTableContainer.addContainerProperty(DIST_TYPE_NAME, String.class, ""); + selectedTableContainer.addContainerProperty(DIST_TYPE_DESCRIPTION, String.class, ""); + selectedTableContainer.addContainerProperty(DIST_TYPE_MANDATORY, CheckBox.class, null); + } + + private void createOriginalSelectedTableContainer() { + + originalSelectedTableContainer = new IndexedContainer(); + originalSelectedTableContainer.addContainerProperty(DIST_TYPE_NAME, String.class, ""); + originalSelectedTableContainer.addContainerProperty(DIST_TYPE_DESCRIPTION, String.class, ""); + originalSelectedTableContainer.addContainerProperty(DIST_TYPE_MANDATORY, CheckBox.class, null); } @SuppressWarnings("unchecked") private void addSMType() { final Set selectedIds = (Set) sourceTable.getValue(); - if (null != selectedIds && !selectedIds.isEmpty()) { - for (final Long id : selectedIds) { - addTargetTableData(id); - } + if (selectedIds == null) { + return; + } + for (final Long id : selectedIds) { + addTargetTableData(id); } } @@ -258,23 +264,24 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout @SuppressWarnings("unchecked") final Set selectedIds = (Set) selectedTable.getValue(); - if (null != selectedIds && !selectedIds.isEmpty()) { - for (final Long id : selectedIds) { - addSourceTableData(id); - selectedTable.removeItem(id); - } + if (selectedIds == null) { + return; + } + for (final Long id : selectedIds) { + addSourceTableData(id); + selectedTable.removeItem(id); } } @SuppressWarnings("unchecked") private void getSourceTableData() { - sourceTablecontainer.removeAllItems(); + sourceTableContainer.removeAllItems(); final Iterable moduleTypeBeans = softwareManagement .findSoftwareModuleTypesAll(new PageRequest(0, 1_000)); Item saveTblitem; for (final SoftwareModuleType swTypeTag : moduleTypeBeans) { - saveTblitem = sourceTablecontainer.addItem(swTypeTag.getId()); + saveTblitem = sourceTableContainer.addItem(swTypeTag.getId()); saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue(swTypeTag.getName()); saveTblitem.getItemProperty(DIST_TYPE_DESCRIPTION).setValue(swTypeTag.getDescription()); } @@ -307,11 +314,13 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout private void getSelectedTableItemData(final Long id) { Item saveTblitem; - if (null != selectedTablecontainer) { - saveTblitem = selectedTablecontainer.addItem(id); + if (selectedTableContainer != null) { + saveTblitem = selectedTableContainer.addItem(id); saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue( sourceTable.getContainerDataSource().getItem(id).getItemProperty(DIST_TYPE_NAME).getValue()); - saveTblitem.getItemProperty(DIST_TYPE_MANDATORY).setValue(new CheckBox()); + final CheckBox mandatoryCheckBox = new CheckBox(); + window.updateAllComponents(mandatoryCheckBox); + saveTblitem.getItemProperty(DIST_TYPE_MANDATORY).setValue(mandatoryCheckBox); saveTblitem.getItemProperty(DIST_TYPE_DESCRIPTION).setValue( sourceTable.getContainerDataSource().getItem(id).getItemProperty(DIST_TYPE_DESCRIPTION).getValue()); } @@ -320,10 +329,9 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout @SuppressWarnings("unchecked") private void addSourceTableData(final Long selectedId) { - if (null != sourceTablecontainer) { + if (sourceTableContainer != null) { Item saveTblitem; - saveTblitem = sourceTablecontainer.addItem(selectedId); - selectedTable.getContainerDataSource().getItem(selectedId).getItemProperty(DIST_TYPE_NAME); + saveTblitem = sourceTableContainer.addItem(selectedId); saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue(selectedTable.getContainerDataSource() .getItem(selectedId).getItemProperty(DIST_TYPE_NAME).getValue()); saveTblitem.getItemProperty(DIST_TYPE_DESCRIPTION).setValue(selectedTable.getContainerDataSource() @@ -353,20 +361,14 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout final SoftwareModuleType swModuleType = softwareManagement.findSoftwareModuleTypeByName(distTypeName); checkMandatoryAndAddMandatoryModuleType(newDistType, isMandatory, swModuleType); } - if (null != typeDescValue) { - newDistType.setDescription(typeDescValue); - } - + newDistType.setDescription(typeDescValue); newDistType.setColour(colorPicked); newDistType = distributionSetManagement.createDistributionSetType(newDistType); uiNotification.displaySuccess(i18n.get("message.save.success", new Object[] { newDistType.getName() })); - closeWindow(); eventBus.publish(this, new DistributionSetTypeEvent(DistributionSetTypeEnum.ADD_DIST_SET_TYPE, newDistType)); - } else { uiNotification.displayValidationError(i18n.get("message.error.missing.typenameorkey")); - } } @@ -386,7 +388,7 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout if (null != typeNameValue) { updateDistSetType.setName(typeNameValue); updateDistSetType.setKey(typeKeyValue); - updateDistSetType.setDescription(null != typeDescValue ? typeDescValue : null); + updateDistSetType.setDescription(typeDescValue); if (distributionSetManagement.countDistributionSetsByType(existingType) <= 0 && null != itemIds && !itemIds.isEmpty()) { @@ -404,21 +406,17 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout distributionSetManagement.updateDistributionSetType(updateDistSetType); uiNotification .displaySuccess(i18n.get("message.update.success", new Object[] { updateDistSetType.getName() })); - closeWindow(); eventBus.publish(this, new DistributionSetTypeEvent(DistributionSetTypeEnum.UPDATE_DIST_SET_TYPE, updateDistSetType)); - } else { uiNotification.displayValidationError(i18n.get("message.tag.update.mandatory")); } - } private void checkMandatoryAndAddMandatoryModuleType(final DistributionSetType updateDistSetType, final Boolean isMandatory, final SoftwareModuleType swModuleType) { if (isMandatory) { updateDistSetType.addMandatoryModuleType(swModuleType); - } else { updateDistSetType.addOptionalModuleType(swModuleType); } @@ -440,32 +438,6 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout return distSetType; } - /* - * (non-Javadoc) - * - * @see com.vaadin.ui.components.colorpicker.HasColorChangeListener# - * addColorChangeListener(com.vaadin - * .ui.components.colorpicker.ColorChangeListener) - */ - @Override - public void addColorChangeListener(final ColorChangeListener listener) { - - LOG.info("in side addColorChangeListener() "); - } - - /* - * (non-Javadoc) - * - * @see com.vaadin.ui.components.colorpicker.HasColorChangeListener# - * removeColorChangeListener(com. - * vaadin.ui.components.colorpicker.ColorChangeListener) - */ - @Override - public void removeColorChangeListener(final ColorChangeListener listener) { - - LOG.info("in side removeColorChangeListener() "); - } - /** * reset the components. */ @@ -484,9 +456,9 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout * ValueChangeEvent */ @Override - protected void createOptionValueChanged(final ValueChangeEvent event) { + protected void optionValueChanged(final ValueChangeEvent event) { - super.createOptionValueChanged(event); + super.optionValueChanged(event); if (updateTypeStr.equals(event.getProperty().getValue())) { selectedTable.getContainerDataSource().removeAllItems(); @@ -552,18 +524,17 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout if (null != selectedTypeTag) { tagDesc.setValue(selectedTypeTag.getDescription()); typeKey.setValue(selectedTypeTag.getKey()); - if (distributionSetManagement.countDistributionSetsByType(selectedTypeTag) <= 0) { distTypeSelectLayout.setEnabled(true); selectedTable.setEnabled(true); - window.setSaveButtonEnabled(true); } else { uiNotification.displayValidationError( selectedTypeTag.getName() + " " + i18n.get("message.error.dist.set.type.update")); distTypeSelectLayout.setEnabled(false); selectedTable.setEnabled(false); - window.setSaveButtonEnabled(false); } + + createOriginalSelectedTableContainer(); for (final SoftwareModuleType swModuleType : selectedTypeTag.getOptionalModuleTypes()) { addTargetTableforUpdate(swModuleType, false); } @@ -583,65 +554,41 @@ public class CreateUpdateDistSetTypeLayout extends CreateUpdateTypeLayout @SuppressWarnings("unchecked") private void addTargetTableforUpdate(final SoftwareModuleType swModuleType, final boolean mandatory) { - Item saveTblitem; - if (null != selectedTablecontainer) { - 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)); + if (selectedTableContainer == null) { + return; } + final Item saveTblitem = selectedTableContainer.addItem(swModuleType.getId()); + sourceTable.removeItem(swModuleType.getId()); + saveTblitem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); + final CheckBox mandatoryCheckbox = new CheckBox("", mandatory); + mandatoryCheckbox.setId(swModuleType.getName()); + saveTblitem.getItemProperty(DIST_TYPE_MANDATORY).setValue(mandatoryCheckbox); + + final Item originalItem = originalSelectedTableContainer.addItem(swModuleType.getId()); + originalItem.getItemProperty(DIST_TYPE_NAME).setValue(swModuleType.getName()); + originalItem.getItemProperty(DIST_TYPE_MANDATORY).setValue(mandatoryCheckbox); + + window.updateAllComponents(mandatoryCheckbox); } @Override protected void save(final ClickEvent event) { - - if (mandatoryValuesPresent()) { - final DistributionSetType existingDistTypeByKey = distributionSetManagement - .findDistributionSetTypeByKey(typeKey.getValue()); - final DistributionSetType existingDistTypeByName = distributionSetManagement - .findDistributionSetTypeByName(tagName.getValue()); - if (optiongroup.getValue().equals(createTypeStr)) { - if (!checkIsDuplicateByKey(existingDistTypeByKey) && !checkIsDuplicate(existingDistTypeByName)) { - createNewDistributionSetType(); - } - } else { - updateDistributionSetType(existingDistTypeByKey); + final DistributionSetType existingDistTypeByKey = distributionSetManagement + .findDistributionSetTypeByKey(typeKey.getValue()); + final DistributionSetType existingDistTypeByName = distributionSetManagement + .findDistributionSetTypeByName(tagName.getValue()); + if (optiongroup.getValue().equals(createTypeStr)) { + if (!checkIsDuplicateByKey(existingDistTypeByKey) && !checkIsDuplicate(existingDistTypeByName)) { + createNewDistributionSetType(); } - } - } - - @Override - public void createWindow() { - reset(); - window = SPUIComponentProvider.getWindow(i18n.get("caption.add.type"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null); - } - - @Override - protected void previewButtonClicked() { - if (!tagPreviewBtnClicked) { - final String selectedOption = (String) optiongroup.getValue(); - if (null != selectedOption && selectedOption.equalsIgnoreCase(updateTypeStr) - && null != tagNameComboBox.getValue()) { - - final DistributionSetType existedDistType = distributionSetManagement - .findDistributionSetTypeByKey(tagNameComboBox.getValue().toString()); - if (null != existedDistType) { - getColorPickerLayout().setSelectedColor(existedDistType.getColour() != null - ? ColorPickerHelper.rgbToColorConverter(existedDistType.getColour()) - : ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - } else { - getColorPickerLayout().setSelectedColor( - ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - } - } - getColorPickerLayout().getSelPreview().setColor(getColorPickerLayout().getSelectedColor()); - mainLayout.addComponent(colorPickerLayout, 1, 0); - mainLayout.setComponentAlignment(colorPickerLayout, Alignment.MIDDLE_CENTER); } else { - mainLayout.removeComponent(colorPickerLayout); + updateDistributionSetType(existingDistTypeByKey); } - tagPreviewBtnClicked = !tagPreviewBtnClicked; + } + + @Override + protected String getWindowCaption() { + return i18n.get("caption.add.type"); } @Override 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..d51d4fb28 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,7 @@ 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(getSelectedBaseEntityId()); 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/distributions/dstable/DistributionSetTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java index 817b465c2..8f392101f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java @@ -152,7 +152,7 @@ public class DistributionSetTableHeader extends AbstractTableHeader { @Override protected void addNewItem(final ClickEvent event) { - final Window newDistWindow = addUpdateWindowLayout.getWindow(); + final Window newDistWindow = addUpdateWindowLayout.getWindow(null); newDistWindow.setCaption(i18n.get("caption.add.new.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 7a083d52f..8269d4e89 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 @@ -20,17 +20,16 @@ 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; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; -import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UINotification; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.EventBus; -import com.google.common.base.Strings; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.server.Page; @@ -87,7 +86,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent protected CommonDialogWindow window; protected Label colorLabel; - protected Label madatoryLabel; protected TextField tagName; protected TextArea tagDesc; protected Button tagColorPreviewBtn; @@ -99,17 +97,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; - protected void createWindow() { - reset(); - setWindow(SPUIComponentProvider.getWindow(i18n.get("caption.add.tag"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, this::save, this::discard, null)); - } + protected abstract String getWindowCaption(); /** * Save new tag / update new tag. @@ -142,7 +136,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent setSizeUndefined(); createRequiredComponents(); buildLayout(); - createWindow(); addListeners(); eventBus.subscribe(this); } @@ -157,7 +150,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent createTagStr = i18n.get("label.create.tag"); updateTagStr = i18n.get("label.update.tag"); comboLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.tag"), null); - madatoryLabel = getMandatoryLabel(); colorLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.tag.color"), null); colorLabel.addStyleName(SPUIDefinitions.COLOR_LABEL_STYLE); @@ -169,7 +161,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagDesc = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "", ValoTheme.TEXTFIELD_TINY + " " + SPUIDefinitions.TAG_DESC, false, "", i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); - tagDesc.setId(SPUIDefinitions.NEW_TARGET_TAG_DESC); tagDesc.setImmediate(true); tagDesc.setNullRepresentation(""); @@ -178,6 +169,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent i18n.get("label.combobox.tag")); tagNameComboBox.addStyleName(SPUIDefinitions.FILTER_TYPE_COMBO_STYLE); tagNameComboBox.setImmediate(true); + tagNameComboBox.setId(SPUIComponentIdProvider.DIST_TAG_COMBO); tagColorPreviewBtn = new Button(); tagColorPreviewBtn.setId(SPUIComponentIdProvider.TAG_COLOR_PREVIEW_ID); @@ -200,7 +192,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent formLayout.addComponent(optiongroup); formLayout.addComponent(comboLayout); - formLayout.addComponent(madatoryLabel); formLayout.addComponent(tagName); formLayout.addComponent(tagDesc); formLayout.addStyleName("form-lastrow"); @@ -215,6 +206,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(); } @@ -234,13 +229,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() { @@ -270,12 +262,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent } } - protected Label getMandatoryLabel() { - final Label label = new Label(i18n.get("label.mandatory.field")); - label.setStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_SMALL); - return label; - } - private void tagNameChosen(final ValueChangeEvent event) { final String tagSelected = (String) event.getProperty().getValue(); if (null != tagSelected) { @@ -283,6 +269,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent } else { resetTagNameField(); } + window.setOrginaleValues(); } protected void resetTagNameField() { @@ -290,7 +277,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; @@ -327,7 +313,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent getPreviewButtonColor(ColorPickerConstants.DEFAULT_COLOR); colorPickerLayout.getSelPreview() .setColor(ColorPickerHelper.rgbToColorConverter(ColorPickerConstants.DEFAULT_COLOR)); - mainLayout.removeComponent(colorPickerLayout); + window.setOrginaleValues(); } /** @@ -342,9 +328,9 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent // hide target name combo comboLayout.removeComponent(comboLabel); comboLayout.removeComponent(tagNameComboBox); - mainLayout.removeComponent(colorPickerLayout); // Default green color + colorPickerLayout.setVisible(false); colorPickerLayout.setSelectedColor(colorPickerLayout.getDefaultColor()); colorPickerLayout.getSelPreview().setColor(colorPickerLayout.getSelectedColor()); tagPreviewBtnClicked = false; @@ -389,6 +375,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent */ protected void createDynamicStyleForComponents(final TextField tagName, final TextArea tagDesc, final String taregtTagColor) { + tagName.removeStyleName(SPUIDefinitions.TAG_NAME); tagDesc.removeStyleName(SPUIDefinitions.TAG_DESC); getTargetDynamicStyles(taregtTagColor); @@ -435,11 +422,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent createDynamicStyleForComponents(tagName, tagDesc, colorPickedPreview); colorPickerLayout.getColorSelect().setColor(colorPickerLayout.getSelPreview().getColor()); } - } - protected void closeWindow() { - window.close(); - UI.getCurrent().removeWindow(window); } /** @@ -448,6 +431,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent 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); @@ -472,27 +456,17 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent } } - @Override - public void addColorChangeListener(final ColorChangeListener listener) { - } - - @Override - public void removeColorChangeListener(final ColorChangeListener listener) { - } - public ColorPickerLayout getColorPickerLayout() { return colorPickerLayout; } 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. */ @@ -565,7 +539,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent tagManagement.updateDistributionSetTag((DistributionSetTag) targetObj); } uiNotification.displaySuccess(i18n.get("message.update.success", new Object[] { targetObj.getName() })); - closeWindow(); } else { uiNotification.displayValidationError(i18n.get("message.tag.update.mandatory")); } @@ -587,27 +560,6 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent getPreviewButtonColor(previewColor); } - /** - * - * @return - */ - protected Boolean mandatoryValuesPresent() { - if (Strings.isNullOrEmpty(tagName.getValue())) { - if (optiongroup.getValue().equals(createTagStr)) { - displayValidationError(SPUILabelDefinitions.MISSING_TAG_NAME); - } - if (optiongroup.getValue().equals(updateTagStr)) { - if (null == tagNameComboBox.getValue()) { - displayValidationError(i18n.get(MESSAGE_ERROR_MISSING_TAGNAME)); - } else { - displayValidationError(SPUILabelDefinitions.MISSING_TAG_NAME); - } - } - return Boolean.FALSE; - } - return Boolean.TRUE; - } - protected Boolean checkIsDuplicate(final Tag existingTag) { if (existingTag != null) { displayValidationError(i18n.get("message.tag.duplicate.check", new Object[] { existingTag.getName() })); @@ -644,4 +596,16 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent return formLayout; } + public GridLayout getMainLayout() { + return mainLayout; + } + + @Override + public void addColorChangeListener(final ColorChangeListener listener) { + } + + @Override + public void removeColorChangeListener(final ColorChangeListener listener) { + } + } 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 1987d6053..f25a4b485 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 @@ -17,9 +17,7 @@ import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; -import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; -import com.google.common.base.Strings; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.server.Page; import com.vaadin.shared.ui.colorpicker.Color; @@ -33,12 +31,10 @@ import com.vaadin.ui.components.colorpicker.ColorSelector; import com.vaadin.ui.themes.ValoTheme; /** - * * Superclass defining common properties and methods for creating/updating * types. - * */ -public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { +public abstract class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { private static final long serialVersionUID = 5732904956185988397L; @@ -52,7 +48,7 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { @Override protected void addListeners() { super.addListeners(); - optiongroup.addValueChangeListener(this::createOptionValueChanged); + optiongroup.addValueChangeListener(this::optionValueChanged); } @Override @@ -61,7 +57,6 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { createTypeStr = i18n.get("label.create.type"); updateTypeStr = i18n.get("label.update.type"); comboLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.type"), null); - madatoryLabel = getMandatoryLabel(); colorLabel = SPUIComponentProvider.getLabel(i18n.get("label.choose.type.color"), null); colorLabel.addStyleName(SPUIDefinitions.COLOR_LABEL_STYLE); @@ -137,7 +132,8 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { * @param event * ValueChangeEvent */ - protected void createOptionValueChanged(final ValueChangeEvent event) { + @Override + protected void optionValueChanged(final ValueChangeEvent event) { if (updateTypeStr.equals(event.getProperty().getValue())) { tagName.clear(); @@ -151,7 +147,6 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { } else { typeKey.setEnabled(true); tagName.setEnabled(true); - window.setSaveButtonEnabled(true); tagName.clear(); tagDesc.clear(); typeKey.clear(); @@ -203,6 +198,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); @@ -285,24 +281,6 @@ public class CreateUpdateTypeLayout extends AbstractCreateUpdateTagLayout { return Boolean.FALSE; } - @Override - protected Boolean mandatoryValuesPresent() { - if (Strings.isNullOrEmpty(tagName.getValue()) || Strings.isNullOrEmpty(typeKey.getValue())) { - if (optiongroup.getValue().equals(createTypeStr)) { - displayValidationError(SPUILabelDefinitions.MISSING_TYPE_NAME_KEY); - } - if (optiongroup.getValue().equals(updateTypeStr)) { - if (null == tagNameComboBox.getValue()) { - displayValidationError(i18n.get("message.error.missing.tagName")); - } else { - displayValidationError(SPUILabelDefinitions.MISSING_TAG_NAME); - } - } - return Boolean.FALSE; - } - return Boolean.TRUE; - } - @Override protected void save(final ClickEvent event) { // is implemented in the inherited class 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 5b5d53524..069b9b407 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionAddUpdateWindowLayout.java @@ -8,9 +8,7 @@ */ package org.eclipse.hawkbit.ui.management.dstable; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; @@ -26,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; @@ -43,26 +42,18 @@ import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition; import org.vaadin.spring.events.EventBus; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.event.FieldEvents.TextChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.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.Label; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; -import com.vaadin.ui.UI; import com.vaadin.ui.themes.ValoTheme; /** - * - * + * WindowContent for adding/editing a Distribution */ @SpringComponent @ViewScope @@ -92,24 +83,12 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { private TextField distNameTextField; private TextField distVersionTextField; - private Label madatoryLabel; private TextArea descTextArea; private CheckBox reqMigStepCheckbox; private ComboBox distsetTypeNameComboBox; private boolean editDistribution = Boolean.FALSE; private Long editDistId; - private CommonDialogWindow addDistributionWindow; - private String originalDistName; - private String originalDistVersion; - private String originalDistDescription; - private Boolean originalReqMigStep; - private String originalDistSetType; - private final List changedComponents = new ArrayList<>(); - private ValueChangeListener reqMigStepCheckboxListerner; - private TextChangeListener descTextAreaListener; - private TextChangeListener distNameTextFieldListener; - private TextChangeListener distVersionTextFieldListener; - private ValueChangeListener distsetTypeNameComboBoxListener; + private CommonDialogWindow window; private FormLayout formLayout; @@ -123,16 +102,10 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { } private void buildLayout() { - - /* - * The main layout of the window contains mandatory info, textboxes - * (controller Id, name & description) and action buttons layout - */ addStyleName("lay-color"); setSizeUndefined(); formLayout = new FormLayout(); - formLayout.addComponent(madatoryLabel); formLayout.addComponent(distsetTypeNameComboBox); formLayout.addComponent(distNameTextField); formLayout.addComponent(distVersionTextField); @@ -140,7 +113,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { formLayout.addComponent(reqMigStepCheckbox); setCompositionRoot(formLayout); - distNameTextField.focus(); } @@ -164,6 +136,7 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { distsetTypeNameComboBox.setImmediate(true); distsetTypeNameComboBox.setNullSelectionAllowed(false); distsetTypeNameComboBox.setId(SPUIComponentIdProvider.DIST_ADD_DISTSETTYPE); + populateDistSetTypeNameCombo(); descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style", ValoTheme.TEXTAREA_TINY, false, null, i18n.get("textfield.description"), @@ -171,10 +144,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { descTextArea.setId(SPUIComponentIdProvider.DIST_ADD_DESC); descTextArea.setNullRepresentation(""); - /* Label for mandatory symbol */ - madatoryLabel = new Label(i18n.get("label.mandatory.field")); - madatoryLabel.setStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_SMALL); - reqMigStepCheckbox = SPUIComponentProvider.getCheckBox(i18n.get("checkbox.dist.required.migration.step"), "dist-checkbox-style", null, false, ""); reqMigStepCheckbox.addStyleName(ValoTheme.CHECKBOX_SMALL); @@ -200,27 +169,17 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { return disttypeContainer; } - private void enableSaveButton() { - addDistributionWindow.setSaveButtonEnabled(true); - } - private DistributionSetType getDefaultDistributionSetType() { final TenantMetaData tenantMetaData = systemManagement.getTenantMetadata(); return tenantMetaData.getDefaultDsType(); } - private void disableSaveButton() { - addDistributionWindow.setSaveButtonEnabled(false); - } - private void saveDistribution() { - /* add new or update target */ if (editDistribution) { updateDistribution(); } else { addNewDistribution(); } - } /** @@ -232,7 +191,7 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { final String distSetTypeName = HawkbitCommonUtil .trimAndNullIfEmpty((String) distsetTypeNameComboBox.getValue()); - if (mandatoryCheck(name, version, distSetTypeName) && duplicateCheck(name, version)) { + if (duplicateCheck(name, version)) { final DistributionSet currentDS = distributionSetManagement.findDistributionSetByIdWithDetails(editDistId); final String desc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue()); final boolean isMigStepReq = reqMigStepCheckbox.getValue(); @@ -250,23 +209,9 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { notificationMessage.displayValidationError( i18n.get("message.distribution.no.update", currentDS.getName() + ":" + currentDS.getVersion())); } - closeThisWindow(); } } - private void addListeners() { - reqMigStepCheckboxListerner = event -> checkValueChanged(originalReqMigStep, event); - descTextAreaListener = event -> checkValueChanged(originalDistDescription, event); - distNameTextFieldListener = event -> checkValueChanged(originalDistName, event); - distVersionTextFieldListener = event -> checkValueChanged(originalDistVersion, event); - distsetTypeNameComboBoxListener = event -> checkValueChanged(originalDistSetType, event); - reqMigStepCheckbox.addValueChangeListener(reqMigStepCheckboxListerner); - descTextArea.addTextChangeListener(descTextAreaListener); - distNameTextField.addTextChangeListener(distNameTextFieldListener); - distVersionTextField.addTextChangeListener(distVersionTextFieldListener); - distsetTypeNameComboBox.addValueChangeListener(distsetTypeNameComboBoxListener); - } - /** * Add new Distribution set. */ @@ -277,7 +222,7 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { final String distSetTypeName = HawkbitCommonUtil .trimAndNullIfEmpty((String) distsetTypeNameComboBox.getValue()); - if (mandatoryCheck(name, version, distSetTypeName) && duplicateCheck(name, version)) { + if (duplicateCheck(name, version)) { final String desc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue()); final boolean isMigStepReq = reqMigStepCheckbox.getValue(); DistributionSet newDist = entityFactory.generateDistributionSet(); @@ -287,21 +232,11 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { notificationMessage.displaySuccess(i18n.get("message.new.dist.save.success", new Object[] { newDist.getName(), newDist.getVersion() })); - /* close the window */ - closeThisWindow(); eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.NEW_ENTITY, newDist)); } } - /** - * Close window. - */ - private void closeThisWindow() { - addDistributionWindow.close(); - UI.getCurrent().removeWindow(addDistributionWindow); - } - /** * Set Values for Distribution set. * @@ -345,47 +280,6 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { } } - /** - * Mandatory Check. - * - * @param name - * as String - * @param version - * as String - * @param selectedJVM - * as String - * @param selectedAgentHub - * as String - * @param selectedOs - * as String - * @return boolean as flag - */ - private boolean mandatoryCheck(final String name, final String version, final String distSetTypeName) { - - if (name == null || version == null || distSetTypeName == null) { - if (name == null) { - distNameTextField.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - } - if (version == null) { - distVersionTextField.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - } - if (distSetTypeName == null) { - distsetTypeNameComboBox.addStyleName(SPUIStyleDefinitions.SP_COMBOFIELD_ERROR); - } - - notificationMessage.displayValidationError(i18n.get("message.mandatory.check")); - return false; - } - - return true; - } - - private void discardDistribution() { - /* Just close this window */ - distsetTypeNameComboBox.removeValueChangeListener(distsetTypeNameComboBoxListener); - closeThisWindow(); - } - /** * clear all the fields. */ @@ -398,139 +292,52 @@ public class DistributionAddUpdateWindowLayout extends CustomComponent { distsetTypeNameComboBox.removeStyleName(SPUIStyleDefinitions.SP_COMBOFIELD_ERROR); descTextArea.clear(); reqMigStepCheckbox.clear(); - if (addDistributionWindow != null) { - addDistributionWindow.setSaveButtonEnabled(true); - } - removeListeners(); - changedComponents.clear(); + } - private void populateRequiredComponents() { - populateDistSetTypeNameCombo(); - } - - private void removeListeners() { - reqMigStepCheckbox.removeValueChangeListener(reqMigStepCheckboxListerner); - descTextArea.removeTextChangeListener(descTextAreaListener); - distNameTextField.removeTextChangeListener(distNameTextFieldListener); - distVersionTextField.removeTextChangeListener(distVersionTextFieldListener); - } - - public void setOriginalDistName(final String originalDistName) { - this.originalDistName = originalDistName; - } - - public void setOriginalDistVersion(final String originalDistVersion) { - this.originalDistVersion = originalDistVersion; - } - - public void setOriginalDistDescription(final String originalDistDescription) { - this.originalDistDescription = originalDistDescription; - } - - private void checkValueChanged(final String originalValue, final TextChangeEvent event) { - if (editDistribution) { - final String newValue = event.getText(); - if (!originalValue.equalsIgnoreCase(newValue)) { - changedComponents.add(event.getComponent()); - } else { - changedComponents.remove(event.getComponent()); - } - enableDisableSaveButton(); - } - } - - private void checkValueChanged(final Boolean originalValue, final ValueChangeEvent event) { - if (editDistribution) { - if (!originalValue.equals(event.getProperty().getValue())) { - changedComponents.add(reqMigStepCheckbox); - } else { - changedComponents.remove(reqMigStepCheckbox); - } - enableDisableSaveButton(); - } - } - - private void checkValueChanged(final String originalValue, final ValueChangeEvent event) { - if (editDistribution) { - if (!originalValue.equals(event.getProperty().getValue())) { - changedComponents.add(distsetTypeNameComboBox); - } else { - changedComponents.remove(distsetTypeNameComboBox); - } - enableDisableSaveButton(); - } - } - - private void enableDisableSaveButton() { - if (changedComponents.isEmpty()) { - disableSaveButton(); - } else { - enableSaveButton(); - } - } - - private void setOriginalReqMigStep(final Boolean originalReqMigStep) { - this.originalReqMigStep = originalReqMigStep; - } - - /** - * populate data. - * - * @param editDistId - */ - public void populateValuesOfDistribution(final Long editDistId) { + private void populateValuesOfDistribution(final Long editDistId) { this.editDistId = editDistId; - editDistribution = Boolean.TRUE; - addDistributionWindow.setSaveButtonEnabled(false); + + if (editDistId == null) { + return; + } + final DistributionSet distSet = distributionSetManagement.findDistributionSetByIdWithDetails(editDistId); - if (distSet != null) { - distNameTextField.setValue(distSet.getName()); - distVersionTextField.setValue(distSet.getVersion()); - if (distSet.getType().isDeleted()) { - distsetTypeNameComboBox.addItem(distSet.getType().getName()); - } - distsetTypeNameComboBox.setValue(distSet.getType().getName()); - reqMigStepCheckbox.setValue(distSet.isRequiredMigrationStep()); - if (distSet.getDescription() != null) { - descTextArea.setValue(distSet.getDescription()); - } - setOriginalDistName(distSet.getName()); - setOriginalDistVersion(distSet.getVersion()); - setOriginalDistDescription(distSet.getDescription()); - setOriginalReqMigStep(distSet.isRequiredMigrationStep()); - setOriginalDistSetTYpe(distSet.getType().getName()); - addListeners(); + if (distSet == null) { + return; + } + + editDistribution = Boolean.TRUE; + distNameTextField.setValue(distSet.getName()); + distVersionTextField.setValue(distSet.getVersion()); + if (distSet.getType().isDeleted()) { + distsetTypeNameComboBox.addItem(distSet.getType().getName()); + } + distsetTypeNameComboBox.setValue(distSet.getType().getName()); + reqMigStepCheckbox.setValue(distSet.isRequiredMigrationStep()); + if (distSet.getDescription() != null) { + descTextArea.setValue(distSet.getDescription()); } } - public CommonDialogWindow getWindow() { + public CommonDialogWindow getWindow(final Long editDistId) { eventBus.publish(this, DragEvent.HIDE_DROP_HINT); - populateRequiredComponents(); resetComponents(); - addDistributionWindow = SPUIComponentProvider.getWindow(i18n.get("caption.add.new.dist"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), event -> discardDistribution(), - null); - addDistributionWindow.getButtonsLayout().removeStyleName("actionButtonsMargin"); - - return addDistributionWindow; + populateDistSetTypeNameCombo(); + populateValuesOfDistribution(editDistId); + window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.dist"), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveDistribution(), null, null, formLayout, i18n); + window.getButtonsLayout().removeStyleName("actionButtonsMargin"); + return window; } /** * Populate DistributionSet Type name combo. */ - public void populateDistSetTypeNameCombo() { + private void populateDistSetTypeNameCombo() { distsetTypeNameComboBox.setContainerDataSource(getDistSetTypeLazyQueryContainer()); distsetTypeNameComboBox.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); distsetTypeNameComboBox.setValue(getDefaultDistributionSetType().getName()); } - /** - * @param originalDistSetTYpe - * the originalDistSetTYpe to set - */ - public void setOriginalDistSetTYpe(final String originalDistSetType) { - this.originalDistSetType = originalDistSetType; - } - } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java index dc7e347cd..30ee80317 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,7 @@ 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(getSelectedBaseEntityId()); 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/dstable/DistributionTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java index b0ed19f8f..0e63ddb95 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java @@ -154,7 +154,7 @@ public class DistributionTableHeader extends AbstractTableHeader { @Override protected void addNewItem(final ClickEvent event) { - final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(); + final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(null); newDistWindow.setCaption(i18n.get("caption.add.new.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 0d4da54e8..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 @@ -32,9 +32,7 @@ import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.UI; /** - * * Class for Create/Update Tag Layout of distribution set - * */ @SpringComponent @ViewScope @@ -87,16 +85,13 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat */ @Override public void save(final ClickEvent event) { - if (mandatoryValuesPresent()) { - final DistributionSetTag existingDistTag = tagManagement.findDistributionSetTag(tagName.getValue()); - if (optiongroup.getValue().equals(createTagStr)) { - if (!checkIsDuplicate(existingDistTag)) { - createNewTag(); - } - } else { - - updateExistingTag(existingDistTag); + final DistributionSetTag existingDistTag = tagManagement.findDistributionSetTag(tagName.getValue()); + if (optiongroup.getValue().equals(createTagStr)) { + if (!checkIsDuplicate(existingDistTag)) { + createNewTag(); } + } else { + updateExistingTag(existingDistTag); } } @@ -181,4 +176,9 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat setOptionGroupDefaultValue(permChecker.hasCreateDistributionPermission(), 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/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/tag/SpColorPickerPreview.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/SpColorPickerPreview.java index 29db56009..afbed85a6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/SpColorPickerPreview.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/SpColorPickerPreview.java @@ -10,6 +10,8 @@ package org.eclipse.hawkbit.ui.management.tag; import java.lang.reflect.Field; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; + import com.google.common.base.Throwables; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeEvent; @@ -44,7 +46,7 @@ public final class SpColorPickerPreview extends ColorPickerPreview implements Te try { final Field textField = ColorPickerPreview.class.getDeclaredField("field"); textField.setAccessible(true); - ((TextField) textField.get(this)).setId("color-preview-field"); + ((TextField) textField.get(this)).setId(SPUIComponentIdProvider.COLOR_PREVIEW_FIELD); ((TextField) textField.get(this)).addTextChangeListener(this); } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { Throwables.propagate(e); 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 c9afddebf..2b08c4dbf 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 @@ -18,6 +18,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; @@ -31,30 +32,23 @@ import org.eclipse.hawkbit.ui.utils.UINotification; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.EventBus; -import com.vaadin.event.FieldEvents.TextChangeEvent; -import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.VaadinSessionScope; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.FormLayout; -import com.vaadin.ui.Label; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; -import com.vaadin.ui.UI; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; /** * Add and Update Target. - * - * - * */ @SpringComponent @VaadinSessionScope public class TargetAddUpdateWindowLayout extends CustomComponent { private static final long serialVersionUID = -6659290471705262389L; - + @Autowired private I18N i18n; @@ -66,122 +60,61 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { @Autowired private transient UINotification uINotification; - + @Autowired private transient EntityFactory entityFactory; - + private TextField controllerIDTextField; private TextField nameTextField; private TextArea descTextArea; - private Label madatoryLabel; private boolean editTarget = Boolean.FALSE; private String controllerId; private FormLayout formLayout; private CommonDialogWindow window; - private String oldTargetName; - private String oldTargetDesc; - /** * Initialize the Add Update Window Component for Target. */ public void init() { - /* create components */ createRequiredComponents(); - /* display components in layout */ buildLayout(); - /* register all listeners related to the Window */ - addListeners(); setCompositionRoot(formLayout); } private void createRequiredComponents() { /* Textfield for controller Id */ - controllerIDTextField = SPUIComponentProvider.getTextField( i18n.get("prompt.target.id"), "", ValoTheme.TEXTFIELD_TINY, true, null, - i18n.get("prompt.target.id"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); + controllerIDTextField = SPUIComponentProvider.getTextField(i18n.get("prompt.target.id"), "", + ValoTheme.TEXTFIELD_TINY, true, null, i18n.get("prompt.target.id"), true, + SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); controllerIDTextField.setId(SPUIComponentIdProvider.TARGET_ADD_CONTROLLER_ID); - /* Textfield for target name */ - nameTextField = SPUIComponentProvider.getTextField( i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY, false, null, - i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); + nameTextField = SPUIComponentProvider.getTextField(i18n.get("textfield.name"), "", ValoTheme.TEXTFIELD_TINY, + false, null, i18n.get("textfield.name"), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); nameTextField.setId(SPUIComponentIdProvider.TARGET_ADD_NAME); /* Textarea for target description */ - descTextArea = SPUIComponentProvider.getTextArea( i18n.get("textfield.description"), "text-area-style", ValoTheme.TEXTFIELD_TINY, false, null, - i18n.get("textfield.description"), SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); + descTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.description"), "text-area-style", + ValoTheme.TEXTFIELD_TINY, false, null, i18n.get("textfield.description"), + SPUILabelDefinitions.TEXT_AREA_MAX_LENGTH); descTextArea.setId(SPUIComponentIdProvider.TARGET_ADD_DESC); descTextArea.setNullRepresentation(HawkbitCommonUtil.SP_STRING_EMPTY); - - /* Label for mandatory symbol */ - madatoryLabel = new Label(i18n.get("label.mandatory.field")); - madatoryLabel.setStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_SMALL); } private void buildLayout() { - + /* * The main layout of the window contains mandatory info, textboxes * (controller Id, name & description) and action buttons layout */ setSizeUndefined(); formLayout = new FormLayout(); - formLayout.addComponent(madatoryLabel); formLayout.addComponent(controllerIDTextField); formLayout.addComponent(nameTextField); formLayout.addComponent(descTextArea); - - if (Boolean.TRUE.equals(editTarget)) { - madatoryLabel.setVisible(Boolean.FALSE); - } + controllerIDTextField.focus(); } - private void addListeners() { - - addTargetNameChangeListner(); - addTargetDescChangeListner(); - } - - private void addTargetNameChangeListner() { - nameTextField.addTextChangeListener(new TextChangeListener() { - - /** - * - */ - private static final long serialVersionUID = 1761855781481115921L; - - @Override - public void textChange(final TextChangeEvent event) { - if (event.getText().equals(oldTargetName) && descTextArea.getValue().equals(oldTargetDesc)) { - window.setSaveButtonEnabled(false); - } else { - window.setSaveButtonEnabled(true); - } - - } - }); - } - - private void addTargetDescChangeListner() { - descTextArea.addTextChangeListener(new TextChangeListener() { - - /** - * - */ - private static final long serialVersionUID = 5770734934988115068L; - - @Override - public void textChange(final TextChangeEvent event) { - if (event.getText().equals(oldTargetDesc) && nameTextField.getValue().equals(oldTargetName)) { - window.setSaveButtonEnabled(false); - } else { - window.setSaveButtonEnabled(true); - } - - } - }); - } - /** * Update the Target if modified. */ @@ -199,10 +132,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { uINotification.displaySuccess(i18n.get("message.update.success", new Object[] { latestTarget.getName() })); // publishing through event bus eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.UPDATED_ENTITY, latestTarget)); - - /* close the window */ - closeThisWindow(); - /* update details in table */ } private void saveTargetListner() { @@ -213,13 +142,9 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { } } - private void discardTargetListner() { - closeThisWindow(); - } - private void addNewTarget() { final String newControlllerId = HawkbitCommonUtil.trimAndNullIfEmpty(controllerIDTextField.getValue()); - if (mandatoryCheck(newControlllerId) && duplicateCheck(newControlllerId)) { + if (duplicateCheck(newControlllerId)) { final String newName = HawkbitCommonUtil.trimAndNullIfEmpty(nameTextField.getValue()); final String newDesc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue()); @@ -236,15 +161,20 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { /* display success msg */ uINotification.displaySuccess(i18n.get("message.save.success", new Object[] { newTarget.getName() })); - /* close the window */ - closeThisWindow(); } } 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); + window = SPUIWindowDecorator.getWindow(i18n.get("caption.add.new.target"), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> saveTargetListner(), null, null, formLayout, i18n); + return window; + } + + public Window getWindow(final String entityId) { + populateValuesOfTarget(entityId); + getWindow(); + window.addStyleName("target-update-window"); return window; } @@ -254,39 +184,23 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { public void resetComponents() { nameTextField.clear(); nameTextField.removeStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - controllerIDTextField.setEnabled(true); - controllerIDTextField.setReadOnly(false); + controllerIDTextField.setEnabled(Boolean.TRUE); controllerIDTextField.removeStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); controllerIDTextField.clear(); descTextArea.clear(); editTarget = Boolean.FALSE; } - private void closeThisWindow() { - editTarget = Boolean.FALSE; - window.close(); - UI.getCurrent().removeWindow(window); - } - private void setTargetValues(final Target target, final String name, final String description) { target.setName(name == null ? target.getControllerId() : name); target.setDescription(description); } - private boolean mandatoryCheck(final String newControlllerId) { - if (newControlllerId == null) { - controllerIDTextField.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR); - uINotification.displayValidationError("Mandatory details are missing"); - return false; - } else { - return true; - } - } - private boolean duplicateCheck(final String newControlllerId) { final Target existingTarget = targetManagement.findTargetByControllerID(newControlllerId.trim()); if (existingTarget != null) { - uINotification.displayValidationError(i18n.get("message.target.duplicate.check")); + uINotification.displayValidationError( + i18n.get("message.target.duplicate.check", new Object[] { newControlllerId })); return false; } else { return true; @@ -296,22 +210,21 @@ public class TargetAddUpdateWindowLayout extends CustomComponent { /** * @param controllerId */ - public void populateValuesOfTarget(final String controllerId) { + private void populateValuesOfTarget(final String controllerId) { resetComponents(); this.controllerId = controllerId; editTarget = Boolean.TRUE; final Target target = targetManagement.findTargetByControllerID(controllerId); controllerIDTextField.setValue(target.getControllerId()); - controllerIDTextField.setReadOnly(Boolean.TRUE); + controllerIDTextField.setEnabled(Boolean.FALSE); nameTextField.setValue(target.getName()); if (target.getDescription() != null) { descTextArea.setValue(target.getDescription()); } - window.setSaveButtonEnabled(Boolean.FALSE); + } - oldTargetDesc = descTextArea.getValue(); - oldTargetName = nameTextField.getValue(); - window.addStyleName("target-update-window"); + public FormLayout getFormLayout() { + return formLayout; } } 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..020b29372 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,13 @@ public class TargetDetails extends AbstractTableDetailsLayout { if (getSelectedBaseEntity() == null) { return; } + targetAddUpdateWindowLayout.getWindow(getSelectedBaseEntity().getControllerId()); + // targetAddUpdateWindowLayout.populateValuesOfTarget(getSelectedBaseEntity().getControllerId()); + openWindow(); + } + + private void openWindow() { final Window newDistWindow = targetAddUpdateWindowLayout.getWindow(); - targetAddUpdateWindowLayout.populateValuesOfTarget(getSelectedBaseEntity().getControllerId()); 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 a7d612f72..f96c3b174 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 @@ -102,15 +102,13 @@ public class CreateUpdateTargetTagLayoutWindow extends AbstractCreateUpdateTagLa @Override public void save(final ClickEvent event) { - if (mandatoryValuesPresent()) { - final TargetTag existingTag = tagManagement.findTargetTag(tagName.getValue()); - if (optiongroup.getValue().equals(createTagStr)) { - if (!checkIsDuplicate(existingTag)) { - createNewTag(); - } - } else { - updateExistingTag(existingTag); + final TargetTag existingTag = tagManagement.findTargetTag(tagName.getValue()); + if (optiongroup.getValue().equals(createTagStr)) { + if (!checkIsDuplicate(existingTag)) { + createNewTag(); } + } else { + updateExistingTag(existingTag); } } @@ -131,7 +129,6 @@ public class CreateUpdateTargetTagLayoutWindow extends AbstractCreateUpdateTagLa } newTargetTag = tagManagement.createTargetTag(newTargetTag); displaySuccess(newTargetTag.getName()); - closeWindow(); } else { displayValidationError(i18n.get(MESSAGE_ERROR_MISSING_TAGNAME)); } @@ -150,4 +147,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 2d180f67b..05eabf249 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 @@ -31,6 +31,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; @@ -56,8 +57,10 @@ import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Validator; +import com.vaadin.data.util.converter.StringToIntegerConverter; import com.vaadin.data.validator.IntegerRangeValidator; -import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.data.validator.NullValidator; +import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.ComboBox; @@ -66,13 +69,10 @@ import com.vaadin.ui.Label; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; -import com.vaadin.ui.UI; import com.vaadin.ui.themes.ValoTheme; /** - * * Rollout add or update popup layout. - * */ @SpringComponent @ViewScope @@ -86,8 +86,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private static final String MESSAGE_ENTER_NUMBER = "message.enter.number"; - private static final String NUMBER_REGEXP = "[-]?[0-9]*\\.?,?[0-9]+"; - @Autowired private ActionTypeOptionGroupLayout actionTypeOptionGroupLayout; @@ -115,8 +113,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { @Autowired private transient EventBus.SessionEventBus eventBus; - private Label mandatoryLabel; - private TextField rolloutName; private ComboBox distributionSet; @@ -135,7 +131,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private OptionGroup errorThresholdOptionGroup; - private CommonDialogWindow addUpdateRolloutWindow; + private CommonDialogWindow window; private Boolean editRolloutEnabled; @@ -147,22 +143,28 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private TextArea targetFilterQuery; + private final NullValidator nullValidator = new NullValidator(null, false); + /** * Create components and layout. */ public void init() { - setSizeUndefined(); createRequiredComponents(); buildLayout(); } - public CommonDialogWindow getWindow() { + public CommonDialogWindow getWindow(final Long rolloutId) { + window = getWindow(); + populateData(rolloutId); + return window; + } - addUpdateRolloutWindow = SPUIComponentProvider.getWindow(i18n.get("caption.configure.rollout"), null, - SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onRolloutSave(), event -> onDiscard(), - uiProperties.getLinks().getDocumentation().getRolloutView()); - return addUpdateRolloutWindow; + public CommonDialogWindow getWindow() { + resetComponents(); + return SPUIWindowDecorator.getWindow(i18n.get("caption.configure.rollout"), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onRolloutSave(), null, + uiProperties.getLinks().getDocumentation().getRolloutView(), this, i18n); } /** @@ -179,10 +181,8 @@ 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; @@ -206,37 +206,60 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { setSizeUndefined(); setRows(9); setColumns(3); + setStyleName("marginTop"); - addComponent(mandatoryLabel, 1, 0, 2, 0); - addComponent(getLabel("textfield.name"), 0, 1); - addComponent(rolloutName, 1, 1); - addComponent(getLabel("prompt.distribution.set"), 0, 2); - addComponent(distributionSet, 1, 2); - addComponent(getLabel("prompt.target.filter"), 0, 3); - addComponent(targetFilterQueryCombo, 1, 3); - addComponent(totalTargetsLabel, 2, 3); - addComponent(getLabel("prompt.number.of.groups"), 0, 4); - addComponent(noOfGroups, 1, 4); - addComponent(groupSizeLabel, 2, 4); - addComponent(getLabel("prompt.tigger.threshold"), 0, 5); - addComponent(triggerThreshold, 1, 5); - addComponent(getPercentHintLabel(), 2, 5); - addComponent(getLabel("prompt.error.threshold"), 0, 6); - addComponent(errorThreshold, 1, 6); - addComponent(errorThresholdOptionGroup, 2, 6); - addComponent(getLabel("textfield.description"), 0, 7); - addComponent(description, 1, 7, 2, 7); - addComponent(actionTypeOptionGroupLayout, 0, 8, 2, 8); + addComponent(getMandatoryLabel("textfield.name"), 0, 0); + addComponent(rolloutName, 1, 0); + rolloutName.addValidator(nullValidator); + + addComponent(getMandatoryLabel("prompt.distribution.set"), 0, 1); + addComponent(distributionSet, 1, 1); + distributionSet.addValidator(nullValidator); + + addComponent(getMandatoryLabel("prompt.target.filter"), 0, 2); + addComponent(targetFilterQueryCombo, 1, 2); + targetFilterQueryCombo.addValidator(nullValidator); + targetFilterQuery.removeValidator(nullValidator); + + addComponent(totalTargetsLabel, 2, 2); + + addComponent(getMandatoryLabel("prompt.number.of.groups"), 0, 3); + addComponent(noOfGroups, 1, 3); + noOfGroups.addValidator(nullValidator); + + addComponent(groupSizeLabel, 2, 3); + + addComponent(getMandatoryLabel("prompt.tigger.threshold"), 0, 4); + addComponent(triggerThreshold, 1, 4); + triggerThreshold.addValidator(nullValidator); + + addComponent(getPercentHintLabel(), 2, 4); + + addComponent(getMandatoryLabel("prompt.error.threshold"), 0, 5); + addComponent(errorThreshold, 1, 5); + errorThreshold.addValidator(nullValidator); + addComponent(errorThresholdOptionGroup, 2, 5); + + addComponent(getLabel("textfield.description"), 0, 6); + addComponent(description, 1, 6, 2, 6); + addComponent(actionTypeOptionGroupLayout, 0, 7, 2, 7); rolloutName.focus(); } + private Label getMandatoryLabel(final String key) { + final Label mandatoryLabel = getLabel(i18n.get(key)); + mandatoryLabel.setContentMode(ContentMode.HTML); + mandatoryLabel.setValue(mandatoryLabel.getValue().concat(" *")); + return mandatoryLabel; + } + private Label getLabel(final String key) { return SPUIComponentProvider.getLabel(i18n.get(key), SPUILabelDefinitions.SP_LABEL_SIMPLE); } private TextField getTextfield(final String key) { - return SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY, true, null, i18n.get(key), true, + return SPUIComponentProvider.getTextField(null, "", ValoTheme.TEXTFIELD_TINY, false, null, i18n.get(key), true, SPUILabelDefinitions.TEXT_FIELD_MAX_LENGTH); } @@ -248,7 +271,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void createRequiredComponents() { - mandatoryLabel = createMandatoryLabel(); rolloutName = createRolloutNameField(); distributionSet = createDistributionSetCombo(); populateDistributionSet(); @@ -258,7 +280,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroups = createNoOfGroupsField(); groupSizeLabel = createGroupSizeLabel(); - triggerThreshold = createTriggerThresold(); + triggerThreshold = createTriggerThreshold(); errorThreshold = createErrorThreshold(); description = createDescription(); errorThresholdOptionGroup = createErrorThresholdOptionGroup(); @@ -307,11 +329,11 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { errorThresoldOptions.addStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL); errorThresoldOptions.addStyleName(SPUIStyleDefinitions.ROLLOUT_OPTION_GROUP); errorThresoldOptions.setSizeUndefined(); - errorThresoldOptions.addValueChangeListener(this::onErrorThresoldOptionChange); + errorThresoldOptions.addValueChangeListener(this::listenerOnErrorThresoldOptionChange); return errorThresoldOptions; } - private void onErrorThresoldOptionChange(final ValueChangeEvent event) { + private void listenerOnErrorThresoldOptionChange(final ValueChangeEvent event) { errorThreshold.clear(); errorThreshold.removeAllValidators(); if (event.getProperty().getValue().equals(ERRORTHRESOLDOPTIONS.COUNT.getValue())) { @@ -324,17 +346,17 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private ComboBox createTargetFilterQueryCombo() { final ComboBox targetFilter = SPUIComponentProvider.getComboBox(null, "", "", null, ValoTheme.COMBOBOX_SMALL, - true, "", i18n.get("prompt.target.filter")); + false, "", i18n.get("prompt.target.filter")); targetFilter.setImmediate(true); targetFilter.setPageLength(7); targetFilter.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); targetFilter.setId(SPUIComponentIdProvider.ROLLOUT_TARGET_FILTER_COMBO_ID); targetFilter.setSizeUndefined(); - targetFilter.addValueChangeListener(event -> onTargetFilterChange()); + targetFilter.addValueChangeListener(this::onTargetFilterChange); return targetFilter; } - private void onTargetFilterChange() { + private void onTargetFilterChange(final ValueChangeEvent event) { final String filterQueryString = getTargetFilterQuery(); if (!Strings.isNullOrEmpty(filterQueryString)) { totalTargetsCount = targetManagement.countTargetByTargetFilterQuery(filterQueryString); @@ -344,7 +366,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { totalTargetsCount = 0L; totalTargetsLabel.setVisible(false); } - onGroupNumberChange(); + onGroupNumberChange(event); } private String getTotalTargetMessage() { @@ -368,10 +390,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { targetFilterQF); } - private void onDiscard() { - closeThisWindow(); - } - private void onRolloutSave() { if (editRolloutEnabled) { editRollout(); @@ -381,7 +399,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void editRollout() { - if (mandatoryCheckForEdit() && validateFields() && duplicateCheckForEdit() && null != rolloutForEdit) { + if (duplicateCheckForEdit() && rolloutForEdit != null) { rolloutForEdit.setName(rolloutName.getValue()); rolloutForEdit.setDescription(description.getValue()); final DistributionSetIdName distributionSetIdName = (DistributionSetIdName) distributionSet.getValue(); @@ -399,7 +417,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { final Rollout updatedRollout = rolloutManagement.updateRollout(rolloutForEdit); uiNotification .displaySuccess(i18n.get("message.update.success", new Object[] { updatedRollout.getName() })); - closeThisWindow(); eventBus.publish(this, RolloutEvent.UPDATE_ROLLOUT); } } @@ -427,11 +444,10 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void createRollout() { - if (mandatoryCheck() && validateFields() && duplicateCheck()) { + if (duplicateCheck()) { final Rollout rolloutToCreate = saveRollout(); uiNotification.displaySuccess(i18n.get("message.save.success", new Object[] { rolloutToCreate.getName() })); eventBus.publish(this, RolloutEvent.CREATE_ROLLOUT); - closeThisWindow(); } } @@ -488,48 +504,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { return true; } - private void closeThisWindow() { - addUpdateRolloutWindow.close(); - UI.getCurrent().removeWindow(addUpdateRolloutWindow); - } - - private boolean mandatoryCheck() { - final DistributionSetIdName ds = getDistributionSetSelected(); - final String targetFilter = (String) targetFilterQueryCombo.getValue(); - final String triggerThresoldValue = triggerThreshold.getValue(); - final String errorThresoldValue = errorThreshold.getValue(); - if (hasNoNameOrTargetFilter(targetFilter) || ds == null - || HawkbitCommonUtil.trimAndNullIfEmpty(noOfGroups.getValue()) == null - || isThresholdValueMissing(triggerThresoldValue, errorThresoldValue)) { - uiNotification.displayValidationError(i18n.get("message.mandatory.check")); - return false; - } - return true; - } - - private boolean mandatoryCheckForEdit() { - final DistributionSetIdName ds = getDistributionSetSelected(); - final String targetFilter = targetFilterQuery.getValue(); - final String triggerThresoldValue = triggerThreshold.getValue(); - final String errorThresoldValue = errorThreshold.getValue(); - if (hasNoNameOrTargetFilter(targetFilter) || ds == null - || HawkbitCommonUtil.trimAndNullIfEmpty(noOfGroups.getValue()) == null - || isThresholdValueMissing(triggerThresoldValue, errorThresoldValue)) { - uiNotification.displayValidationError(i18n.get("message.mandatory.check")); - return false; - } - return true; - } - - private boolean hasNoNameOrTargetFilter(final String targetFilter) { - return getRolloutName() == null || targetFilter == null; - } - - private boolean isThresholdValueMissing(final String triggerThresoldValue, final String errorThresoldValue) { - return HawkbitCommonUtil.trimAndNullIfEmpty(triggerThresoldValue) == null - || HawkbitCommonUtil.trimAndNullIfEmpty(errorThresoldValue) == null; - } - private boolean duplicateCheck() { if (rolloutManagement.findRolloutByName(getRolloutName()) != null) { uiNotification.displayValidationError( @@ -555,17 +529,23 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private TextField createErrorThreshold() { final TextField errorField = getTextfield("prompt.error.threshold"); + errorField.setNullRepresentation(""); errorField.addValidator(new ThresholdFieldValidator()); + errorField.setConverter(new StringToIntegerConverter()); + errorField.setConversionError(i18n.get(MESSAGE_ENTER_NUMBER)); errorField.setId(SPUIComponentIdProvider.ROLLOUT_ERROR_THRESOLD_ID); errorField.setMaxLength(7); errorField.setSizeUndefined(); return errorField; } - private TextField createTriggerThresold() { + private TextField createTriggerThreshold() { final TextField thresholdField = getTextfield("prompt.tigger.threshold"); thresholdField.setId(SPUIComponentIdProvider.ROLLOUT_TRIGGER_THRESOLD_ID); + thresholdField.setNullRepresentation(""); thresholdField.addValidator(new ThresholdFieldValidator()); + thresholdField.setConverter(new StringToIntegerConverter()); + thresholdField.setConversionError(i18n.get(MESSAGE_ENTER_NUMBER)); thresholdField.setSizeUndefined(); thresholdField.setMaxLength(3); return thresholdField; @@ -577,12 +557,15 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroupsField.addValidator(new GroupNumberValidator()); noOfGroupsField.setSizeUndefined(); noOfGroupsField.setMaxLength(3); - noOfGroupsField.addValueChangeListener(evevt -> onGroupNumberChange()); + noOfGroupsField.setConverter(new StringToIntegerConverter()); + noOfGroupsField.setConversionError(i18n.get(MESSAGE_ENTER_NUMBER)); + noOfGroupsField.addValueChangeListener(this::onGroupNumberChange); + noOfGroupsField.setNullRepresentation(""); return noOfGroupsField; } - private void onGroupNumberChange() { - if (noOfGroups.isValid() && !Strings.isNullOrEmpty(noOfGroups.getValue())) { + private void onGroupNumberChange(final ValueChangeEvent event) { + if (event.getProperty().getValue() != null && noOfGroups.isValid()) { groupSizeLabel.setValue(getTargetPerGroupMessage(String.valueOf(getGroupSize()))); groupSizeLabel.setVisible(true); } else { @@ -591,8 +574,8 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private ComboBox createDistributionSetCombo() { - final ComboBox dsSet = SPUIComponentProvider.getComboBox(null, "", "", null, ValoTheme.COMBOBOX_SMALL, true, "", - i18n.get("prompt.distribution.set")); + final ComboBox dsSet = SPUIComponentProvider.getComboBox(null, "", "", null, ValoTheme.COMBOBOX_SMALL, false, + "", i18n.get("prompt.distribution.set")); dsSet.setImmediate(true); dsSet.setPageLength(7); dsSet.setItemCaptionPropertyId(SPUILabelDefinitions.VAR_NAME); @@ -612,7 +595,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { return new LazyQueryContainer( new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_DIST_ID_NAME), distributionQF); - } private TextField createRolloutNameField() { @@ -622,44 +604,42 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { return rolloutNameField; } - private Label createMandatoryLabel() { - final Label madatoryLbl = new Label(i18n.get("label.mandatory.field")); - madatoryLbl.addStyleName(SPUIStyleDefinitions.SP_TEXTFIELD_ERROR + " " + ValoTheme.LABEL_SMALL); - return madatoryLbl; - } - private String getRolloutName() { return HawkbitCommonUtil.trimAndNullIfEmpty(rolloutName.getValue()); } - private DistributionSetIdName getDistributionSetSelected() { - return (DistributionSetIdName) distributionSet.getValue(); - } - class ErrorThresoldOptionValidator implements Validator { private static final long serialVersionUID = 9049939751976326550L; @Override public void validate(final Object value) { try { - if (HawkbitCommonUtil.trimAndNullIfEmpty(noOfGroups.getValue()) == null - || HawkbitCommonUtil.trimAndNullIfEmpty((String) targetFilterQueryCombo.getValue()) == null) { + if (isNoOfGroupsOrTargetFilterEmpty()) { uiNotification .displayValidationError(i18n.get("message.rollout.noofgroups.or.targetfilter.missing")); } else { - new RegexpValidator(NUMBER_REGEXP, i18n.get(MESSAGE_ENTER_NUMBER)).validate(value); - final int groupSize = getGroupSize(); - new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, groupSize), 0, groupSize) - .validate(Integer.valueOf(value.toString())); + if (value != null) { + final int groupSize = getGroupSize(); + new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, groupSize), 0, + groupSize).validate(Integer.valueOf(value.toString())); + } } } // suppress the need of preserve original exception, will blow // up the // log and not necessary here - catch (@SuppressWarnings("squid:S1166") final InvalidValueException ex) { - LOG.error(ex.getMessage()); + catch (final InvalidValueException ex) { + // we have to throw the exception here, otherwise the UI won't + // show the vaadin validation error! + throw ex; } } + + private boolean isNoOfGroupsOrTargetFilterEmpty() { + return HawkbitCommonUtil.trimAndNullIfEmpty(noOfGroups.getValue()) == null + || (HawkbitCommonUtil.trimAndNullIfEmpty((String) targetFilterQueryCombo.getValue()) == null + && targetFilterQuery.getValue() == null); + } } private int getGroupSize() { @@ -672,15 +652,18 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { @Override public void validate(final Object value) { try { - new RegexpValidator(NUMBER_REGEXP, i18n.get(MESSAGE_ENTER_NUMBER)).validate(value); - new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, 100), 0, 100) - .validate(Integer.valueOf(value.toString())); + if (value != null) { + new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, 100), 0, 100) + .validate(Integer.valueOf(value.toString())); + } } // suppress the need of preserve original exception, will blow // up the // log and not necessary here - catch (@SuppressWarnings("squid:S1166") final InvalidValueException ex) { - LOG.error(ex.getMessage()); + catch (final InvalidValueException ex) { + // we have to throw the exception here, otherwise the UI won't + // show the vaadin validation error! + throw ex; } } } @@ -691,15 +674,18 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { @Override public void validate(final Object value) { try { - new RegexpValidator(NUMBER_REGEXP, i18n.get(MESSAGE_ENTER_NUMBER)).validate(value); - new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, 500), 0, 500) - .validate(Integer.valueOf(value.toString())); + if (value != null) { + new IntegerRangeValidator(i18n.get(MESSAGE_ROLLOUT_FIELD_VALUE_RANGE, 0, 500), 0, 500) + .validate(Integer.valueOf(value.toString())); + } } // suppress the need of preserve original exception, will blow // up the // log and not necessary here - catch (@SuppressWarnings("squid:S1166") final InvalidValueException ex) { - LOG.error(ex.getMessage()); + catch (final InvalidValueException ex) { + // we have to throw the exception here, otherwise the UI won't + // show the vaadin validation error! + throw ex; } } } @@ -711,15 +697,18 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { * @param rolloutId * rollout id */ - public void populateData(final Long rolloutId) { - resetComponents(); + private void populateData(final Long rolloutId) { + if (rolloutId == null) { + return; + } + editRolloutEnabled = Boolean.TRUE; rolloutForEdit = rolloutManagement.findRolloutById(rolloutId); rolloutName.setValue(rolloutForEdit.getName()); description.setValue(rolloutForEdit.getDescription()); distributionSet.setValue(DistributionSetIdName.generate(rolloutForEdit.getDistributionSet())); final List rolloutGroups = rolloutForEdit.getRolloutGroups(); - setThresoldValues(rolloutGroups); + setThresholdValues(rolloutGroups); setActionType(rolloutForEdit); if (rolloutForEdit.getStatus() != RolloutStatus.READY) { disableRequiredFieldsOnEdit(); @@ -727,12 +716,16 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { noOfGroups.setEnabled(false); targetFilterQuery.setValue(rolloutForEdit.getTargetFilterQuery()); - removeComponent(targetFilterQueryCombo); - addComponent(targetFilterQuery, 1, 3); + removeComponent(1, 2); + targetFilterQueryCombo.removeValidator(nullValidator); + addComponent(targetFilterQuery, 1, 2); + targetFilterQuery.addValidator(nullValidator); totalTargetsCount = targetManagement.countTargetByTargetFilterQuery(rolloutForEdit.getTargetFilterQuery()); totalTargetsLabel.setValue(getTotalTargetMessage()); totalTargetsLabel.setVisible(true); + + window.setOrginaleValues(); } private void disableRequiredFieldsOnEdit() { @@ -771,8 +764,8 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { /** * @param rolloutGroups */ - private void setThresoldValues(final List rolloutGroups) { - if (null != rolloutGroups && !rolloutGroups.isEmpty()) { + private void setThresholdValues(final List rolloutGroups) { + if (rolloutGroups != null && !rolloutGroups.isEmpty()) { errorThreshold.setValue(rolloutGroups.get(0).getErrorConditionExp()); triggerThreshold.setValue(rolloutGroups.get(0).getSuccessConditionExp()); noOfGroups.setValue(String.valueOf(rolloutGroups.size())); @@ -798,7 +791,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { public String getValue() { return value; } - } enum ERRORTHRESOLDOPTIONS { @@ -816,6 +808,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..db4fbb929 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,14 +63,11 @@ 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; /** - * * Rollout list grid component. - * */ @SpringComponent @ViewScope @@ -159,7 +157,6 @@ public class RolloutListGrid extends AbstractGrid { } item.getItemProperty(ROLLOUT_RENDERER_DATA) .setValue(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString())); - } @Override @@ -200,7 +197,6 @@ public class RolloutListGrid extends AbstractGrid { rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.ACTION, String.class, FontAwesome.CIRCLE_O.getHtml(), false, false); - } @Override @@ -292,7 +288,6 @@ public class RolloutListGrid extends AbstractGrid { for (final Object propertyId : columnsToBeHidden) { getColumn(propertyId).setHidden(true); } - } @Override @@ -315,7 +310,6 @@ public class RolloutListGrid extends AbstractGrid { final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class); customObjectRenderer.addClickListener(this::onClickOfRolloutName); getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer); - } private void createRolloutStatusToFontMap() { @@ -437,8 +431,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.getWindow(contextMenuData.getRolloutId()); addTargetWindow.setCaption(i18n.get("caption.update.rollout")); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); @@ -684,7 +677,6 @@ public class RolloutListGrid extends AbstractGrid { public Class getPresentationType() { return String.class; } - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListHeader.java index 1a3d2d7a5..81608d42d 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 @@ -91,7 +91,6 @@ public class RolloutListHeader extends AbstractGridHeader { @Override protected void addNewItem(final ClickEvent event) { - addUpdateRolloutWindow.resetComponents(); final Window addTargetWindow = addUpdateRolloutWindow.getWindow(); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java index b4e89a191..826985162 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java @@ -176,6 +176,10 @@ public final class SPUIComponentIdProvider { * ID - Dist jvm combo. */ public static final String DIST_MODULE_COMBO = "dist.module.combo."; + /** + * ID for Distribution Tag ComboBox + */ + public static final String DIST_TAG_COMBO = "dist.tag.combo"; /** * ID-Dist.PIN. */ @@ -302,6 +306,22 @@ public final class SPUIComponentIdProvider { * tag color preview button id. */ public static final String TAG_COLOR_PREVIEW_ID = "tag.color.preview"; + /** + * Id for ColorPickerLayout + */ + public static final String COLOR_PICKER_LAYOUT = "color.picker.layout"; + /** + * Id for ColorPickerLayout's red slider + */ + public static final String COLOR_PICKER_RED_SLIDER = "color.picker.red.slider"; + /** + * Id for Color preview field with the color code + */ + public static final String COLOR_PREVIEW_FIELD = "color-preview-field"; + /** + * Id for OptionGroup Create/Update tag + */ + public static final String OPTION_GROUP = "create.update.tag"; /** * Confirmation dialogue OK button id. */ @@ -915,6 +935,11 @@ public final class SPUIComponentIdProvider { */ public static final String UPLOAD_STATUS_POPUP_ID = "artifact.upload.status.popup.id"; + /** + * Table multiselect for selecting DistType + */ + public static final String SELECT_DIST_TYPE = "select-dist-type"; + /** * /* Private Constructor. */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java index 1a6e8c163..e955c9f97 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java @@ -344,15 +344,6 @@ public final class SPUIDefinitions { * New Target tag color lable id. */ public static final String NEW_TARGET_TAG_COLOR = "target.tag.add.color"; - /** - * New Target tag save icon id. - */ - // public static final String NEW_TARGET_TAG_SAVE = "target.tag.add.save"; - /** - * New Target tag discard icon id. - */ - // public static final String NEW_TARGET_TAG_DISRACD = - // "target.tag.add.discard"; /** * New Target tag add icon id. */ diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-common.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-common.scss index 457fc266d..b8e6b1755 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-common.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/popup-common.scss @@ -53,4 +53,7 @@ font-size: 16px; } + .marginTop { + margin-top: 20px !important; + } } diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index 1fee8dcdb..c18815b2b 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -79,14 +79,14 @@ caption.delete.swmodule.accordion.tab = Delete SW Modules caption.delete.dist.set.type.accordion.tab = Delete Distribution Set Type caption.delete.sw.module.type.accordion.tab = Delete Software Module Type caption.attributes = Attributes -caption.panel.dist.installed = Installed distribution set -caption.panel.dist.assigned = Assigned distribution set +caption.panel.dist.installed = Installed Distribution Set +caption.panel.dist.assigned = Assigned Distribution Set caption.soft.delete.confirmbox = Confirm Software Module Delete Action -caption.cancel.action.confirmbox = Confirm action cancel +caption.cancel.action.confirmbox = Confirm Action Cancellation caption.forcequit.action.confirmbox = Confirm force quit action caption.forced.datefield = Force update at time caption.force.action.confirmbox = Confirm Force Active Action -caption.confirm.abort.action = Confirm abort action +caption.confirm.abort.action = Confirm Abort Action caption.filter.delete.confirmbox = Confirm Filter Delete Action @@ -220,7 +220,7 @@ message.duplicate.softwaremodule = {0} : {1} already exists! message.tag.delete = Please unclick the tag {0}, then try to delete message.dist.type.check.delete = Please unclick the distribution type {0}, then try to delete message.cannot.delete.default.dstype = Default distribution set type cannot be deleted -message.swmodule.type.check.delete = Please unclick the software module type {0}, then try to delete +message.swmodule.type.check.delete = Please unclick the Software Module type {0}, then try to delete message.targets.already.deleted = Few Target(s) are already deleted.Pending for action message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action message.target.deleted.pending = Target(s) already deleted.Pending for action @@ -262,10 +262,10 @@ message.dists.assign.tag.alreadyassigned = Few of the DistributionSet's are alre message.dists.tag.assigned = {0} DistributionSet's assigned to Tag {1} message.dists.tag.unassigned = {0} DistributionSet's un-assigned from Tag {1} message.dist.no.operation = {0} - already assigned/installed, No operation -message.sm.delete.confirm = Are you sure that you want to delete the selected {0} software module? +message.sm.delete.confirm = Are you sure that you want to delete the selected {0} Software Module? message.error.os.softmodule = Please select the OS to delete message.error.ah.softmodule = Please select the Application to delete -message.error.softmodule.deleted = The selected software module is already deleted +message.error.softmodule.deleted = The selected Software Module is already deleted message.cancel.action = Cancel.. message.cancel.action.success = Action cancelled successfully ! message.cancel.action.failed = Unable to cancel the action ! @@ -284,7 +284,7 @@ message.action.not.allowed = Action not allowed message.onlyone.distribution.assigned = Only one distribution set can be assigned message.onlyone.distribution.dropallowed = Only one distribution set can be dropped message.error.missing.typename = Missing Type Name -message.error.missing.typenameorkey = Missing Type Name or Key or software module type +message.error.missing.typenameorkey = Missing Type Name or Key or Software Module type message.tag.cannot.be.assigned = Target/DS cannot be assigned to {0} message.no.targets.assiged.fortag = No targets are assigned to tag {0} message.error.missing.tagname = Please select tag name @@ -314,12 +314,12 @@ soft.module.os =OS #Artifact upload message.error.noFileSelected = No file selected for upload message.error.noProvidedName = Please provide custom file name -message.error.noSwModuleSelected = Please select a software module +message.error.noSwModuleSelected = Please select a Software Module message.no.duplicateFiles = Duplicate files selected message.no.duplicateFile = Duplicate file selected : message.delete.artifact = Are you sure that you want to delete artifact {0} ? message.duplicate.filename = Duplicate file name -message.swModule.deleted = {0} Software module(s) deleted +message.swModule.deleted = {0} Software Module(s) deleted message.upload.failed = Streaming Failed message.uploadedfile.size.exceeded = File size exceeded .Allowed size {0} bytes message.uploadedfile.aborted = File upload aborted @@ -329,7 +329,7 @@ message.abort.upload = Are you sure that you want to abort the upload? -upload.swModuleTable.header = Software module +upload.swModuleTable.header = Software Module upload.selectedfile.name = file selected for upload upload.file.name = File name upload.sha1 = SHA1 checksum @@ -347,7 +347,7 @@ upload.reason = Reason upload.action = Action upload.result.status = Upload status upload.file = Upload File -upload.caption.update.swmodule = Update software module +upload.caption.update.swmodule = Update Software Module caption.tab.details = Details caption.tab.description = Description @@ -363,8 +363,8 @@ label.no.tag.assigned = NO TAG caption.assign.software.dist.accordion.tab = Assign Software Modules message.software.assignment = {0} Software Module(s) Assignment(s) done message.dist.inuse = {0} Distribution is already assigned to target -message.software.dist.already.assigned = {0} Distribution already has software module {1} -message.software.dist.type.notallowed = {0} Software module type can not assign to Distribution {1} +message.software.dist.already.assigned = {0} Distribution already has Software Module {1} +message.software.dist.type.notallowed = {0} Software Module type can not assign to Distribution {1} message.target.assigned = {0} is assigned to {1} message.dist.type.delete = {0} DistributionType(s) Deleted successfully. message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully. @@ -445,7 +445,7 @@ header.caption.mandatory = Mandatory header.caption.typename = SoftwareModuleType header.caption.softwaremodule = SoftwareModule header.caption.unassign = Unassign -message.sw.unassigned = Software module {0} successfully unassigned +message.sw.unassigned = Software Module {0} successfully unassigned header.caption.upload.details = Upload details combo.type.tag.name = Type tag name @@ -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 -caption.configure.rollout = Configure rollout -caption.update.rollout = Update rollout -prompt.target.filter = Custom target filter +prompt.distribution.set = Distribution Set +caption.configure.rollout = Configure Rollout +caption.update.rollout = Update Rollout +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. @@ -485,8 +485,8 @@ message.rollout.noofgroups.or.targetfilter.missing = Please enter number of grou message.rollouts = Rollouts label.target.per.group = Targets per group : message.dist.already.assigned = Distribution {0} is already assigned to target -message.error.creating.rollout = Server error. Error creating rollout. Please contact the administrator -message.error.starting.rollout = Server error. Error starting rollout. Please contact the administrator +message.error.creating.rollout = Server error. Error creating Rollout. Please contact the administrator +message.error.starting.rollout = Server error. Error starting Rollout. Please contact the administrator #rollout - end #Menu diff --git a/hawkbit-ui/src/main/resources/messages_de.properties b/hawkbit-ui/src/main/resources/messages_de.properties index 4134a7466..9e64e20c6 100644 --- a/hawkbit-ui/src/main/resources/messages_de.properties +++ b/hawkbit-ui/src/main/resources/messages_de.properties @@ -77,16 +77,16 @@ caption.delete.swmodule.accordion.tab = Delete SW Modules caption.delete.dist.set.type.accordion.tab = Delete Distribution Set Type caption.delete.sw.module.type.accordion.tab = Delete Software Module Type caption.attributes = Attributes -caption.panel.dist.installed = Installed distribution set -caption.panel.dist.assigned = Assigned distribution set +caption.panel.dist.installed = Installed Distribution Set +caption.panel.dist.assigned = Assigned Distribution Set caption.soft.delete.confirmbox = Confirm Software Module Delete Action -caption.cancel.action.confirmbox = Confirm action cancellation +caption.cancel.action.confirmbox = Confirm Action Cancellation caption.forced.datefield = Force update at time caption.force.action.confirmbox = Confirm Force Active Action caption.filter.simple = Simple Filter caption.filter.custom = Custom Filter caption.filter.delete.confirmbox = Confirm Filter Delete Action -caption.confirm.abort.action = Confirm abort action +caption.confirm.abort.action = Confirm Abort Action # Labels prefix with - label @@ -214,13 +214,13 @@ message.target.unassigned.one = {0} is unassigned from {1} message.target.unassigned.many = {0} Targets are unassigned from {1} message.target.assigned.pending = Some target(s) are already assigned.Pending for action message.cannot.delete = Cannot be deleted -message.check.softwaremodule = Please provide both name and verion! +message.check.softwaremodule = Please provide both name and version! message.cannot.delete.default.dstype = Default distribution set type cannot be deleted message.duplicate.softwaremodule = {0} : {1} already exists! message.cannot.delete.default.dstype = Default distribution set type cannot be deleted message.tag.delete = Please unclick the tag {0}, then try to delete message.dist.type.check.delete = Please unclick the distribution type {0}, then try to delete -message.swmodule.type.check.delete = Please unclick the software module type {0}, then try to delete +message.swmodule.type.check.delete = Please unclick the Software Module type {0}, then try to delete message.targets.already.deleted = Few Target(s) are already deleted.Pending for action message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action message.target.deleted.pending = Target(s) already deleted.Pending for action @@ -243,7 +243,7 @@ message.accessdenied.view = No access to view: {0} message.no.data = No data available message.target.assignment = {0} Assignment(s) done message.target.deleted = {0} Target(s) deleted -message.dist.deleted = {0} Distribution set(s) deleted +message.dist.deleted = {0} Distribution Set(s) deleted message.tag.update.mandatory = Please select the Tag to update message.tag.duplicate.check = {0} already exists, please enter another value message.type.key.duplicate.check = Distribution type with key {0} already exists, please give another value @@ -262,10 +262,10 @@ message.dists.assign.tag.alreadyassigned = Few of the DistributionSet's are alre message.dists.tag.assigned = {0} DistributionSet's assigned to Tag {1} message.dists.tag.unassigned = {0} DistributionSet's un-assigned from Tag {1} message.dist.no.operation = {0} - already assigned/installed, No operation -message.sm.delete.confirm = Are you sure that you want to delete the selected {0} software module? +message.sm.delete.confirm = Are you sure that you want to delete the selected {0} Software Module? message.error.os.softmodule = Please select the OS to delete message.error.ah.softmodule = Please select the Application to delete -message.error.softmodule.deleted = The selected software module is already deleted +message.error.softmodule.deleted = The selected Software Module is already deleted message.cancel.action = Cancel message.cancel.action.success = Action cancelled successfully ! message.cancel.action.failed = Unable to cancel the action ! @@ -307,12 +307,12 @@ soft.module.os =OS #Artifact upload message.error.noFileSelected = No file selected for upload message.error.noProvidedName = Please provide custom file name -message.error.noSwModuleSelected = Please select a software module +message.error.noSwModuleSelected = Please select a Software Module message.no.duplicateFiles = Duplicate files selected message.no.duplicateFile = Duplicate file selected : message.delete.artifact = Are you sure that you want to delete artifact {0} ? message.duplicate.filename = Duplicate file name -message.swModule.deleted = {0} Software module(s) deleted +message.swModule.deleted = {0} Software Module(s) deleted message.error.missing.tagname = Please select tag name message.upload.failed = Streaming Failed message.uploadedfile.size.exceeded = File size exceeded .Allowed size {0} bytes @@ -323,7 +323,7 @@ message.abort.upload = Are you sure that you want to abort the upload? -upload.swModuleTable.header = Software module +upload.swModuleTable.header = Software Module upload.selectedfile.name = file selected for upload upload.file.name = File name upload.sha1 = SHA1 checksum @@ -341,7 +341,7 @@ upload.reason = Reason upload.action = Action upload.result.status = Upload status upload.file = Upload File -upload.caption.update.swmodule = Update software module +upload.caption.update.swmodule = Update Software Module caption.tab.details = Details caption.tab.description = Description @@ -352,8 +352,8 @@ label.drop.dist.delete.area = Drop here
to delete caption.assign.software.dist.accordion.tab = Assign Software Modules message.software.assignment = {0} Assignment(s) done message.dist.inuse = {0} Distribution is already assigned to target -message.software.dist.already.assigned = {0} Distribution already has software module {1} -message.software.dist.type.notallowed = {0} Software module type can not assign to Distribution {1} +message.software.dist.already.assigned = {0} Distribution already has Software Module {1} +message.software.dist.type.notallowed = {0} Software Module type can not assign to Distribution {1} message.target.assigned = {0} is assigned to {1} message.dist.type.delete = {0} DistributionType(s) Deleted successfully. message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully. @@ -432,13 +432,13 @@ 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 header.caption.softwaremodule = SoftwareModule header.caption.unassign = Unassign -message.sw.unassigned = Software module {0} successfully unassigned +message.sw.unassigned = Software Module {0} successfully unassigned header.caption.upload.details = Upload details combo.type.tag.name = Type tag name @@ -454,10 +454,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 -caption.configure.rollout = Configure rollout -caption.update.rollout = Update rollout -prompt.target.filter = Custom target filter +prompt.distribution.set = Distribution Set +caption.configure.rollout = Configure Rollout +caption.update.rollout = Update Rollout +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. @@ -471,8 +471,8 @@ message.rollout.noofgroups.or.targetfilter.missing = Please enter number of grou message.rollouts = Rollouts label.target.per.group = Targets per group : message.dist.already.assigned = Distribution {0} is already assigned to target -message.error.creating.rollout = Server error. Error creating rollout. Please contact the administrator -message.error.starting.rollout = Server error. Error starting rollout. Please contact the administrator +message.error.creating.rollout = Server error. Error creating Rollout. Please contact the administrator +message.error.starting.rollout = Server error. Error starting Rollout. Please contact the administrator #Target Filter Management breadcrumb.target.filter.custom.filters = Custom Filters diff --git a/hawkbit-ui/src/main/resources/messages_en.properties b/hawkbit-ui/src/main/resources/messages_en.properties index 7716da4f2..b1a6bb970 100644 --- a/hawkbit-ui/src/main/resources/messages_en.properties +++ b/hawkbit-ui/src/main/resources/messages_en.properties @@ -79,14 +79,14 @@ caption.delete.swmodule.accordion.tab = Delete SW Modules caption.delete.dist.set.type.accordion.tab = Delete Distribution Set Type caption.delete.sw.module.type.accordion.tab = Delete Software Module Type caption.attributes = Attributes -caption.panel.dist.installed = Installed distribution set -caption.panel.dist.assigned = Assigned distribution set +caption.panel.dist.installed = Installed Distribution Set +caption.panel.dist.assigned = Assigned Distribution Set caption.soft.delete.confirmbox = Confirm Software Module Delete Action -caption.cancel.action.confirmbox = Confirm action cancellation +caption.cancel.action.confirmbox = Confirm Action Cancellation caption.forced.datefield = Force update at time caption.force.action.confirmbox = Confirm Force Active Action caption.filter.delete.confirmbox = Confirm Filter Delete Action -caption.confirm.abort.action = Confirm abort action +caption.confirm.abort.action = Confirm Abort Action # Labels prefix with - label label.dist.details.type = Type : @@ -213,11 +213,11 @@ message.target.unassigned.one = {0} is unassigned from {1} message.target.unassigned.many = {0} Targets are unassigned from {1} message.target.assigned.pending = Some target(s) are already assigned.Pending for action message.cannot.delete = Cannot be deleted -message.check.softwaremodule = Please provide both name and verion! +message.check.softwaremodule = Please provide both name and version! message.duplicate.softwaremodule = {0} : {1} already exists! message.tag.delete = Please unclick the tag {0}, then try to delete message.dist.type.check.delete = Please unclick the distribution type {0}, then try to delete -message.swmodule.type.check.delete = Please unclick the software module type {0}, then try to delete +message.swmodule.type.check.delete = Please unclick the Software Module type {0}, then try to delete message.targets.already.deleted = Few Target(s) are already deleted.Pending for action message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action message.target.deleted.pending = Target(s) already deleted.Pending for action @@ -259,10 +259,10 @@ message.dists.assign.tag.alreadyassigned = Few of the DistributionSet's are alre message.dists.tag.assigned = {0} DistributionSet's assigned to Tag {1} message.dists.tag.unassigned = {0} DistributionSet's un-assigned from Tag {1} message.dist.no.operation = {0} - already assigned/installed, No operation -message.sm.delete.confirm = Are you sure that you want to delete the selected {0} software module? +message.sm.delete.confirm = Are you sure that you want to delete the selected {0} Software Module? message.error.os.softmodule = Please select the OS to delete message.error.ah.softmodule = Please select the Application to delete -message.error.softmodule.deleted = The selected software module is already deleted +message.error.softmodule.deleted = The selected Software Module is already deleted message.cancel.action = Cancel message.cancel.action.success = Action cancelled successfully ! message.cancel.action.failed = Unable to cancel the action ! @@ -277,7 +277,7 @@ message.action.not.allowed = Action not allowed message.onlyone.distribution.assigned = Only one distribution set can be assigned message.onlyone.distribution.dropallowed = Only one distribution set can be dropped message.error.missing.typename = Missing Type Name -message.error.missing.typenameorkey = Missing Type Name or Key or software module type +message.error.missing.typenameorkey = Missing Type Name or Key or Software Module type message.tag.cannot.be.assigned = Target/DS cannot be assigned to {0} message.no.targets.assiged.fortag = No targets are assigned to tag {0} message.error.missing.tagname = Please select tag name @@ -305,12 +305,12 @@ soft.module.os =OS #Artifact upload message.error.noFileSelected = No file selected for upload message.error.noProvidedName = Please provide custom file name -message.error.noSwModuleSelected = Please select a software module +message.error.noSwModuleSelected = Please select a Software Module message.no.duplicateFiles = Duplicate files selected message.no.duplicateFile = Duplicate file selected : message.delete.artifact = Are you sure that you want to delete artifact {0} ? message.duplicate.filename = Duplicate file name -message.swModule.deleted = {0} Software module(s) deleted +message.swModule.deleted = {0} Software Module(s) deleted message.upload.failed = Streaming Failed message.uploadedfile.size.exceeded = File size exceeded .Allowed size {0} bytes message.uploadedfile.aborted = File upload aborted @@ -318,7 +318,7 @@ message.file.not.found = File not found message.abort.upload = Are you sure that you want to abort the upload? -upload.swModuleTable.header = Software module +upload.swModuleTable.header = Software Module upload.selectedfile.name = file selected for upload upload.file.name = File name upload.sha1 = SHA1 checksum @@ -336,7 +336,7 @@ upload.reason = Reason upload.action = Action upload.result.status = Upload status upload.file = Upload File -upload.caption.update.swmodule = Update software module +upload.caption.update.swmodule = Update Software Module caption.tab.details = Details caption.tab.description = Description @@ -348,8 +348,8 @@ label.drop.dist.delete.area = Drop here
to delete caption.assign.software.dist.accordion.tab = Assign Software Modules message.software.assignment = {0} Software Module(s) Assignment(s) done message.dist.inuse = {0} Distribution is already assigned to target -message.software.dist.already.assigned = {0} Distribution already has software module {1} -message.software.dist.type.notallowed = {0} Software module type can not assign to Distribution {1} +message.software.dist.already.assigned = {0} Distribution already has Software Module {1} +message.software.dist.type.notallowed = {0} Software Module type can not assign to Distribution {1} message.target.assigned = {0} is assigned to {1} message.dist.type.delete = {0} DistributionType(s) Deleted successfully. message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully. @@ -415,7 +415,7 @@ header.assigned.ds = Assigned DS header.installed.ds = Installed DS header.status = Status header.target.tags = Tags -header.distributionset = Distribution set +header.distributionset = Distribution Set header.numberofgroups = No. of groups header.detail.status = Detail status header.total.targets = Total targets @@ -429,7 +429,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 @@ -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 -caption.configure.rollout = Configure rollout -caption.update.rollout = Update rollout -prompt.target.filter = Custom target filter +prompt.distribution.set = Distribution Set +caption.configure.rollout = Configure Rollout +caption.update.rollout = Update Rollout +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. @@ -465,8 +465,8 @@ message.rollout.noofgroups.or.targetfilter.missing = Please enter number of grou message.rollouts = Rollouts label.target.per.group = Targets per group : message.dist.already.assigned = Distribution {0} is already assigned to target -message.error.creating.rollout = Server error. Error creating rollout. Please contact the administrator -message.error.starting.rollout = Server error. Error starting rollout. Please contact the administrator +message.error.creating.rollout = Server error. Error creating Rollout. Please contact the administrator +message.error.starting.rollout = Server error. Error starting Rollout. Please contact the administrator #Target Filter Management breadcrumb.target.filter.custom.filters = Custom Filters diff --git a/pom.xml b/pom.xml index 444883bba..5995b8faf 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,7 @@ 1.1 1.1.1 3.4 + 4.0 20141113 2.0.0 @@ -560,6 +561,11 @@ commons-lang3 ${commons-lang3.version}
+ + org.apache.commons + commons-collections4 + ${commons-collections4.version} + org.springframework.boot spring-boot-starter-test