From 39ccf65f2e0ea2113cf98cd1308e80de92ffe87f Mon Sep 17 00:00:00 2001 From: Anand Kumar Date: Mon, 11 Oct 2021 15:00:16 +0200 Subject: [PATCH] Feature target with target type in UI (#1178) * Added the target type combo box to add or update Target in UI Signed-off-by: Anand kumar * Fixed NPE for empty target type Signed-off-by: Anand kumar * Added target type option to target bulk upload Signed-off-by: Anand kumar * Added Target type filter Signed-off-by: Anand kumar * Added Named entity mapper for target type UI Signed-off-by: Anand kumar * Fixed review comments Signed-off-by: Anand kumar * Fixed sonar issues for serialization Signed-off-by: Anand kumar * Fixed Review comments Signed-off-by: Anand kumar * Fixed Bulk upload target type combo box Signed-off-by: Anand kumar --- .../repository/TargetTypeManagement.java | 13 ++++- .../jpa/JpaTargetTypeManagement.java | 6 +++ .../TargetTypeSpecification.java | 10 ++++ .../SmWindowLayoutComponentBuilder.java | 2 +- .../common/builder/FormComponentBuilder.java | 17 +++--- .../mappers/TargetToProxyTargetMapper.java | 6 +++ .../mappers/TargetTypeToTypeInfoMapper.java | 26 ++++++++++ .../providers/TargetTypeDataProvider.java | 52 +++++++++++++++++++ .../data/proxies/ProxyBulkUploadWindow.java | 14 ++++- .../ui/common/data/proxies/ProxyTarget.java | 15 +++++- .../ui/common/data/proxies/ProxyTypeInfo.java | 13 +++++ .../DsWindowLayoutComponentBuilder.java | 2 +- .../hawkbit/ui/management/DeploymentView.java | 5 +- .../bulkupload/BulkUploadHandler.java | 3 +- .../bulkupload/BulkUploadWindowBuilder.java | 11 ++-- ...ulkUploadWindowLayoutComponentBuilder.java | 29 ++++++++++- .../TargetBulkUpdateWindowLayout.java | 23 +++++--- .../bulkupload/TargetBulkUploadUiState.java | 16 ++++-- .../AddTargetWindowController.java | 3 +- .../management/targettable/TargetDetails.java | 2 + .../targettable/TargetGridLayout.java | 26 ++++++---- .../targettable/TargetWindowBuilder.java | 13 +++-- .../targettable/TargetWindowLayout.java | 23 +++++--- .../TargetWindowLayoutComponentBuilder.java | 26 ++++++++-- .../UpdateTargetWindowController.java | 13 ++++- .../ui/utils/UIComponentIdProvider.java | 10 ++++ .../src/main/resources/messages.properties | 1 + 27 files changed, 324 insertions(+), 56 deletions(-) create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetTypeToTypeInfoMapper.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/providers/TargetTypeDataProvider.java diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TargetTypeManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TargetTypeManagement.java index 8bab106f4..8b1b557c2 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TargetTypeManagement.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TargetTypeManagement.java @@ -14,7 +14,6 @@ import org.eclipse.hawkbit.repository.builder.TargetTypeUpdate; import org.eclipse.hawkbit.repository.model.TargetType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; import org.springframework.security.access.prepost.PreAuthorize; import javax.validation.Valid; @@ -84,6 +83,18 @@ public interface TargetTypeManagement { @PreAuthorize(SpPermission.SpringEvalExpressions.HAS_AUTH_READ_TARGET) Page findByRsql(@NotNull Pageable pageable, @NotEmpty String rsqlParam); + /** + * Retrieves {@link TargetType}s by filtering on the given parameters. + * + * @param pageable + * page parameter + * @param name + * has text of filters to be applied. + * @return the page of found {@link TargetType} + */ + @PreAuthorize(SpPermission.SpringEvalExpressions.HAS_AUTH_READ_TARGET) + Page findByName(@NotNull Pageable pageable, String name); + /** * @param id * Target type ID diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetTypeManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetTypeManagement.java index 84ea750f3..884104568 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetTypeManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetTypeManagement.java @@ -42,6 +42,7 @@ import org.springframework.orm.jpa.vendor.Database; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; /** @@ -139,6 +140,11 @@ public class JpaTargetTypeManagement implements TargetTypeManagement { return convertPage(targetTypeRepository.findAll(spec, pageable), pageable); } + @Override + public Page findByName(Pageable pageable, String name) { + return convertPage(targetTypeRepository.findAll(TargetTypeSpecification.likeName(name), pageable), pageable); + } + @Override public Optional get(final long id) { return targetTypeRepository.findById(id).map(targetType -> targetType); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetTypeSpecification.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetTypeSpecification.java index 734e7e986..edeefd654 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetTypeSpecification.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/TargetTypeSpecification.java @@ -146,4 +146,14 @@ public final class TargetTypeSpecification { return (targetRoot, query, cb) -> cb.equal(targetRoot.get(JpaTargetType_.name), name); } + /** + * {@link Specification} for retrieving {@link TargetType}s by "like name". + * + * @param name + * to be filtered on + * @return the {@link TargetType} {@link Specification} + */ + public static Specification likeName(final String name) { + return (targetRoot, query, cb) -> cb.like(cb.lower(targetRoot.get(JpaTargetType_.name)), name.toLowerCase()); + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowLayoutComponentBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowLayoutComponentBuilder.java index 21f63022e..6ed4d492a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowLayoutComponentBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowLayoutComponentBuilder.java @@ -56,7 +56,7 @@ public class SmWindowLayoutComponentBuilder { */ public ComboBox createSoftwareModuleTypeCombo(final Binder binder) { return FormComponentBuilder - .createTypeCombo(binder, smTypeDataProvider, i18n, UIComponentIdProvider.SW_MODULE_TYPE).getComponent(); + .createTypeCombo(binder, smTypeDataProvider, i18n, UIComponentIdProvider.SW_MODULE_TYPE, true).getComponent(); } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/builder/FormComponentBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/builder/FormComponentBuilder.java index ab87c773a..98e3e18bb 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/builder/FormComponentBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/builder/FormComponentBuilder.java @@ -10,6 +10,7 @@ package org.eclipse.hawkbit.ui.common.builder; import org.eclipse.hawkbit.repository.model.NamedEntity; import org.eclipse.hawkbit.repository.model.NamedVersionedEntity; +import org.eclipse.hawkbit.repository.model.TargetType; import org.eclipse.hawkbit.repository.model.Type; import org.eclipse.hawkbit.ui.common.data.aware.ActionTypeAware; import org.eclipse.hawkbit.ui.common.data.aware.DescriptionAware; @@ -22,6 +23,7 @@ import org.eclipse.hawkbit.ui.common.data.aware.VersionAware; import org.eclipse.hawkbit.ui.common.data.providers.AbstractProxyDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetStatelessDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.TargetFilterQueryDataProvider; +import org.eclipse.hawkbit.ui.common.data.providers.TargetTypeDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSetInfo; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; @@ -326,15 +328,18 @@ public final class FormComponentBuilder { */ public static BoundComponent> createTypeCombo( final Binder binder, final AbstractProxyDataProvider dataProvider, - final VaadinMessageSource i18n, final String componentId) { + final VaadinMessageSource i18n, final String componentId, final boolean isRequired) { final ComboBox typeCombo = SPUIComponentProvider.getComboBox(componentId, - i18n.getMessage(CAPTION_TYPE), i18n.getMessage(CAPTION_TYPE), i18n.getMessage(CAPTION_TYPE), false, - ProxyTypeInfo::getName, dataProvider); + i18n.getMessage(CAPTION_TYPE), i18n.getMessage(CAPTION_TYPE), i18n.getMessage(CAPTION_TYPE), !isRequired, + ProxyTypeInfo::getName, dataProvider.withConvertedFilter(filterString -> filterString.trim() + "%")); - final Binding binding = binder.forField(typeCombo) - .asRequired(i18n.getMessage("message.error.typeRequired")) - .bind(TypeInfoAware::getTypeInfo, TypeInfoAware::setTypeInfo); + final BindingBuilder bindingBuilder = binder.forField(typeCombo); + if (isRequired){ + bindingBuilder.asRequired(i18n.getMessage("message.error.typeRequired")); + } + + final Binding binding = bindingBuilder.bind(TypeInfoAware::getTypeInfo, TypeInfoAware::setTypeInfo); return new BoundComponent<>(typeCombo, binding); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetToProxyTargetMapper.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetToProxyTargetMapper.java index a2ec40fcf..79f7e4872 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetToProxyTargetMapper.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetToProxyTargetMapper.java @@ -12,7 +12,9 @@ import java.util.TimeZone; import org.eclipse.hawkbit.repository.model.PollStatus; import org.eclipse.hawkbit.repository.model.Target; +import org.eclipse.hawkbit.repository.model.TargetType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; @@ -49,6 +51,10 @@ public class TargetToProxyTargetMapper extends AbstractNamedEntityToProxyNamedEn proxyTarget.setPollStatusToolTip(getPollStatusToolTip(target.getPollStatus())); proxyTarget.setSecurityToken(target.getSecurityToken()); proxyTarget.setRequestAttributes(target.isRequestControllerAttributes()); + if (target.getTargetType() != null){ + TargetType type = target.getTargetType(); + proxyTarget.setTypeInfo(new ProxyTypeInfo(type.getId(), type.getName())); + } return proxyTarget; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetTypeToTypeInfoMapper.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetTypeToTypeInfoMapper.java new file mode 100644 index 000000000..f20e794e4 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/mappers/TargetTypeToTypeInfoMapper.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2021 Bosch.IO GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.ui.common.data.mappers; + +import org.eclipse.hawkbit.repository.model.NamedEntity; +import org.eclipse.hawkbit.repository.model.TargetType; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; + +/** + * + * Use to map {@link NamedEntity} to {@link ProxyTypeInfo} + * + */ +public class TargetTypeToTypeInfoMapper implements IdentifiableEntityToProxyIdentifiableEntityMapper { + + @Override + public ProxyTypeInfo map(TargetType entity) { + return new ProxyTypeInfo(entity.getId(), entity.getName()); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/providers/TargetTypeDataProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/providers/TargetTypeDataProvider.java new file mode 100644 index 000000000..444e2d220 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/providers/TargetTypeDataProvider.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2021 Bosch.IO GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.ui.common.data.providers; + +import org.eclipse.hawkbit.repository.TargetTypeManagement; +import org.eclipse.hawkbit.repository.model.TargetType; +import org.eclipse.hawkbit.ui.common.data.mappers.IdentifiableEntityToProxyIdentifiableEntityMapper; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.util.StringUtils; + +/** + * Data provider for {@link TargetTypeManagement}, which dynamically loads a + * batch of {@link TargetType} entities from backend and maps them to + * corresponding output type. + * + * @param + * output type + */ +public class TargetTypeDataProvider + extends AbstractProxyDataProvider { + private static final long serialVersionUID = 1L; + private final transient TargetTypeManagement targetTypeManagement; + + public TargetTypeDataProvider(final TargetTypeManagement targetTypeManagement, IdentifiableEntityToProxyIdentifiableEntityMapper mapper) { + super(mapper, Sort.by(Direction.ASC, "name")); + this.targetTypeManagement = targetTypeManagement; + + } + + @Override + protected Page loadBackendEntities(PageRequest pageRequest, String filter) { + if (!StringUtils.isEmpty(filter)){ + return targetTypeManagement.findByName(pageRequest, filter); + } + return targetTypeManagement.findAll(pageRequest); + } + + @Override + protected long sizeInBackEnd(PageRequest pageRequest, String filter) { + return loadBackendEntities(PageRequest.of(0, 1), filter).getTotalElements(); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyBulkUploadWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyBulkUploadWindow.java index 7b602e9df..d9584738e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyBulkUploadWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyBulkUploadWindow.java @@ -13,16 +13,18 @@ import java.util.Map; import org.eclipse.hawkbit.ui.common.data.aware.DescriptionAware; import org.eclipse.hawkbit.ui.common.data.aware.DsIdAware; +import org.eclipse.hawkbit.ui.common.data.aware.TypeInfoAware; /** * Proxy entity representing rollout popup window bean. */ -public class ProxyBulkUploadWindow implements Serializable, DescriptionAware, DsIdAware { +public class ProxyBulkUploadWindow implements Serializable, DescriptionAware, DsIdAware, TypeInfoAware { private static final long serialVersionUID = 1L; private ProxyDistributionSetInfo dsInfo; private Map tagIdsWithNameToAssign; private String description; + private ProxyTypeInfo typeInfo; /** * Gets the distribution set info @@ -84,4 +86,14 @@ public class ProxyBulkUploadWindow implements Serializable, DescriptionAware, Ds public void setDescription(final String description) { this.description = description; } + + @Override + public void setTypeInfo(ProxyTypeInfo typeInfo) { + this.typeInfo = typeInfo; + } + + @Override + public ProxyTypeInfo getTypeInfo() { + return typeInfo; + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTarget.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTarget.java index ad15d7adf..350c8b6db 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTarget.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTarget.java @@ -13,11 +13,12 @@ import java.net.URI; import org.eclipse.hawkbit.repository.model.Action.Status; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; +import org.eclipse.hawkbit.ui.common.data.aware.TypeInfoAware; /** * Proxy for {@link Target}. */ -public class ProxyTarget extends ProxyNamedEntity { +public class ProxyTarget extends ProxyNamedEntity implements TypeInfoAware { private static final long serialVersionUID = 1L; @@ -39,6 +40,8 @@ public class ProxyTarget extends ProxyNamedEntity { private boolean isRequestAttributes; + private ProxyTypeInfo typeInfo; + /** * Gets the controllerId * @@ -206,4 +209,14 @@ public class ProxyTarget extends ProxyNamedEntity { public void setRequestAttributes(final boolean isRequestAttributes) { this.isRequestAttributes = isRequestAttributes; } + + @Override + public void setTypeInfo(ProxyTypeInfo typeInfo) { + this.typeInfo = typeInfo; + } + + @Override + public ProxyTypeInfo getTypeInfo() { + return typeInfo; + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTypeInfo.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTypeInfo.java index 122fde180..f14ce34c8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTypeInfo.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/proxies/ProxyTypeInfo.java @@ -42,6 +42,19 @@ public class ProxyTypeInfo extends ProxyIdentifiableEntity { this.key = key; } + /** + * Constructor + * + * @param id + * type ID + * @param name + * type name + */ + public ProxyTypeInfo(final Long id, final String name) { + super(id); + this.name = name; + } + public String getName() { return name; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowLayoutComponentBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowLayoutComponentBuilder.java index ebf45fc55..65edb79ce 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowLayoutComponentBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowLayoutComponentBuilder.java @@ -59,7 +59,7 @@ public class DsWindowLayoutComponentBuilder { */ public ComboBox createDistributionSetTypeCombo(final Binder binder) { return FormComponentBuilder - .createTypeCombo(binder, dsTypeDataProvider, i18n, UIComponentIdProvider.DIST_ADD_DISTSETTYPE) + .createTypeCombo(binder, dsTypeDataProvider, i18n, UIComponentIdProvider.DIST_ADD_DISTSETTYPE, true) .getComponent(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java index 0324eecfe..326ed7fa2 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java @@ -24,6 +24,7 @@ import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; @@ -92,7 +93,7 @@ public class DeploymentView extends AbstractEventListenersAwareView implements B final DistributionSetTypeManagement distributionSetTypeManagement, final DistributionSetInvalidationManagement dsInvalidationManagement, final TargetManagement targetManagement, final EntityFactory entityFactory, final UiProperties uiProperties, - final TargetTagManagement targetTagManagement, + final TargetTagManagement targetTagManagement, final TargetTypeManagement targetTypeManagement, final DistributionSetTagManagement distributionSetTagManagement, final TargetFilterQueryManagement targetFilterQueryManagement, final SystemManagement systemManagement, final TenantConfigurationManagement configManagement, @@ -109,7 +110,7 @@ public class DeploymentView extends AbstractEventListenersAwareView implements B targetFilterQueryManagement, targetTagManagement, targetManagement, managementUIState.getTargetTagFilterLayoutUiState()); - this.targetGridLayout = new TargetGridLayout(uiDependencies, targetManagement, deploymentManagement, + this.targetGridLayout = new TargetGridLayout(uiDependencies, targetManagement, targetTypeManagement, deploymentManagement, uiProperties, targetTagManagement, distributionSetManagement, uiExecutor, configManagement, targetManagementStateDataSupplier, systemSecurityContext, managementUIState.getTargetTagFilterLayoutUiState(), managementUIState.getTargetGridLayoutUiState(), diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java index 5f8efa37a..9c0ff8171 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java @@ -360,7 +360,8 @@ public class BulkUploadHandler implements SucceededListener, FailedListener, Rec private void addNewTarget(final String controllerId, final String name) { try { targetManagement.create(entityFactory.target().create().controllerId(controllerId).name(name) - .description(bulkUploadInputs.getDescription())); + .description(bulkUploadInputs.getDescription()) + .targetType(bulkUploadInputs.getTypeInfo() != null ? bulkUploadInputs.getTypeInfo().getId() : null)); provisionedControllerIds.add(controllerId); } catch (final EntityAlreadyExistsException ex) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java index 515d30f39..3d45decd4 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java @@ -15,6 +15,7 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.WindowBuilder; @@ -31,6 +32,7 @@ public class BulkUploadWindowBuilder { private final Executor uiExecutor; private final TargetManagement targetManagement; private final DeploymentManagement deploymentManagement; + private final TargetTypeManagement targetTypeManagement; private final TargetTagManagement tagManagement; private final DistributionSetManagement distributionSetManagement; private final CommonUiDependencies uiDependencies; @@ -50,6 +52,8 @@ public class BulkUploadWindowBuilder { * Executor * @param targetManagement * TargetManagement + * @param targetTypeManagement + * TargetTypeManagement * @param deploymentManagement * DeploymentManagement * @param tagManagement @@ -61,13 +65,14 @@ public class BulkUploadWindowBuilder { */ public BulkUploadWindowBuilder(final CommonUiDependencies uiDependencies, final UiProperties uiproperties, final Executor uiExecutor, final TargetManagement targetManagement, - final DeploymentManagement deploymentManagement, final TargetTagManagement tagManagement, + final DeploymentManagement deploymentManagement, final TargetTypeManagement targetTypeManagement, final TargetTagManagement tagManagement, final DistributionSetManagement distributionSetManagement, final TargetBulkUploadUiState targetBulkUploadUiState) { this.uiDependencies = uiDependencies; this.uiproperties = uiproperties; this.uiExecutor = uiExecutor; this.targetManagement = targetManagement; + this.targetTypeManagement = targetTypeManagement; this.deploymentManagement = deploymentManagement; this.tagManagement = tagManagement; this.distributionSetManagement = distributionSetManagement; @@ -80,7 +85,7 @@ public class BulkUploadWindowBuilder { public Window getWindowForTargetBulkUpload() { if (!targetBulkUploadUiState.isInProgress() || targetBulkUpdateWindowLayout == null) { targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(uiDependencies, targetManagement, - deploymentManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, + deploymentManagement, targetTypeManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, targetBulkUploadUiState); targetBulkUpdateWindowLayout.clearUiState(); } @@ -108,7 +113,7 @@ public class BulkUploadWindowBuilder { */ public void restoreState() { targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(uiDependencies, targetManagement, - deploymentManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, + deploymentManagement, targetTypeManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, targetBulkUploadUiState); targetBulkUpdateWindowLayout.restoreComponentsValue(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowLayoutComponentBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowLayoutComponentBuilder.java index 61a487aec..76f6ceb40 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowLayoutComponentBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowLayoutComponentBuilder.java @@ -9,12 +9,16 @@ package org.eclipse.hawkbit.ui.management.bulkupload; import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.ui.common.builder.BoundComponent; import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder; import org.eclipse.hawkbit.ui.common.data.mappers.DistributionSetToProxyDistributionMapper; +import org.eclipse.hawkbit.ui.common.data.mappers.TargetTypeToTypeInfoMapper; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetStatelessDataProvider; +import org.eclipse.hawkbit.ui.common.data.providers.TargetTypeDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyBulkUploadWindow; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; @@ -30,6 +34,8 @@ public final class BulkUploadWindowLayoutComponentBuilder { private final VaadinMessageSource i18n; private final DistributionSetStatelessDataProvider distributionSetDataProvider; + private final TargetTypeDataProvider targetTypeDataProvider; + /** * Constructor * @@ -37,11 +43,17 @@ public final class BulkUploadWindowLayoutComponentBuilder { * i18n * @param distributionSetManagement * to build DistributionSet ComboBox + * @param targetTypeManagement + * TargetTypeManagement */ public BulkUploadWindowLayoutComponentBuilder(final VaadinMessageSource i18n, - final DistributionSetManagement distributionSetManagement) { + final DistributionSetManagement distributionSetManagement, + final TargetTypeManagement targetTypeManagement) { this.i18n = i18n; + this.targetTypeDataProvider = new TargetTypeDataProvider<>( + targetTypeManagement, new TargetTypeToTypeInfoMapper()); + this.distributionSetDataProvider = new DistributionSetStatelessDataProvider(distributionSetManagement, new DistributionSetToProxyDistributionMapper()); } @@ -66,6 +78,21 @@ public final class BulkUploadWindowLayoutComponentBuilder { return comboBox; } + /** + * create optional Target Type ComboBox + * + * @param binder + * binder the input will be bound to + * @return ComboBox + */ + public ComboBox createTargetTypeCombo(final Binder binder) { + final BoundComponent> boundComboBox = FormComponentBuilder + .createTypeCombo(binder, targetTypeDataProvider, i18n, UIComponentIdProvider.TARGET_ADD_TARGETTYPE, false); + final ComboBox comboBox = boundComboBox.getComponent(); + comboBox.setSizeFull(); + return comboBox; + } + /** * create description field * diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java index 7d6d8b081..a8e6936b8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java @@ -16,12 +16,14 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyBulkUploadWindow; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleNoBorder; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; @@ -59,6 +61,8 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { private final TargetBulkUploadUiState targetBulkUploadUiState; private final ComboBox dsCombo; + private final ComboBox targetTypeCombo; + private final transient TargetBulkTokenTags tagsComponent; private final TextArea descTextArea; private final ProgressBar progressBar; @@ -83,6 +87,8 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { * DeploymentManagement * @param tagManagement * TargetTagManagement + * @param targetTypeManagement + * TargetTypeManagement * @param distributionSetManagement * DistributionSetManagement * @param uiproperties @@ -93,19 +99,19 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { * TargetBulkUploadUiState */ public TargetBulkUpdateWindowLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, - final DeploymentManagement deploymentManagement, final TargetTagManagement tagManagement, - final DistributionSetManagement distributionSetManagement, final UiProperties uiproperties, - final Executor uiExecutor, final TargetBulkUploadUiState targetBulkUploadUiState) { + final DeploymentManagement deploymentManagement, final TargetTypeManagement targetTypeManagement, final TargetTagManagement tagManagement, + final DistributionSetManagement distributionSetManagement, final UiProperties uiproperties, + final Executor uiExecutor, final TargetBulkUploadUiState targetBulkUploadUiState) { this.i18n = uiDependencies.getI18n(); this.uinotification = uiDependencies.getUiNotification(); this.targetBulkUploadUiState = targetBulkUploadUiState; this.binder = new Binder<>(); final BulkUploadWindowLayoutComponentBuilder componentBuilder = new BulkUploadWindowLayoutComponentBuilder(i18n, - distributionSetManagement); + distributionSetManagement, targetTypeManagement); this.dsCombo = componentBuilder.createDistributionSetCombo(binder); - + this.targetTypeCombo = componentBuilder.createTargetTypeCombo(binder); this.tagsComponent = new TargetBulkTokenTags(uiDependencies, tagManagement); this.descTextArea = componentBuilder.createDescriptionField(binder); @@ -144,6 +150,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { private ProxyBulkUploadWindow getBulkUploadInputsBean() { final ProxyBulkUploadWindow bean = new ProxyBulkUploadWindow(); bean.setDistributionSetInfo(binder.getBean().getDistributionSetInfo()); + bean.setTypeInfo(binder.getBean().getTypeInfo()); bean.setTagIdsWithNameToAssign(getTagIdsWithNameToAssign()); bean.setDescription(binder.getBean().getDescription()); @@ -240,7 +247,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { inputsLayout.setSpacing(true); inputsLayout.setWidth("400px"); - inputsLayout.addComponents(dsCombo, tagsLayout, descTextArea, progressBar, targetsCountLabel, uploaderLayout); + inputsLayout.addComponents(dsCombo, targetTypeCombo, tagsLayout, descTextArea, progressBar, targetsCountLabel, uploaderLayout); final VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setMargin(false); @@ -257,6 +264,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { */ public void onStartOfUpload() { targetBulkUploadUiState.setDsInfo(binder.getBean().getDistributionSetInfo()); + targetBulkUploadUiState.setTypeInfo(binder.getBean().getTypeInfo()); targetBulkUploadUiState.setTagIdsWithNameToAssign(getTagIdsWithNameToAssign()); targetBulkUploadUiState.setDescription(binder.getBean().getDescription()); @@ -351,6 +359,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { private void changeInputsState(final boolean enabled) { dsCombo.setEnabled(enabled); + targetTypeCombo.setEnabled(enabled); tagsComponent.getTagPanel().setEnabled(enabled); descTextArea.setEnabled(enabled); uploadButton.setEnabled(enabled); @@ -365,6 +374,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { */ public void clearUiState() { targetBulkUploadUiState.setDsInfo(null); + targetBulkUploadUiState.setTypeInfo(null); targetBulkUploadUiState.getTagIdsWithNameToAssign().clear(); targetBulkUploadUiState.setDescription(null); } @@ -375,6 +385,7 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { public void restoreComponentsValue() { final ProxyBulkUploadWindow bulkUploadInputsToRestore = new ProxyBulkUploadWindow(); bulkUploadInputsToRestore.setDistributionSetInfo(targetBulkUploadUiState.getDsInfo()); + bulkUploadInputsToRestore.setTypeInfo(targetBulkUploadUiState.getTypeInfo()); bulkUploadInputsToRestore.setDescription(targetBulkUploadUiState.getDescription()); bulkUploadInputsToRestore.setTagIdsWithNameToAssign(targetBulkUploadUiState.getTagIdsWithNameToAssign()); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUploadUiState.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUploadUiState.java index f5aa716aa..002d54fd0 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUploadUiState.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUploadUiState.java @@ -8,13 +8,14 @@ */ package org.eclipse.hawkbit.ui.management.bulkupload; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSetInfo; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; +import org.eclipse.hawkbit.ui.common.event.BulkUploadEventPayload; + import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSetInfo; -import org.eclipse.hawkbit.ui.common.event.BulkUploadEventPayload; - /** * Target bulk upload ui state */ @@ -26,6 +27,7 @@ public class TargetBulkUploadUiState implements Serializable { private ProxyDistributionSetInfo dsInfo; private final Map tagIdsWithNameToAssign = new HashMap<>(); private String description; + private ProxyTypeInfo proxyTypeInfo; /** * @return true whe upload in progress else false @@ -96,6 +98,14 @@ public class TargetBulkUploadUiState implements Serializable { this.description = description; } + public void setTypeInfo(ProxyTypeInfo typeInfo) { + this.proxyTypeInfo = typeInfo; + } + + public ProxyTypeInfo getTypeInfo() { + return proxyTypeInfo; + } + /** * Updates state on bulk upload events * diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java index e039ae2cf..073e721ec 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java @@ -75,7 +75,8 @@ public class AddTargetWindowController @Override protected Target persistEntityInRepository(final ProxyTarget entity) { return targetManagement.create(getEntityFactory().target().create().controllerId(entity.getControllerId()) - .name(entity.getName()).description(entity.getDescription())); + .name(entity.getName()).description(entity.getDescription()) + .targetType(entity.getTypeInfo() != null ? entity.getTypeInfo().getId() : null)); } @Override 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 186e66640..d00e88ce5 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 @@ -103,6 +103,8 @@ public class TargetDetails extends AbstractGridDetailsLayout { return Arrays.asList( new ProxyKeyValueDetails(UIComponentIdProvider.TARGET_CONTROLLER_ID, i18n.getMessage("label.target.id"), entity.getControllerId()), + new ProxyKeyValueDetails(UIComponentIdProvider.TARGET_TYPE_ID, i18n.getMessage("label.target.type"), + entity.getTypeInfo() != null ? entity.getTypeInfo().getName() : ""), new ProxyKeyValueDetails(UIComponentIdProvider.TARGET_LAST_QUERY_DT, i18n.getMessage("label.target.lastpolldate"), SPDateTimeUtil.getFormattedDate(entity.getLastTargetQuery())), diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java index 1a7778076..f5cecc62e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java @@ -17,6 +17,7 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.ui.UiProperties; @@ -78,6 +79,8 @@ public class TargetGridLayout extends AbstractGridComponentLayout { * {@link CommonUiDependencies} * @param targetManagement * TargetManagement + * @param targetTypeManagement + * TargetTypeManagement * @param deploymentManagement * DeploymentManagement * @param uiProperties @@ -104,21 +107,22 @@ public class TargetGridLayout extends AbstractGridComponentLayout { * DistributionGridLayoutUiState */ public TargetGridLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, - final DeploymentManagement deploymentManagement, final UiProperties uiProperties, - final TargetTagManagement targetTagManagement, final DistributionSetManagement distributionSetManagement, - final Executor uiExecutor, final TenantConfigurationManagement configManagement, - final TargetManagementStateDataSupplier targetManagementStateDataSupplier, - final SystemSecurityContext systemSecurityContext, - final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, - final TargetGridLayoutUiState targetGridLayoutUiState, - final TargetBulkUploadUiState targetBulkUploadUiState, - final DistributionGridLayoutUiState distributionGridLayoutUiState) { - final TargetWindowBuilder targetWindowBuilder = new TargetWindowBuilder(uiDependencies, targetManagement, + final TargetTypeManagement targetTypeManagement, + final DeploymentManagement deploymentManagement, final UiProperties uiProperties, + final TargetTagManagement targetTagManagement, final DistributionSetManagement distributionSetManagement, + final Executor uiExecutor, final TenantConfigurationManagement configManagement, + final TargetManagementStateDataSupplier targetManagementStateDataSupplier, + final SystemSecurityContext systemSecurityContext, + final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, + final TargetGridLayoutUiState targetGridLayoutUiState, + final TargetBulkUploadUiState targetBulkUploadUiState, + final DistributionGridLayoutUiState distributionGridLayoutUiState) { + final TargetWindowBuilder targetWindowBuilder = new TargetWindowBuilder(uiDependencies, targetManagement, targetTypeManagement, EventView.DEPLOYMENT); final TargetMetaDataWindowBuilder targetMetaDataWindowBuilder = new TargetMetaDataWindowBuilder(uiDependencies, targetManagement); final BulkUploadWindowBuilder bulkUploadWindowBuilder = new BulkUploadWindowBuilder(uiDependencies, - uiProperties, uiExecutor, targetManagement, deploymentManagement, targetTagManagement, + uiProperties, uiExecutor, targetManagement, deploymentManagement, targetTypeManagement, targetTagManagement, distributionSetManagement, targetBulkUploadUiState); this.targetGridHeader = new TargetGridHeader(uiDependencies, targetWindowBuilder, bulkUploadWindowBuilder, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java index 9c987794a..342b9801f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.ui.management.targettable; import org.eclipse.hawkbit.repository.TargetManagement; +import org.eclipse.hawkbit.repository.TargetTypeManagement; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; @@ -24,6 +25,8 @@ public class TargetWindowBuilder extends AbstractEntityWindowBuilder private final TextField targetControllerId; private final BoundComponent targetName; private final TextArea targetDescription; + private final BoundComponent> targetTypeCombo; /** * Constructor for AbstractTagWindowLayout @@ -34,13 +39,17 @@ public class TargetWindowLayout extends AbstractEntityWindowLayout * @param i18n * I18N */ - public TargetWindowLayout(final VaadinMessageSource i18n) { + public TargetWindowLayout(final VaadinMessageSource i18n, final TargetTypeManagement targetTypeManagement) { super(); this.targetComponentBuilder = new TargetWindowLayoutComponentBuilder(i18n); this.targetControllerId = targetComponentBuilder.createControllerIdField(binder); this.targetName = targetComponentBuilder.createNameField(binder); this.targetDescription = targetComponentBuilder.createDescriptionField(binder); + + TargetTypeDataProvider targetTypeDataProvider = new TargetTypeDataProvider<>( + targetTypeManagement, new TargetTypeToTypeInfoMapper()); + this.targetTypeCombo = targetComponentBuilder.createTargetTypeCombo(binder, targetTypeDataProvider); } @Override @@ -54,6 +63,7 @@ public class TargetWindowLayout extends AbstractEntityWindowLayout targetWindowLayout.addComponent(targetControllerId); targetControllerId.focus(); targetWindowLayout.addComponent(targetName.getComponent()); + targetWindowLayout.addComponent(targetTypeCombo.getComponent()); targetWindowLayout.addComponent(targetDescription); return targetWindowLayout; } @@ -77,4 +87,5 @@ public class TargetWindowLayout extends AbstractEntityWindowLayout public void setNameRequired(boolean isNameRequired) { targetName.setRequired(isNameRequired); } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowLayoutComponentBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowLayoutComponentBuilder.java index adeffa386..d7ca4aa1f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowLayoutComponentBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowLayoutComponentBuilder.java @@ -8,19 +8,21 @@ */ package org.eclipse.hawkbit.ui.management.targettable; +import com.vaadin.data.Binder; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.ui.common.builder.BoundComponent; import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder; +import org.eclipse.hawkbit.ui.common.data.providers.TargetTypeDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import com.vaadin.data.Binder; -import com.vaadin.data.validator.RegexpValidator; -import com.vaadin.ui.TextArea; -import com.vaadin.ui.TextField; - /** * Builder for target window layout component */ @@ -84,4 +86,18 @@ public class TargetWindowLayoutComponentBuilder { .getComponent(); } + /** + * create target type combo + * + * @param binder + * binder the input will be bound to + * @param targetTypeDataProvider + * TargetTypeDataProvider + * @return input component + */ + public BoundComponent> createTargetTypeCombo(final Binder binder, TargetTypeDataProvider targetTypeDataProvider) { + return FormComponentBuilder + .createTypeCombo(binder, targetTypeDataProvider, i18n, UIComponentIdProvider.TARGET_ADD_TARGETTYPE, false); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/UpdateTargetWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/UpdateTargetWindowController.java index d5255b738..be3490216 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/UpdateTargetWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/UpdateTargetWindowController.java @@ -56,6 +56,7 @@ public class UpdateTargetWindowController target.setControllerId(proxyEntity.getControllerId()); target.setName(proxyEntity.getName()); target.setDescription(proxyEntity.getDescription()); + target.setTypeInfo(proxyEntity.getTypeInfo()); controllerIdBeforeEdit = proxyEntity.getControllerId(); @@ -76,9 +77,17 @@ public class UpdateTargetWindowController @Override protected Target persistEntityInRepository(final ProxyTarget entity) { final TargetUpdate targetUpdate = getEntityFactory().target().update(entity.getControllerId()) - .name(entity.getName()).description(entity.getDescription()); + .name(entity.getName()).description(entity.getDescription()) + .targetType(entity.getTypeInfo() != null ? entity.getTypeInfo().getId() : null); - return targetManagement.update(targetUpdate); + Target updatedTarget = targetManagement.update(targetUpdate); + + // Un-assigning target type needs another DB request to update the target type value to Null + if (entity.getTypeInfo() == null){ + return targetManagement.unAssignType(entity.getControllerId()); + } + + return updatedTarget; } @Override diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java index ad653cf45..c8d4f5901 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java @@ -330,6 +330,11 @@ public final class UIComponentIdProvider { */ public static final String TARGET_TABLE_POLLING_STATUS_LABEL_ID = "target.table.poll.statusId"; + /** + * ID-Target.targetType. + */ + public static final String TARGET_ADD_TARGETTYPE = "target.add.targettype"; + /** * Action history table active-state label Id. */ @@ -719,6 +724,11 @@ public final class UIComponentIdProvider { */ public static final String TARGET_CONTROLLER_ID = "target.controller.id"; + /** + * Id of target type Id label in target details. + */ + public static final String TARGET_TYPE_ID = "target.type.id"; + /** * Id of created at label in details. */ diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index 06d20b1b4..ea6969d76 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -224,6 +224,7 @@ label.filter.custom = Custom label.target.filter.truncated={0} targets has been truncated in the list due the target size limit of {1}, use filters to reduce the targets to be shown label.unknown = Unknown label.target.id = Controller Id +label.target.type = Target type label.target.ip = Controller IP label.target.security.token = Security token label.filter.by.status = Filter by Status