From 796d3dda9ca711819a525b8d2dbc3202cc379c39 Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Wed, 22 Jun 2016 13:13:54 +0200 Subject: [PATCH] Metadata management for SM and DS in Management UI. Conflicts: hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java Signed-off-by: Kai Zimmermann --- .../DistributionSetSpecification.java | 1 + .../SoftwareModuleSpecification.java | 3 + .../smtable/SoftwareModuleDetails.java | 61 ++++++++++++++++- .../smtable/SoftwareModuleTable.java | 23 +++++++ .../hawkbit/ui/common/CommonDialogWindow.java | 20 +++++- .../AbstractTableDetailsLayout.java | 4 +- .../dstable/DistributionSetDetails.java | 54 +++++++++++++-- .../dstable/DistributionSetTable.java | 57 ++++++++++++++++ .../distributions/event/SwModuleUIEvent.java | 2 +- .../smtable/SwModuleDetails.java | 66 ++++++++++++++++++- .../distributions/smtable/SwModuleTable.java | 32 +++++++-- .../actionhistory/ActionHistoryTable.java | 1 - .../dstable/DistributionDetails.java | 54 ++++++++++++++- .../management/dstable/DistributionTable.java | 54 ++++++++++++++- .../management/state/ManagementUIState.java | 16 +++++ .../hawkbit/ui/utils/HawkbitCommonUtil.java | 4 +- .../ui/utils/SPUIComponentIdProvider.java | 64 ++++++++++++++++++ .../hawkbit/ui/utils/SPUIDefinitions.java | 10 +++ .../ui/utils/SPUILabelDefinitions.java | 5 ++ .../ui/utils/SPUIStyleDefinitions.java | 9 +++ .../hawkbit/customstyles/table-common.scss | 27 ++++++++ .../hawkbit/customstyles/table-content.scss | 7 +- .../VAADIN/themes/hawkbit/hawkbittheme.scss | 1 - .../src/main/resources/messages.properties | 16 +++++ .../src/main/resources/messages_de.properties | 17 +++++ .../src/main/resources/messages_en.properties | 17 +++++ 26 files changed, 596 insertions(+), 29 deletions(-) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/DistributionSetSpecification.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/DistributionSetSpecification.java index 4ee849bcc..a2c0802a0 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/DistributionSetSpecification.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/DistributionSetSpecification.java @@ -83,6 +83,7 @@ public final class DistributionSetSpecification { targetRoot.fetch(JpaDistributionSet_.modules, JoinType.LEFT); targetRoot.fetch(JpaDistributionSet_.tags, JoinType.LEFT); targetRoot.fetch(JpaDistributionSet_.type, JoinType.LEFT); + targetRoot.fetch(JpaDistributionSet_.metadata, JoinType.LEFT); query.distinct(true); return predicate; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SoftwareModuleSpecification.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SoftwareModuleSpecification.java index feba50ac8..044383d49 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SoftwareModuleSpecification.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/specifications/SoftwareModuleSpecification.java @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.repository.jpa.specifications; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import org.eclipse.hawkbit.repository.jpa.model.JpaSoftwareModule; @@ -38,6 +39,8 @@ public final class SoftwareModuleSpecification { return (targetRoot, query, cb) -> { final Predicate predicate = cb.equal(targetRoot. get(JpaSoftwareModule_.id), moduleId); targetRoot.fetch(JpaSoftwareModule_.type); + targetRoot.fetch(JpaSoftwareModule_.metadata,JoinType.LEFT); + query.distinct(true); return predicate; }; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleDetails.java index 653994a17..ac9dc5bd3 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleDetails.java @@ -8,11 +8,17 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState; import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout; +import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleMetadatadetailslayout; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent; +import org.eclipse.hawkbit.ui.distributions.smtable.SwMetadataPopupLayout; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +51,44 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta @Autowired private ArtifactUploadState artifactUploadState; + @Autowired + private transient SoftwareManagement softwareManagement; + + @Autowired + private SwMetadataPopupLayout swMetadataPopupLayout; + + @Autowired + private EntityFactory entityFactory; + + private SoftwareModuleMetadatadetailslayout swmMetadataTable; + + /** + * softwareLayout Initialize the component. + */ + @Override + protected void init() { + swmMetadataTable = new SoftwareModuleMetadatadetailslayout(); + swmMetadataTable.init(getI18n(), getPermissionChecker(),softwareManagement,swMetadataPopupLayout,entityFactory); + super.init(); + } + + @EventBusListenerMethod(scope = EventScope.SESSION) + void onEvent(final MetadataEvent event) { + UI.getCurrent() + .access(() -> { + SoftwareModuleMetadata softwareModuleMetadata = event.getSoftwareModuleMetadata(); + if (softwareModuleMetadata != null + && isSoftwareModuleSelected(softwareModuleMetadata.getSoftwareModule())) { + if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.createMetadata(event.getSoftwareModuleMetadata().getKey()); + } else if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.deleteMetadata(event.getSoftwareModuleMetadata().getKey()); + } + } + }); + } + + @Override protected String getEditButtonId() { return SPUIComponentIdProvider.UPLOAD_SW_MODULE_EDIT_BUTTON; @@ -55,8 +99,9 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null); detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null); detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null); + detailsTab.addTab(swmMetadataTable, getI18n().get("caption.metadata"), null); } - + @Override protected void onEdit(final ClickEvent event) { final Window addSoftwareModule = softwareModuleAddUpdateWindow @@ -81,6 +126,8 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta updateSoftwareModuleDetailsLayout(HawkbitCommonUtil.SP_STRING_EMPTY, HawkbitCommonUtil.SP_STRING_EMPTY, maxAssign); } + + populateMetadataDetails(); } private void updateSoftwareModuleDetailsLayout(final String type, final String vendor, final String maxAssign) { @@ -141,4 +188,16 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta protected String getDetailsHeaderCaptionId() { return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; } + + private void populateMetadataDetails(){ + swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); + } + + private boolean isSoftwareModuleSelected(SoftwareModule softwareModule) { + final SoftwareModule selectedUploadSWModule = artifactUploadState.getSelectedBaseSoftwareModule().isPresent() ? artifactUploadState + .getSelectedBaseSoftwareModule().get() : null; + return softwareModule != null && selectedUploadSWModule != null + && selectedUploadSWModule.getName().equals(softwareModule.getName()) + && selectedUploadSWModule.getVersion().equals(softwareModule.getVersion()); + } } 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..0104509eb 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 @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -212,4 +213,26 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable extends descriptionLayout = getTabLayout(); return descriptionLayout; } - - /** + + /** * Default caption of header to be displayed when no data row selected in * table. * 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..65b98fd15 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 @@ -14,18 +14,22 @@ import java.util.Map; import java.util.Set; import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModuleIdName; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType; import org.eclipse.hawkbit.ui.common.DistributionSetIdName; import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout; +import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetMetadatadetailslayout; import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsTable; import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent; import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent; import org.eclipse.hawkbit.ui.distributions.event.SoftwareModuleAssignmentDiscardEvent; import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; @@ -64,7 +68,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet private static final String SOFT_MODULE = "softwareModule"; private static final String UNASSIGN_SOFT_MODULE = "unassignSoftModule"; - + @Autowired private ManageDistUIState manageDistUIState; @@ -79,12 +83,37 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet @Autowired private transient DistributionSetManagement distributionSetManagement; + + @Autowired + private DsMetadataPopupLayout dsMetadataPopupLayout; + + @Autowired + private EntityFactory entityFactory; private SoftwareModuleDetailsTable softwareModuleTable; + + private DistributionSetMetadatadetailslayout dsMetadataTable; private VerticalLayout tagsLayout; - + Map assignedSWModule = new HashMap<>(); + + + @EventBusListenerMethod(scope = EventScope.SESSION) + void onEvent(final MetadataEvent event) { + UI.getCurrent() + .access(() -> { + DistributionSetMetadata dsMetadata = event.getDistributionSetMetadata(); + if (dsMetadata != null && isDistributionSetSelected(dsMetadata.getDistributionSet())) { + if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_DISTRIBUTION_SET_METADATA) { + dsMetadataTable.createMetadata(event.getDistributionSetMetadata().getKey()); + } else if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_DISTRIBUTION_SET_METADATA) { + dsMetadataTable.deleteMetadata(event.getDistributionSetMetadata().getKey()); + } + } + }); + } + /** * softwareLayout Initialize the component. @@ -94,6 +123,9 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet softwareModuleTable = new SoftwareModuleDetailsTable(); softwareModuleTable.init(getI18n(), true, getPermissionChecker(), distributionSetManagement, getEventBus(), manageDistUIState); + dsMetadataTable = new DistributionSetMetadatadetailslayout(); + dsMetadataTable.init(getI18n(), getPermissionChecker(),distributionSetManagement, + dsMetadataPopupLayout,entityFactory); super.init(); } @@ -107,8 +139,9 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet populateDetails(); populateModule(); populateTags(); + populateMetadataDetails(); } - + private void populateModule() { softwareModuleTable.populateModule(getSelectedBaseEntity()); showUnsavedAssignment(); @@ -238,7 +271,11 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet updateDistributionSetDetailsLayout(null, null); } } - + + private void populateMetadataDetails(){ + dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); + } + private void updateDistributionSetDetailsLayout(final String type, final Boolean isMigrationRequired) { final VerticalLayout detailsTabLayout = getDetailsLayout(); detailsTabLayout.removeAllComponents(); @@ -294,6 +331,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet detailsTab.addTab(createSoftwareModuleTab(), getI18n().get("caption.softwares.distdetail.tab"), null); detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null); detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null); + detailsTab.addTab(dsMetadataTable, getI18n().get("caption.metadata"), null); } @Override @@ -353,7 +391,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet @Override protected String getTabSheetId() { - return null; + return SPUIComponentIdProvider.DISTRIBUTIONSET_DETAILS_TABSHEET_ID; } @Override @@ -361,4 +399,10 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return SPUIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; } + private boolean isDistributionSetSelected(DistributionSet ds) { + DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState + .getLastSelectedDistribution().get() : null; + return ds != null && lastselectedDistDS != null && lastselectedDistDS.getName().equals(ds.getName()) + && lastselectedDistDS.getVersion().endsWith(ds.getVersion()); + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java index a52c0b683..09a4f0a08 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java @@ -30,6 +30,8 @@ import org.eclipse.hawkbit.ui.common.DistributionSetIdName; import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable; import org.eclipse.hawkbit.ui.common.table.AbstractTable; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; +import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent; import org.eclipse.hawkbit.ui.distributions.event.DistributionsViewAcceptCriteria; import org.eclipse.hawkbit.ui.distributions.event.DragEvent; @@ -42,6 +44,7 @@ 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.TableColumn; import org.eclipse.hawkbit.ui.utils.UINotification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,8 +60,10 @@ import com.vaadin.data.Item; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; +import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.Table; import com.vaadin.ui.UI; @@ -98,6 +103,9 @@ public class DistributionSetTable extends AbstractNamedVersionTable showMetadataDetails(((DistributionSetIdName) itemId).getId())); + return manageMetaDataBtn; + } + }); + } + + @Override + protected List getTableVisibleColumns() { + final List columnList = super.getTableVisibleColumns(); + if (!isMaximized()) { + columnList.add(new TableColumn(SPUILabelDefinitions.METADATA_ICON, "", 0.1F)); + } + return columnList; + } + + private Button createManageMetadataButton(String nameVersionStr) { + final Button manageMetadataBtn = SPUIComponentProvider.getButton( + SPUIComponentIdProvider.DS_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false, + FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class); + manageMetadataBtn.addStyleName(SPUIStyleDefinitions.ARTIFACT_DTLS_ICON); + manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon")); + return manageMetadataBtn; + } + + private void showMetadataDetails(Long itemId) { + DistributionSet ds = distributionSetManagement.findDistributionSetByIdWithDetails(itemId); + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds,null)); + } + + private String getNameAndVerion(final Object itemId) { + final Item item = getItem(itemId); + final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue(); + final String version = (String) item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).getValue(); + return name + "." + version; + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/SwModuleUIEvent.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/SwModuleUIEvent.java index 06b40ffe0..c38d08cda 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/SwModuleUIEvent.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/SwModuleUIEvent.java @@ -13,6 +13,6 @@ package org.eclipse.hawkbit.ui.distributions.event; * */ public enum SwModuleUIEvent { - HIDE_FILTER_BY_TYPE, SHOW_FILTER_BY_TYPE, DELETED_ALL_SOFWARE; + HIDE_FILTER_BY_TYPE, SHOW_FILTER_BY_TYPE, DELETED_ALL_SOFWARE ; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java index 472ce8ce1..ed186e1b1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java @@ -8,11 +8,16 @@ */ package org.eclipse.hawkbit.ui.distributions.smtable; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout; +import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleMetadatadetailslayout; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent; import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; @@ -44,6 +49,50 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay @Autowired private ManageDistUIState manageDistUIState; + + @Autowired + private transient SoftwareManagement softwareManagement; + + @Autowired + private SwMetadataPopupLayout swMetadataPopupLayout; + + @Autowired + private EntityFactory entityFactory; + + private SoftwareModuleMetadatadetailslayout swmMetadataTable; + + /** + * softwareLayout Initialize the component. + */ + @Override + protected void init() { + swmMetadataTable = new SoftwareModuleMetadatadetailslayout(); + swmMetadataTable.init(getI18n(), getPermissionChecker(),softwareManagement,swMetadataPopupLayout,entityFactory); + super.init(); + } + + /** + * MetadataEvent. + * + * @param event + * as instance of {@link MetadataEvent} + */ + + @EventBusListenerMethod(scope = EventScope.SESSION) + void onEvent(final MetadataEvent event) { + UI.getCurrent() + .access(() -> { + SoftwareModuleMetadata softwareModuleMetadata = event.getSoftwareModuleMetadata(); + if (softwareModuleMetadata != null + && isSoftwareModuleSelected(softwareModuleMetadata.getSoftwareModule())) { + if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.createMetadata(event.getSoftwareModuleMetadata().getKey()); + } else if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.deleteMetadata(event.getSoftwareModuleMetadata().getKey()); + } + } + }); + } @EventBusListenerMethod(scope = EventScope.SESSION) void onEvent(final SoftwareModuleEvent softwareModuleEvent) { @@ -69,7 +118,8 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null); detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null); detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null); - } + detailsTab.addTab(swmMetadataTable, getI18n().get("caption.metadata"), null); + } @Override protected String getDefaultCaption() { @@ -93,7 +143,7 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay @Override protected String getTabSheetId() { - return null; + return SPUIComponentIdProvider.DIST_SW_MODULE_DETAILS_TABSHEET_ID; } private void populateDetails() { @@ -139,11 +189,23 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay @Override protected void populateDetailsWidget() { populateDetails(); + populateMetadataDetails(); } @Override protected String getDetailsHeaderCaptionId() { return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; } + + private void populateMetadataDetails() { + swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); + } + + private boolean isSoftwareModuleSelected(SoftwareModule softwareModule) { + final Long selectedDistSWModuleId = manageDistUIState.getSelectedBaseSwModuleId().isPresent() ? manageDistUIState + .getSelectedBaseSwModuleId().get() : null; + return softwareModule != null && selectedDistSWModuleId != null + && selectedDistSWModuleId.equals(softwareModule.getId()); + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTable.java index 4dd635b55..8ef507ea4 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTable.java @@ -51,6 +51,7 @@ import com.vaadin.shared.ui.window.WindowMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.JavaScript; import com.vaadin.ui.Table; import com.vaadin.ui.UI; @@ -77,6 +78,9 @@ public class SwModuleTable extends AbstractNamedVersionTable showArtifactDetailsWindow((Long) itemId, nameVersionStr)); - return showArtifactDtlsBtn; + manageMetaDataBtn.addClickListener(event -> showMetadataDetails((Long) itemId)); + iconLayout.addComponent(showArtifactDtlsBtn); + iconLayout.addComponent(manageMetaDataBtn); + return iconLayout; } }); } @@ -207,6 +214,9 @@ public class SwModuleTable extends AbstractNamedVersionTable { + DistributionSetMetadata dsMetadata = event.getDistributionSetMetadata(); + if (dsMetadata != null && isDistributionSetSelected(dsMetadata.getDistributionSet())) { + if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_DISTRIBUTION_SET_METADATA) { + dsMetadataTable.createMetadata(event.getDistributionSetMetadata().getKey()); + } else if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_DISTRIBUTION_SET_METADATA) { + dsMetadataTable.deleteMetadata(event.getDistributionSetMetadata().getKey()); + } + } + }); + } + + @EventBusListenerMethod(scope = EventScope.SESSION) void onEvent(final DistributionTableEvent distributionTableEvent) { onBaseEntityEvent(distributionTableEvent); @@ -73,6 +112,7 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail detailsTab.addTab(createSoftwareModuleTab(), getI18n().get("caption.softwares.distdetail.tab"), null); detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null); detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null); + detailsTab.addTab(dsMetadataTable, getI18n().get("caption.metadata"), null); } @Override @@ -114,8 +154,13 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail protected void populateDetailsWidget() { softwareModuleTable.populateModule(getSelectedBaseEntity()); populateDetails(getSelectedBaseEntity()); + populateMetadataDetails(); } + + private void populateMetadataDetails(){ + dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); + } private void populateDetails(final DistributionSet ds) { if (ds != null) { @@ -160,5 +205,12 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail protected String getDetailsHeaderCaptionId() { return SPUIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; } - + + private boolean isDistributionSetSelected(DistributionSet ds) { + DistributionSetIdName lastselectedManageDS = managementUIState.getLastSelectedDistribution().isPresent() ? managementUIState + .getLastSelectedDistribution().get() : null; + return ds!=null && lastselectedManageDS != null && lastselectedManageDS.getName().equals(ds.getName()) + && lastselectedManageDS.getVersion().endsWith(ds.getVersion()); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java index 5b265fc14..d5f8d613d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java @@ -18,9 +18,11 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SpPermissionChecker; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetIdName; @@ -29,6 +31,9 @@ import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable; import org.eclipse.hawkbit.ui.common.table.AbstractTable; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; +import org.eclipse.hawkbit.ui.distributions.dstable.DsMetadataPopupLayout; +import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent; import org.eclipse.hawkbit.ui.management.event.DragEvent; @@ -63,6 +68,7 @@ import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component; import com.vaadin.ui.DragAndDropWrapper; +import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Table; import com.vaadin.ui.UI; @@ -86,12 +92,18 @@ public class DistributionTable extends AbstractNamedVersionTable showMetadataDetails(itemId)); + iconLayout.addComponent((Button)getPinButton(itemId)); + iconLayout.addComponent(manageMetaDataBtn); + return iconLayout; } + }); } + + + private String getNameAndVerion(final Object itemId) { + final Item item = getItem(itemId); + final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue(); + final String version = (String) item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).getValue(); + return name + "." + version; + } + + private Button createManageMetadataButton(String nameVersionStr) { + final Button manageMetadataBtn = SPUIComponentProvider.getButton( + SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false, + FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class); + manageMetadataBtn.addStyleName(SPUIStyleDefinitions.ARTIFACT_DTLS_ICON); + manageMetadataBtn.addStyleName(SPUIStyleDefinitions.DS_METADATA_ICON); + manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon")); + return manageMetadataBtn; + } @Override protected boolean isFirstRowSelectedOnLoad() { @@ -246,6 +283,10 @@ public class DistributionTable extends AbstractNamedVersionTable getLastSelectedDistribution() { + return Optional.ofNullable(lastSelectedDistribution); + } + + + public void setLastSelectedDistribution(final DistributionSetIdName value) { + this.lastSelectedDistribution = value; + } + /** * @return the bulkUploadWindowMinimised diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java index da0e3e828..217a84a30 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/HawkbitCommonUtil.java @@ -82,9 +82,9 @@ public final class HawkbitCommonUtil { private static final String JS_DRAG_COUNT_REM_CHILD = " if(x) { document.head.removeChild(x); } "; - private static final String DIV_DESCRIPTION = "

"; + public static final String DIV_DESCRIPTION = "

"; - private static final String DIV_CLOSE = "

"; + public static final String DIV_CLOSE = "

"; private static final String DRAG_COUNT_ELEMENT = "var x = document.getElementById('sp-drag-count'); "; private static final String CLOSE_BRACE = "\"; }';"; 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..1eb10439b 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 @@ -915,6 +915,70 @@ public final class SPUIComponentIdProvider { */ public static final String UPLOAD_STATUS_POPUP_ID = "artifact.upload.status.popup.id"; + /** + * Software module table - Manage metadata id. + */ + public static final String SW_TABLE_MANAGE_METADATA_ID = "swtable.manage.metadata.id"; + + + /** + * Metadata key id. + */ + public static final String METADATA_KEY_FIELD_ID = "metadata.key.id"; + + /** + * Metadata value id. + */ + public static final String METADATA_VALUE_ID = "metadata.value.id"; + /** + * Metadata save id. + */ + public static final String METADTA_SAVE_ICON_ID = "metadata.save.icon.id"; + + /** + * Metadata discard id. + */ + public static final String METADTA_DISCARD_ICON_ID = "metadata.discard.icon.id"; + + /** + * Metadata add icon id. + */ + public static final String METADTA_ADD_ICON_ID = "metadata.add.icon.id"; + /** + * Metadata table id. + */ + public static final String METDATA_TABLE_ID = "metadata.table.id"; + + /** + * Distribution set table - Manage metadata id. + */ + public static final String DS_TABLE_MANAGE_METADATA_ID = "dstable.manage.metadata.id"; + + /** + * DistributionSet - Metadata button id. + */ + public static final String DS_METADATA_DETAIL_LINK = "distributionset.metadata.detail.link"; + + /** + * Metadata popup id. + */ + public static final String METADATA_POPUP_ID = "metadata.popup.id"; + + /** + * DistributionSet table details tab id in Distributions . + */ + public static final String DISTRIBUTIONSET_DETAILS_TABSHEET_ID = "distributionset.details.tabsheet"; + + /** + * Software module table details tab id in Distributions . + */ + public static final String DIST_SW_MODULE_DETAILS_TABSHEET_ID = "dist.sw.module.details.tabsheet"; + + /** + * Software Module - Metadata button id. + */ + public static final String SW_METADATA_DETAIL_LINK = "softwaremodule.metadata.detail.link"; + /** * /* 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..90a17392f 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 @@ -1016,6 +1016,16 @@ public final class SPUIDefinitions { * Rollout action column property. */ public static final String ROLLOUT_ACTION = "rollout-action"; + + /** + * DistributionSet Metadata tab Id + */ + public static final String DISTRIBUTIONSET_METADATA_TAB_ID = "distSet.metadata.tab.id"; + + /** + * SoftwareModule Metadata tab Id + */ + public static final String SOFTWAREMODULE_METADATA_TAB_ID = "swModule.metadata.tab.id"; /** * /** Constructor. diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUILabelDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUILabelDefinitions.java index 5e6feceb2..d930b89ea 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUILabelDefinitions.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUILabelDefinitions.java @@ -560,6 +560,11 @@ public final class SPUILabelDefinitions { * Rollout group installed percentage column property. */ public static final String ROLLOUT_GROUP_INSTALLED_PERCENTAGE = "finishedPercentage"; + + /** + * Add metadata icon. + */ + public static final String METADATA_ICON = "metadataDls"; /** * Constructor. diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java index 4ede7204d..2541348b6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIStyleDefinitions.java @@ -136,6 +136,11 @@ public final class SPUIStyleDefinitions { * Artifact Details icon in Distribution View. */ public static final String ARTIFACT_DTLS_ICON = "swm-artifact-dtls-icon"; + + /** + * Distribution metadata icon style. + */ + public static final String DS_METADATA_ICON = "ds-metadata-icon"; /** * Target table style. @@ -293,6 +298,10 @@ public final class SPUIStyleDefinitions { * Status pending icon. */ public static final String STATUS_ICON_PENDING = "statusIconPending"; + /** + * Grid style. + */ + public static final String METADATA_GRID = "metadata-grid"; /** * Footer layout style. diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-common.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-common.scss index 3bfc12aac..2be45904a 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-common.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-common.scss @@ -182,6 +182,7 @@ float: right; } + .v-button-generatedColumnPadding { height: 28px; padding: 0 6px !important; @@ -189,5 +190,31 @@ border-radius: 4px; } + .metadata-grid { + tr { + .icon-only { + visibility: hidden; + color: $discard-icon-color; + } + } + tr.v-grid-row-selected{ + .icon-only .v-icon { + color : $widget-bg; + } + } + + tr.v-grid-row-selected:hover { + .icon-only { + visibility: visible; + color: $widget-bg !important; + } + } + + tr:hover { + .icon-only { + visibility: visible; + } + } + } } diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-content.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-content.scss index ad5556f08..8916f4b32 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-content.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/table-content.scss @@ -48,9 +48,6 @@ .distributionPin { line-height: 15px; background-color: none; - margin-bottom: 0 !important; - margin-right: 0 !important; - padding: 0; font-weight: normal; } @@ -143,4 +140,8 @@ line-height: 21px; border: 1px solid $widget-border-color; } + + .ds-metadata-icon{ + line-height:15px; + } } diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/hawkbittheme.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/hawkbittheme.scss index 128c66e55..05d1c7460 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/hawkbittheme.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/hawkbittheme.scss @@ -139,5 +139,4 @@ $v-included-components: remove($v-included-components, form); background-position: bottom; background-repeat: no-repeat; } - } diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index 1fee8dcdb..9c26e7dd0 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -14,6 +14,7 @@ # Button names prefix with - button button.save = Save button.delete = Delete +button.discard = Discard button.discard.all = Discard All button.delete.all = Delete All button.assign.all = Save Assign @@ -57,6 +58,7 @@ caption.new.softwaremodule.jvm = Configure New Runtime caption.new.softwaremodule.os = Configure New OS caption.filter.simple = Simple Filter caption.filter.custom = Custom Filter +caption.metadata = Metadata caption.add.softwaremodule = Configure Software Module caption.add.new.dist = Configure New Distribution @@ -89,6 +91,9 @@ caption.force.action.confirmbox = Confirm Force Active Action caption.confirm.abort.action = Confirm abort action caption.filter.delete.confirmbox = Confirm Filter Delete Action +caption.metadata.popup = Metadata of +caption.metadata.delete.action.confirmbox = Confirm metadata delete action + # Labels prefix with - label label.dist.details.type = Type : @@ -176,6 +181,7 @@ textfield.version = Version textfield.vendor = Vendor textfield.description = Description textfield.customfiltername = Filter name +textfield.value = Value ui.version = Powered by Bosch IoT Software Provisioning prompt.target.id = Controller ID @@ -194,6 +200,7 @@ tooltip.timeforced.item=Soft update until a specific time and then the action wi tooltip.check.for.mandatory=Check to make Mandatory tooltip.artifact.icon=Show Artifact Details tooltip.click.to.edit = Click to edit +tooltip.metadata.icon = Manage metadata # Notification messages prefix with - message message.save.success = {0} saved successfully @@ -373,6 +380,13 @@ message.dist.discard.success = All Distributions are discarded successfully ! message.assign.discard.success = All assignments are discarded successfully ! message.target.ds.assign.success = Assignments saved successfully ! message.bulk.upload.assignment.failed = Distribution set assignment failed as distribution set no longer exists! +message.key.missing = Key is missing ! +message.value.missing = Value is missing ! +message.metadata.saved = Metadata with key {0} successfully saved ! +message.metadata.updated = Metadata with key {0} successfully updated ! +message.metadata.duplicate.check = Metadata with key {0} already exists, please enter another value +message.metadata.deleted.successfully = Metadata with key {0} successfully deleted ! +message.confirm.delete.metadata = Are you sure that you want to delete metadata with key {0} ? # Login view notification.login.title=Welcome to Bosch IoT Software Provisioning. @@ -438,6 +452,8 @@ header.distributionset = Distribution set header.numberofgroups = No. of groups header.detail.status = Detail status header.total.targets = Total targets +header.key = Key +header.value = Value distribution.details.header = Distribution set target.details.header = Target diff --git a/hawkbit-ui/src/main/resources/messages_de.properties b/hawkbit-ui/src/main/resources/messages_de.properties index 4134a7466..bc01ca601 100644 --- a/hawkbit-ui/src/main/resources/messages_de.properties +++ b/hawkbit-ui/src/main/resources/messages_de.properties @@ -14,6 +14,7 @@ # Button names prefix with - button button.save = Save button.delete = Delete +button.discard = Discard button.discard.all = Discard All button.delete.all = Delete All button.assign.all = Save Assign @@ -55,6 +56,8 @@ caption.error = Error caption.new.softwaremodule.application = Configure New Application caption.new.softwaremodule.jvm = Configure New Runtime caption.new.softwaremodule.os = Configure New OS +caption.metadata = Metadata + caption.add.softwaremodule = Configure Software Module caption.add.new.dist = Configure New Distribution @@ -88,6 +91,8 @@ caption.filter.custom = Custom Filter caption.filter.delete.confirmbox = Confirm Filter Delete Action caption.confirm.abort.action = Confirm abort action +caption.metadata.popup = Metadata of +caption.metadata.delete.action.confirmbox = Confirm metadata delete action # Labels prefix with - label label.dist.details.type = Type : @@ -174,6 +179,7 @@ textfield.version = Version textfield.vendor = Vendor textfield.description = Description textfield.customfiltername = Filter name +textfield.value = Value ui.version = Powered by Bosch IoT Software Provisioning prompt.target.id = Controller ID @@ -192,6 +198,7 @@ tooltip.timeforced.item=Soft update until a specific time and then the action wi tooltip.check.for.mandatory=Check to make Mandatory tooltip.artifact.icon=Show Artifact Details tooltip.click.to.edit = Click to edit +tooltip.metadata.icon = Manage metadata # Notification messages prefix with - message @@ -361,6 +368,14 @@ message.dist.type.discard.success = All Distribution Types are discarded success message.dist.discard.success = All Distributions are discarded successfully ! message.assign.discard.success = All assignments are discarded successfully ! message.bulk.upload.assignment.failed = Distribution set assignment failed as distribution set no longer exists! +message.key.missing = Key is missing ! +message.value.missing = Value is missing ! +message.metadata.saved = Metadata with key {0} successfully saved ! +message.metadata.updated = Metadata with key {0} successfully updated ! +message.metadata.duplicate.check = Metadata with key {0} already exists, please enter another value +message.metadata.deleted.successfully = Metadata with key {0} successfully deleted ! +message.confirm.delete.metadata = Are you sure that you want to delete metadata with key {0} ? + # Login view notification.login.title=Welcome to Bosch IoT Software Provisioning. @@ -440,6 +455,8 @@ header.caption.softwaremodule = SoftwareModule header.caption.unassign = Unassign message.sw.unassigned = Software module {0} successfully unassigned header.caption.upload.details = Upload details +header.key = Key +header.value = Value combo.type.tag.name = Type tag name label.yes = Yes diff --git a/hawkbit-ui/src/main/resources/messages_en.properties b/hawkbit-ui/src/main/resources/messages_en.properties index 7716da4f2..0c7cf5cce 100644 --- a/hawkbit-ui/src/main/resources/messages_en.properties +++ b/hawkbit-ui/src/main/resources/messages_en.properties @@ -14,6 +14,7 @@ # Button names prefix with - button button.save = Save button.delete = Delete +button.discard = Discard button.discard.all = Discard All button.delete.all = Delete All button.assign.all = Save Assign @@ -57,6 +58,7 @@ caption.new.softwaremodule.jvm = Configure New Runtime caption.new.softwaremodule.os = Configure New OS caption.filter.simple = Simple Filter caption.filter.custom = Custom Filter +caption.metadata = Metadata caption.add.softwaremodule = Configure Software Module caption.add.new.dist = Configure New Distribution @@ -86,6 +88,9 @@ 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.metadata.popup = Metadata of +caption.metadata.delete.action.confirmbox = Confirm metadata delete action + caption.confirm.abort.action = Confirm abort action # Labels prefix with - label @@ -174,6 +179,7 @@ textfield.version = Version textfield.vendor = Vendor textfield.description = Description textfield.customfiltername = Filter name +textfield.value = Value ui.version = Powered by Bosch IoT Software Provisioning prompt.target.id = Controller ID @@ -192,6 +198,8 @@ tooltip.timeforced.item=Soft update until a specific time and then the action wi tooltip.check.for.mandatory=Check to make Mandatory tooltip.artifact.icon=Show Artifact Details tooltip.click.to.edit = Click to edit +tooltip.metadata.icon = Manage metadata + # Notification messages prefix with - message message.save.success = {0} saved successfully @@ -356,6 +364,13 @@ message.sw.module.type.delete = {0} Software Module Type(s) deleted successfully message.dist.type.discard.success = All Distribution Types are discarded successfully ! message.dist.discard.success = All Distributions are discarded successfully ! message.assign.discard.success = All assignments are discarded successfully ! +message.key.missing = Key is missing ! +message.value.missing = Value is missing ! +message.metadata.saved = Metadata with key {0} successfully saved ! +message.metadata.updated = Metadata with key {0} successfully updated ! +message.metadata.duplicate.check = Metadata with key {0} already exists, please enter another value +message.metadata.deleted.successfully = Metadata with key {0} successfully deleted ! +message.confirm.delete.metadata = Are you sure that you want to delete metadata with key {0} ? # Login view notification.login.title=Welcome to Bosch IoT Software Provisioning. @@ -435,6 +450,8 @@ header.caption.mandatory = Mandatory header.caption.typename = SoftwareModuleType header.caption.softwaremodule = SoftwareModule header.caption.upload.details = Upload details +header.key = Key +header.value = Value combo.type.tag.name = Type tag name label.yes = Yes