From 796d3dda9ca711819a525b8d2dbc3202cc379c39 Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Wed, 22 Jun 2016 13:13:54 +0200 Subject: [PATCH 01/13] 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 From 176e2d52c1bf7bfe3d66a9e9ccfa9a8c2089fec1 Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Wed, 22 Jun 2016 13:13:54 +0200 Subject: [PATCH 02/13] 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 --- .../smtable/SoftwareModuleTable.java | 1 + .../common/AbstractMetadataPopupLayout.java | 492 ++++++++++++++++++ .../DistributionSetMetadatadetailslayout.java | 190 +++++++ .../SoftwareModuleMetadatadetailslayout.java | 169 ++++++ .../dstable/DistributionSetTable.java | 45 ++ .../dstable/DsMetadataPopupLayout.java | 83 +++ .../ui/distributions/event/MetadataEvent.java | 52 ++ .../smtable/SwMetadataPopupLayout.java | 90 ++++ 8 files changed, 1122 insertions(+) create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailslayout.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleMetadatadetailslayout.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/MetadataEvent.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwMetadataPopupLayout.java 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 0104509eb..a27ab6682 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 @@ -15,6 +15,7 @@ import java.util.Map; 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.SMFilterEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java new file mode 100644 index 000000000..67c6680a7 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -0,0 +1,492 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.annotation.PostConstruct; + +import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; +import org.eclipse.hawkbit.repository.model.MetaData; +import org.eclipse.hawkbit.repository.model.NamedVersionedEntity; +import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; +import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; +import org.eclipse.hawkbit.ui.utils.I18N; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; +import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; +import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; +import org.eclipse.hawkbit.ui.utils.UINotification; +import org.springframework.beans.factory.annotation.Autowired; +import org.vaadin.spring.events.EventBus; + +import com.vaadin.data.Item; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.SelectionEvent; +import com.vaadin.server.FontAwesome; +import com.vaadin.shared.ui.window.WindowMode; +import com.vaadin.ui.AbstractTextField.TextChangeEventMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.SelectionMode; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.WindowModeChangeEvent; +import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent; +import com.vaadin.ui.themes.ValoTheme; + +/** + * + * Abstract pop up layout + * + * @param + * E id the entity for which metadata is displayed + * @param + * M is the metadata + * + */ +public abstract class AbstractMetadataPopupLayout extends + CustomComponent { + + private static final String DELETE_BUTTON = "DELETE_BUTTON"; + + private static final long serialVersionUID = -1491218218453167613L; + + private static final String VALUE = "value"; + + private static final String KEY = "key"; + + @Autowired + protected I18N i18n; + + @Autowired + private UINotification uiNotification; + + @Autowired + protected transient EventBus.SessionEventBus eventBus; + + private TextField keyTextField; + + private TextArea valueTextArea; + + private Button addIcon; + + private Grid metaDataGrid; + + private Label headerCaption; + + private CommonDialogWindow metadataWindow; + + private E selectedEntity; + + @PostConstruct + private void init() { + createComponents(); + buildLayout(); + + } + + + /** + * Returns metadata popup. + * + * @param entity + * entity for which metadata data is displayed + * @param metaData + * metadata to be selected + * @return @link{CommonDialogWindow} + */ + public CommonDialogWindow getWindow(final E entity, final M metaData) { + selectedEntity = entity; + String nameVersion = HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + metadataWindow = SPUIComponentProvider.getWindow(getMetadataCaption(nameVersion), null, + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onSave(), event -> onDiscard(), null); + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + metadataWindow.setCancelButtonCaption(i18n.get("button.discard")); + metadataWindow.setCancelButtonIcon(FontAwesome.UNDO); + metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); + metadataWindow.setHeight(550, Unit.PIXELS); + metadataWindow.setWidth(800, Unit.PIXELS); + metadataWindow.getMainLayout().setSizeFull(); + metadataWindow.setResizable(true); + metadataWindow.addWindowModeChangeListener(event -> onResize(event)); + setUpDetails(entity.getId(),metaData); + return metadataWindow; + } + + public void setUpDetails(final Long swId, final M metaData) { + keyTextField.clear(); + valueTextArea.clear(); + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + addIcon.setEnabled(true); + if (swId != null) { + metaDataGrid.getContainerDataSource().removeAllItems(); + populateGrid(); + metaDataGrid.getSelectionModel().reset(); + if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { + if (metaData == null) { + metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + } else { + metaDataGrid.select(metaData.getKey()); + } + } + } + } + + public E getSelectedEntity() { + return selectedEntity; + } + + public void setSelectedEntity(E selectedEntity) { + this.selectedEntity = selectedEntity; + } + + protected abstract void checkForDuplicate(E entity, String value); + + protected abstract M createMetadata(E entity, String key, String value); + + protected abstract M updateMetadata(E entity, String key, String value); + + protected abstract List getMetadataList(); + + protected abstract void deleteMetadata(E entity, String key, String value); + + private void createComponents() { + keyTextField = createKeyTextField(); + valueTextArea = createValueTextField(); + metaDataGrid = createMetadataGrid(); + addIcon = createAddIcon(); + headerCaption = createHeaderCaption(); + } + + private void buildLayout() { + final HorizontalLayout headerLayout = new HorizontalLayout(); + headerLayout.addStyleName(SPUIStyleDefinitions.WIDGET_TITLE); + headerLayout.setSpacing(false); + headerLayout.setMargin(false); + headerLayout.setSizeFull(); + headerLayout.addComponent(headerCaption); + headerLayout.addComponents(addIcon); + headerLayout.setComponentAlignment(addIcon, Alignment.MIDDLE_RIGHT); + headerLayout.setExpandRatio(headerCaption, 1.0F); + + final HorizontalLayout headerWrapperLayout = new HorizontalLayout(); + headerWrapperLayout.addStyleName("bordered-layout" + " " + "no-border-bottom"); + headerWrapperLayout.addComponent(headerLayout); + headerWrapperLayout.setWidth("100%"); + headerLayout.setHeight("30px"); + + final VerticalLayout tableLayout = new VerticalLayout(); + tableLayout.setSizeFull(); + tableLayout.setHeight("100%"); + tableLayout.addComponent(headerWrapperLayout); + tableLayout.addComponent(metaDataGrid); + tableLayout.addStyleName("table-layout"); + tableLayout.setExpandRatio(metaDataGrid, 1.0F); + + VerticalLayout metadataFieldsLayout = new VerticalLayout(); + metadataFieldsLayout.setSizeFull(); + metadataFieldsLayout.setHeight("100%"); + metadataFieldsLayout.addComponent(keyTextField); + metadataFieldsLayout.addComponent(valueTextArea); + metadataFieldsLayout.setSpacing(true); + metadataFieldsLayout.setExpandRatio(valueTextArea, 1F); + + HorizontalLayout mainLayout = new HorizontalLayout(); + mainLayout.addComponent(tableLayout); + mainLayout.addComponent(metadataFieldsLayout); + mainLayout.setExpandRatio(tableLayout, 0.5F); + mainLayout.setExpandRatio(metadataFieldsLayout, 0.5F); + mainLayout.setSizeFull(); + mainLayout.setSpacing(true); + setCompositionRoot(mainLayout); + setSizeFull(); + } + + private TextField createKeyTextField() { + TextField keyField = SPUIComponentProvider.getTextField(i18n.get("textfield.key"), "", + ValoTheme.TEXTFIELD_TINY, true, "", i18n.get("textfield.key"), true, 128); + keyField.setId(SPUIComponentIdProvider.METADATA_KEY_FIELD_ID); + keyField.addTextChangeListener(event -> onKeyChange(event)); + keyField.setTextChangeEventMode(TextChangeEventMode.EAGER); + keyField.setWidth("100%"); + return keyField; + } + + private TextArea createValueTextField() { + valueTextArea = SPUIComponentProvider.getTextArea(i18n.get("textfield.value"), null, ValoTheme.TEXTAREA_TINY, + true, null, i18n.get("textfield.value"), 4000); + valueTextArea.setId(SPUIComponentIdProvider.METADATA_VALUE_ID); + valueTextArea.setNullRepresentation(""); + valueTextArea.setSizeFull(); + valueTextArea.setHeight(100, Unit.PERCENTAGE); + valueTextArea.addTextChangeListener(event -> onValueChange(event)); + valueTextArea.setTextChangeEventMode(TextChangeEventMode.EAGER); + return valueTextArea; + } + + private Grid createMetadataGrid() { + final Grid metadataGrid = new Grid(); + metadataGrid.addStyleName(SPUIStyleDefinitions.METADATA_GRID); + metadataGrid.setImmediate(true); + metadataGrid.setHeight("100%"); + metadataGrid.setWidth("100%"); + metadataGrid.setId(SPUIComponentIdProvider.METDATA_TABLE_ID); + metadataGrid.setSelectionMode(SelectionMode.SINGLE); + metadataGrid.setColumnReorderingAllowed(true); + metadataGrid.setContainerDataSource(getMetadataContainer()); + metadataGrid.getColumn(KEY).setHeaderCaption(i18n.get("header.key")); + metadataGrid.getColumn(VALUE).setHeaderCaption(i18n.get("header.value")); + metadataGrid.getColumn(VALUE).setHidden(true); + metadataGrid.addSelectionListener(event -> onRowClick(event)); + metadataGrid.getColumn(DELETE_BUTTON).setHeaderCaption(""); + metadataGrid.getColumn(DELETE_BUTTON).setRenderer(new HtmlButtonRenderer(event -> onDelete(event))); + metadataGrid.getColumn(DELETE_BUTTON).setWidth(50); + metadataGrid.getColumn(KEY).setExpandRatio(1); + return metadataGrid; + } + + private void onDelete(RendererClickEvent event) { + Item item = metaDataGrid.getContainerDataSource().getItem(event.getItemId()); + String key = (String) item.getItemProperty(KEY).getValue(); + String value = (String) item.getItemProperty(VALUE).getValue(); + + final ConfirmationDialog confirmDialog = new ConfirmationDialog( + i18n.get("caption.metadata.delete.action.confirmbox"), + i18n.get("message.confirm.delete.metadata", key), i18n.get("button.ok"), i18n.get("button.cancel"), + ok -> { + if (ok) { + deleteMetadata(getSelectedEntity(), key, value); + uiNotification.displaySuccess(i18n.get("message.metadata.deleted.successfully", key)); + Object selectedRow = metaDataGrid.getSelectedRow(); + metaDataGrid.getContainerDataSource().removeItem(event.getItemId()); + // force grid to refresh + metaDataGrid.clearSortOrder(); + if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { + if (selectedRow != null) { + if (selectedRow.equals(event.getItemId())) { + metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + } else { + metaDataGrid.select(selectedRow); + } + } + } else { + keyTextField.clear(); + keyTextField.setEnabled(true); + valueTextArea.clear(); + metaDataGrid.select(null); + } + } + }); + UI.getCurrent().addWindow(confirmDialog.getWindow()); + confirmDialog.getWindow().bringToFront(); + } + + private Button createAddIcon() { + addIcon = SPUIComponentProvider.getButton(SPUIComponentIdProvider.METADTA_ADD_ICON_ID, i18n.get("button.save"), + null, null, false, FontAwesome.PLUS, SPUIButtonStyleSmallNoBorder.class); + addIcon.addClickListener(event -> onAdd(event)); + return addIcon; + } + + private Label createHeaderCaption() { + final Label captionLabel = SPUIComponentProvider.getLabel(i18n.get("caption.metadata"), + SPUILabelDefinitions.SP_WIDGET_CAPTION); + return captionLabel; + } + + private IndexedContainer getMetadataContainer() { + final IndexedContainer swcontactContainer = new IndexedContainer(); + swcontactContainer.addContainerProperty(KEY, String.class, ""); + swcontactContainer.addContainerProperty(VALUE, String.class, ""); + swcontactContainer.addContainerProperty(DELETE_BUTTON, String.class, FontAwesome.TRASH_O.getHtml()); + return swcontactContainer; + } + + private void popualateKeyValue(final Object metadataCompositeKey) { + if (metadataCompositeKey != null) { + Item item = metaDataGrid.getContainerDataSource().getItem(metadataCompositeKey); + keyTextField.setValue((String) item.getItemProperty(KEY).getValue()); + // TODO value to be stored in table??? + valueTextArea.setValue((String) item.getItemProperty(VALUE).getValue()); + keyTextField.setEnabled(false); + } + } + + private void populateGrid() { + List metadataList = getMetadataList(); + for (final M metaData : metadataList) { + addItemToGrid(metaData.getKey(), metaData.getValue()); + } + } + + private void addItemToGrid(final String key, final String value) { + final IndexedContainer metadataContainer = (IndexedContainer) metaDataGrid.getContainerDataSource(); + final Item item = metadataContainer.addItem(key); + item.getItemProperty(VALUE).setValue(value); + item.getItemProperty(KEY).setValue(key); + } + + private void updateItemInGrid(final String key) { + final IndexedContainer metadataContainer = (IndexedContainer) metaDataGrid.getContainerDataSource(); + final Item item = metadataContainer.getItem(key); + item.getItemProperty(VALUE).setValue(valueTextArea.getValue()); + } + + private void onAdd(ClickEvent event) { + valueTextArea.clear(); + keyTextField.clear(); + addIcon.setEnabled(true); + metaDataGrid.deselect(metaDataGrid.getSelectedRow()); + } + + private void onSave() { + String key = keyTextField.getValue(); + String value = valueTextArea.getValue(); + if (mandatoryCheck()) { + E entity = selectedEntity; + if (metaDataGrid.getSelectedRow() == null) { + if (!duplicateCheck(entity)) { + M metadata = createMetadata(entity, key, value); + uiNotification.displaySuccess(i18n.get("message.metadata.saved", metadata.getKey())); + addItemToGrid(metadata.getKey(), metadata.getValue()); + metaDataGrid.scrollToEnd(); + metaDataGrid.select(metadata.getKey()); + addIcon.setEnabled(true); + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + } else { + M metadata = updateMetadata(entity, key, value); + uiNotification.displaySuccess(i18n.get("message.metadata.updated", metadata.getKey())); + updateItemInGrid(metadata.getKey()); + metaDataGrid.select(metadata.getKey()); + addIcon.setEnabled(true); + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + } + } + + private boolean mandatoryCheck() { + if (keyTextField.getValue().isEmpty()) { + uiNotification.displayValidationError(i18n.get("message.key.missing")); + return false; + } + if (valueTextArea.getValue().isEmpty()) { + uiNotification.displayValidationError(i18n.get("message.value.missing")); + return false; + } + return true; + } + + private boolean duplicateCheck(E entity) { + try { + checkForDuplicate(entity, keyTextField.getValue()); + } catch (final EntityNotFoundException exception) { + return false; + } + uiNotification.displayValidationError(i18n.get("message.metadata.duplicate.check", keyTextField.getValue())); + return true; + } + + private String getMetadataCaption(String nameVersionStr) { + final StringBuilder caption = new StringBuilder(); + caption.append(HawkbitCommonUtil.DIV_DESCRIPTION + i18n.get("caption.metadata.popup") + " " + + HawkbitCommonUtil.getBoldHTMLText(nameVersionStr)); + caption.append(HawkbitCommonUtil.DIV_CLOSE); + return caption.toString(); + } + + private void onDiscard() { + if (metaDataGrid.getSelectedRow() == null) { + keyTextField.clear(); + valueTextArea.clear(); + } else { + Object itemSelected = metaDataGrid.getSelectedRow(); + popualateKeyValue(itemSelected); + } + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + + private void onKeyChange(TextChangeEvent event) { + if (!valueTextArea.getValue().isEmpty() && !event.getText().isEmpty()) { + metadataWindow.setSaveButtonEnabled(true); + metadataWindow.setCancelButtonEnabled(true); + } else { + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + + } + + private void onRowClick(SelectionEvent event) { + Set itemsSelected = event.getSelected(); + if (!itemsSelected.isEmpty()) { + Object itemSelected = itemsSelected.stream().findFirst().isPresent() ? itemsSelected.stream().findFirst() + .get() : null; + popualateKeyValue(itemSelected); + addIcon.setEnabled(true); + } else { + keyTextField.clear(); + valueTextArea.clear(); + keyTextField.setEnabled(true); + addIcon.setEnabled(false); + } + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + + private void onValueChange(TextChangeEvent event) { + if (!keyTextField.getValue().isEmpty() && !event.getText().isEmpty()) { + metadataWindow.setSaveButtonEnabled(true); + metadataWindow.setCancelButtonEnabled(true); + } else { + metadataWindow.setSaveButtonEnabled(false); + metadataWindow.setCancelButtonEnabled(false); + } + } + + private void onResize(WindowModeChangeEvent event) { + if (event.getWindowMode() == WindowMode.MAXIMIZED) { + metaDataGrid.getColumn(DELETE_BUTTON).setWidth(70); + } else { + metaDataGrid.getColumn(DELETE_BUTTON).setWidth(50); + } + //Repopulating the grid (forcing for repaint)- workaround as grid size is not getting adjusted + Map keyValueDetails = new LinkedHashMap<>(); + for (Object key : metaDataGrid.getContainerDataSource().getItemIds()) { + Item item = metaDataGrid.getContainerDataSource().getItem(key); + String value = (String) item.getItemProperty(VALUE).getValue(); + keyValueDetails.put((String) key, value); + } + metaDataGrid.getContainerDataSource().removeAllItems(); + for (Entry entry : keyValueDetails.entrySet()) { + addItemToGrid(entry.getKey(), entry.getValue()); + } + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailslayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailslayout.java new file mode 100644 index 000000000..1a66ee0a2 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailslayout.java @@ -0,0 +1,190 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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.detailslayout; + +import java.util.List; + +import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SpPermissionChecker; +import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; +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.utils.I18N; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; + +import com.vaadin.data.Item; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.VaadinSessionScope; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.themes.ValoTheme; + +/** + * + * DistributionSet Metadata details layout. + * + */ + +@SpringComponent +@VaadinSessionScope +public class DistributionSetMetadatadetailslayout extends Table{ + + private static final long serialVersionUID = 2913758299611837718L; + + + private DistributionSetManagement distributionSetManagement; + + private DsMetadataPopupLayout dsMetadataPopupLayout; + + private static final String METADATA_KEY = "Key"; + + private static final String VIEW ="view"; + + private SpPermissionChecker permissionChecker; + + private transient EntityFactory entityFactory; + + private I18N i18n; + + private Long selectedDistSetId; + + /** + * + * @param i18n + * @param permissionChecker + * @param distributionSetManagement + * @param dsMetadataPopupLayout + */ + public void init(final I18N i18n, final SpPermissionChecker permissionChecker, + final DistributionSetManagement distributionSetManagement, + final DsMetadataPopupLayout dsMetadataPopupLayout, + final EntityFactory entityFactory) { + this.i18n = i18n; + this.permissionChecker = permissionChecker; + this.distributionSetManagement = distributionSetManagement; + this.dsMetadataPopupLayout = dsMetadataPopupLayout; + this.entityFactory = entityFactory; + createDSMetadataTable(); + addCustomGeneratedColumns(); + } + + + /** + * Populate software module metadata. + * + * @param distributionSet + */ + public void populateDSMetadata(final DistributionSet distributionSet) { + removeAllItems(); + if (null != distributionSet) { + selectedDistSetId = distributionSet.getId(); + final List dsMetadataList = distributionSet.getMetadata(); + if (null != dsMetadataList && !dsMetadataList.isEmpty()) { + dsMetadataList.forEach(dsMetadata -> setDSMetadataProperties(dsMetadata)); + } + } + } + + /** + * Create metadata . + * + * @param metadataKeyName + */ + public void createMetadata(final String metadataKeyName){ + final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource(); + final Item item = metadataContainer.addItem(metadataKeyName); + item.getItemProperty(METADATA_KEY).setValue(metadataKeyName); + } + + /** + * Delete metadata. + * + * @param metadataKeyName + */ + public void deleteMetadata(final String metadataKeyName){ + final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource(); + metadataContainer.removeItem(metadataKeyName); + } + + private void createDSMetadataTable() { + addStyleName(ValoTheme.TABLE_NO_HORIZONTAL_LINES); + addStyleName(ValoTheme.TABLE_NO_STRIPES); + addStyleName(SPUIStyleDefinitions.SW_MODULE_TABLE); + addStyleName("details-layout"); + setSelectable(false); + setImmediate(true); + setContainerDataSource(getDistSetContainer()); + setColumnHeaderMode(ColumnHeaderMode.EXPLICIT); + addDSMetadataTableHeader(); + setSizeFull(); + //same as height of other tabs in details tabsheet + setHeight(116,Unit.PIXELS); + } + + private IndexedContainer getDistSetContainer() { + final IndexedContainer container = new IndexedContainer(); + container.addContainerProperty(METADATA_KEY, String.class, ""); + setColumnExpandRatio(METADATA_KEY, 0.7f); + setColumnAlignment(METADATA_KEY, Align.LEFT); + + if (permissionChecker.hasUpdateDistributionPermission()) { + container.addContainerProperty(VIEW, Label.class, ""); + setColumnExpandRatio(VIEW, 0.2F); + setColumnAlignment(VIEW, Align.RIGHT); + } + return container; + } + + private void addDSMetadataTableHeader() { + setColumnHeader(METADATA_KEY, i18n.get("header.key")); + } + + + private void setDSMetadataProperties(final DistributionSetMetadata dsMetadata){ + final Item item = getContainerDataSource().addItem(dsMetadata.getKey()); + item.getItemProperty(METADATA_KEY).setValue(dsMetadata.getKey()); + + } + + private void addCustomGeneratedColumns() { + addGeneratedColumn(METADATA_KEY, + (source, itemId, columnId) -> customMetadataDetailButton((String) itemId)); + } + + private Button customMetadataDetailButton(final String metadataKey) { + final Button viewIcon = SPUIComponentProvider.getButton(getDetailLinkId(metadataKey), metadataKey, "View " + + metadataKey + " Metadata details", null, false, null, SPUIButtonStyleSmallNoBorder.class); + viewIcon.setData(metadataKey); + viewIcon.addStyleName(ValoTheme.BUTTON_TINY + " " + ValoTheme.BUTTON_LINK + " " + "on-focus-no-border link" + + " " + "text-style"); + viewIcon.addClickListener(event -> showMetadataDetails(selectedDistSetId, metadataKey)); + return viewIcon; + } + + private static String getDetailLinkId(final String name) { + return new StringBuilder(SPUIComponentIdProvider.DS_METADATA_DETAIL_LINK).append('.').append(name) + .toString(); + } + + private void showMetadataDetails(final Long selectedDistSetId , final String metadataKey) { + DistributionSet distSet = distributionSetManagement.findDistributionSetById(selectedDistSetId); + + /* display the window */ + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(distSet, + entityFactory.generateDistributionSetMetadata(distSet, metadataKey, "") )); + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleMetadatadetailslayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleMetadatadetailslayout.java new file mode 100644 index 000000000..b8fda1b99 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleMetadatadetailslayout.java @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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.detailslayout; + +import java.util.List; + +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SoftwareManagement; +import org.eclipse.hawkbit.repository.SpPermissionChecker; +import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata; +import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; +import org.eclipse.hawkbit.ui.distributions.smtable.SwMetadataPopupLayout; +import org.eclipse.hawkbit.ui.utils.I18N; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; + +import com.vaadin.data.Item; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.Button; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.themes.ValoTheme; + +/** + * + * SoftwareModule Metadata details layout. + * + */ + +@SpringComponent +@ViewScope +public class SoftwareModuleMetadatadetailslayout extends Table { + + private static final long serialVersionUID = 2913758299611838818L; + + private static final String METADATA_KEY = "Key"; + + private SpPermissionChecker permissionChecker; + + private SoftwareManagement softwareManagement; + + private SwMetadataPopupLayout swMetadataPopupLayout; + + private I18N i18n; + + private Long selectedSWModuleId; + + private transient EntityFactory entityFactory; + + public void init(final I18N i18n, final SpPermissionChecker permissionChecker, + final SoftwareManagement softwareManagement, final SwMetadataPopupLayout swMetadataPopupLayout, + final EntityFactory entityFactory) { + this.i18n = i18n; + this.permissionChecker = permissionChecker; + this.softwareManagement = softwareManagement; + this.swMetadataPopupLayout = swMetadataPopupLayout; + this.entityFactory = entityFactory; + createSWMMetadataTable(); + addCustomGeneratedColumns(); + } + + /** + * Populate software module metadata table. + * + * @param swModule + */ + public void populateSMMetadata(final SoftwareModule swModule) { + removeAllItems(); + if (null != swModule) { + selectedSWModuleId = swModule.getId(); + final List swMetadataList = swModule.getMetadata(); + if (null != swMetadataList && !swMetadataList.isEmpty()) { + swMetadataList.forEach(swMetadata -> setSWMetadataProperties(swMetadata)); + } + } + } + + /** + * Create metadata. + * + * @param metadataKeyName + */ + public void createMetadata(final String metadataKeyName) { + final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource(); + final Item item = metadataContainer.addItem(metadataKeyName); + item.getItemProperty(METADATA_KEY).setValue(metadataKeyName); + + } + + /** + * Delete metadata. + * + * @param metadataKeyName + */ + public void deleteMetadata(final String metadataKeyName) { + final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource(); + metadataContainer.removeItem(metadataKeyName); + } + + private void createSWMMetadataTable() { + addStyleName(ValoTheme.TABLE_NO_HORIZONTAL_LINES); + addStyleName(ValoTheme.TABLE_NO_STRIPES); + addStyleName(SPUIStyleDefinitions.SW_MODULE_TABLE); + setSelectable(false); + setImmediate(true); + setContainerDataSource(getSwModuleMetadataContainer()); + setColumnHeaderMode(ColumnHeaderMode.EXPLICIT); + addSMMetadataTableHeader(); + setSizeFull(); + //same as height of other tabs in details tabsheet + setHeight(116,Unit.PIXELS); + } + + private IndexedContainer getSwModuleMetadataContainer() { + final IndexedContainer container = new IndexedContainer(); + container.addContainerProperty(METADATA_KEY, String.class, ""); + setColumnAlignment(METADATA_KEY, Align.LEFT); + return container; + } + + private void addSMMetadataTableHeader() { + setColumnHeader(METADATA_KEY, i18n.get("header.key")); + } + + + private void setSWMetadataProperties(final SoftwareModuleMetadata swMetadata) { + final Item item = getContainerDataSource().addItem(swMetadata.getKey()); + item.getItemProperty(METADATA_KEY).setValue(swMetadata.getKey()); + } + + private void addCustomGeneratedColumns() { + addGeneratedColumn(METADATA_KEY, (source, itemId, columnId) -> customMetadataDetailButton((String) itemId)); + } + + private Button customMetadataDetailButton(final String metadataKey) { + final Button viewLink = SPUIComponentProvider.getButton(getDetailLinkId(metadataKey), metadataKey, "View" + + metadataKey + " Metadata details", null, false, null, SPUIButtonStyleSmallNoBorder.class); + viewLink.setData(metadataKey); + if (permissionChecker.hasUpdateDistributionPermission()) { + viewLink.addStyleName(ValoTheme.BUTTON_TINY + " " + ValoTheme.BUTTON_LINK + " " + "on-focus-no-border link" + + " " + "text-style"); + viewLink.addClickListener(event -> showMetadataDetails(selectedSWModuleId, metadataKey)); + } + return viewLink; + } + + private static String getDetailLinkId(final String name) { + return new StringBuilder(SPUIComponentIdProvider.SW_METADATA_DETAIL_LINK).append('.').append(name).toString(); + } + + private void showMetadataDetails(final Long selectedSWModuleId, final String metadataKey) { + SoftwareModule swmodule = softwareManagement.findSoftwareModuleById(selectedSWModuleId); + /* display the window */ + UI.getCurrent().addWindow( + swMetadataPopupLayout.getWindow(swmodule, + entityFactory.generateSoftwareModuleMetadata(swmodule, metadataKey, ""))); + } + + } 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 09a4f0a08..66ce57197 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 @@ -525,5 +525,50 @@ 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/dstable/DsMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java new file mode 100644 index 000000000..1c3fbc407 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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.distributions.dstable; + +import java.util.List; + +import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; +import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent.MetadataUIEvent; +import org.springframework.beans.factory.annotation.Autowired; + +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; + +/** + * Pop up layout to display distribution metadata. + */ +@SpringComponent +@ViewScope +public class DsMetadataPopupLayout extends AbstractMetadataPopupLayout { + + private static final long serialVersionUID = -7778944849012048106L; + + @Autowired + private transient DistributionSetManagement distributionSetManagement; + + @Autowired + private EntityFactory entityFactory; + + @Override + protected void checkForDuplicate(DistributionSet entity, String value) { + distributionSetManagement.findOne(entity, value); + } + /** + * Create metadata for DistributionSet. + */ + + @Override + protected DistributionSetMetadata createMetadata(DistributionSet entity, String key, String value) { + DistributionSetMetadata dsMetaData = distributionSetManagement.createDistributionSetMetadata(entityFactory + .generateDistributionSetMetadata(entity, key, value)); + setSelectedEntity(dsMetaData.getDistributionSet()); + eventBus.publish(this, new MetadataEvent(MetadataUIEvent.CREATE_DISTRIBUTION_SET_METADATA, dsMetaData)); + return dsMetaData; + } + + /** + * Update metadata for DistributionSet. + */ + @Override + protected DistributionSetMetadata updateMetadata(DistributionSet entity, String key, String value) { + DistributionSetMetadata dsMetaData = distributionSetManagement.updateDistributionSetMetadata(entityFactory + .generateDistributionSetMetadata(entity, key, value)); + setSelectedEntity(dsMetaData.getDistributionSet()); + return dsMetaData; + } + + @Override + protected List getMetadataList() { + return getSelectedEntity().getMetadata(); + } + + /** + * Update metadata for DistributionSet. + */ + + @Override + protected void deleteMetadata(DistributionSet entity, String key, String value) { + DistributionSetMetadata dsMetaData = entityFactory.generateDistributionSetMetadata(entity, key, value); + distributionSetManagement.deleteDistributionSetMetadata(entity, key); + eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_DISTRIBUTION_SET_METADATA, dsMetaData)); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/MetadataEvent.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/MetadataEvent.java new file mode 100644 index 000000000..f82bc5c01 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/MetadataEvent.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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.distributions.event; + +import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; +import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata; +/** + * + * Metadata Events. + * + */ +public class MetadataEvent { + + public enum MetadataUIEvent { + CREATE_DISTRIBUTION_SET_METADATA, DELETE_DISTRIBUTION_SET_METADATA, DELETE_SOFTWARE_MODULE_METADATA, CREATE_SOFTWARE_MODULE_METADATA; + } + + private MetadataUIEvent metadataUIEvent; + + private DistributionSetMetadata distributionSetMetadata; + + private SoftwareModuleMetadata softwareModuleMetadata; + + public MetadataEvent(MetadataUIEvent metadataUIEvent, final DistributionSetMetadata distributionSetMetadata) { + this.metadataUIEvent = metadataUIEvent; + this.distributionSetMetadata = distributionSetMetadata; + } + + public MetadataEvent(MetadataUIEvent metadataUIEvent, final SoftwareModuleMetadata softwareModuleMetadata) { + this.metadataUIEvent = metadataUIEvent; + this.softwareModuleMetadata = softwareModuleMetadata; + } + + public MetadataUIEvent getMetadataUIEvent() { + return metadataUIEvent; + } + + public DistributionSetMetadata getDistributionSetMetadata() { + return distributionSetMetadata; + } + + public SoftwareModuleMetadata getSoftwareModuleMetadata() { + return softwareModuleMetadata; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwMetadataPopupLayout.java new file mode 100644 index 000000000..74be849de --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwMetadataPopupLayout.java @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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.distributions.smtable; + +import java.util.List; + +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.state.ArtifactUploadState; +import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent; +import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent.MetadataUIEvent; +import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; +import org.springframework.beans.factory.annotation.Autowired; + +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; + +/** + * Pop up layout to display software module metadata. + * + */ +@SpringComponent +@ViewScope +public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout { + + private static final long serialVersionUID = -1252090014161012563L; + + @Autowired + private transient SoftwareManagement softwareManagement; + + @Autowired + private ArtifactUploadState artifactUploadState; + + @Autowired + private EntityFactory entityFactory; + + @Autowired + private ManageDistUIState manageDistUIState; + + @Override + protected void checkForDuplicate(SoftwareModule entity, String value) { + softwareManagement.findSoftwareModuleMetadata(entity, value); + } + /** + * Create metadata for SWModule. + */ + @Override + protected SoftwareModuleMetadata createMetadata(SoftwareModule entity, String key, String value) { + SoftwareModuleMetadata swMetadata = softwareManagement.createSoftwareModuleMetadata(entityFactory + .generateSoftwareModuleMetadata(entity, key, value)); + setSelectedEntity(swMetadata.getSoftwareModule()); + eventBus.publish(this, new MetadataEvent(MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA, swMetadata)); + return swMetadata; + } + /** + * Update metadata for SWModule. + */ + @Override + protected SoftwareModuleMetadata updateMetadata(SoftwareModule entity, String key, String value) { + SoftwareModuleMetadata swMetadata = softwareManagement.updateSoftwareModuleMetadata(entityFactory + .generateSoftwareModuleMetadata(entity, key, value)); + setSelectedEntity(swMetadata.getSoftwareModule()); + return swMetadata; + } + + @Override + protected List getMetadataList() { + return getSelectedEntity().getMetadata(); + } + + /** + * delete metadata for SWModule. + */ + @Override + protected void deleteMetadata(SoftwareModule entity, String key, String value) { + SoftwareModuleMetadata swMetadata = entityFactory.generateSoftwareModuleMetadata(entity, key, value); + softwareManagement.deleteSoftwareModuleMetadata(entity, key); + eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA, swMetadata)); + } + +} From a53a6c9f0c2d6478db14908e6f57b3684bda40bb Mon Sep 17 00:00:00 2001 From: AMU7KOR Date: Thu, 23 Jun 2016 15:40:29 +0530 Subject: [PATCH 03/13] Added permission check for create/update metadata Added 'cancel' button in metadata popup Added show 'metadata' icon next to 'edit' icon Signed-off-by: AMU7KOR --- .../smtable/SoftwareModuleDetails.java | 19 ++ .../common/AbstractMetadataPopupLayout.java | 164 ++++++++++++------ .../hawkbit/ui/common/CommonDialogWindow.java | 13 -- .../AbstractTableDetailsLayout.java | 18 ++ .../dstable/DistributionSetDetails.java | 19 ++ .../dstable/DsMetadataPopupLayout.java | 16 +- .../distributions/event/SwModuleUIEvent.java | 18 -- .../smtable/SwMetadataPopupLayout.java | 14 ++ .../smtable/SwModuleDetails.java | 16 ++ .../dstable/DistributionDetails.java | 17 ++ .../management/dstable/DistributionTable.java | 2 +- .../management/targettable/TargetDetails.java | 15 ++ 12 files changed, 244 insertions(+), 87 deletions(-) delete mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/event/SwModuleUIEvent.java 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 ac9dc5bd3..1810a7c5c 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 @@ -200,4 +200,23 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta && selectedUploadSWModule.getName().equals(softwareModule.getName()) && selectedUploadSWModule.getVersion().equals(softwareModule.getVersion()); } + + @Override + protected Boolean isMetadataIconToBeDisplayed() { + return true; + } + + @Override + protected String getShowMetadataButtonId() { + SoftwareModule selectedBaseEntity = getSelectedBaseEntity(); + return SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + selectedBaseEntity.getName() + "." + + selectedBaseEntity.getVersion(); + } + + @Override + protected void showMetadata(ClickEvent event) { + UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); + + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index 67c6680a7..2d23679b0 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -21,6 +21,7 @@ import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.NamedVersionedEntity; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleBorderWithIcon; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.I18N; @@ -81,7 +82,7 @@ public abstract class AbstractMetadataPopupLayout onSave(), event -> onDiscard(), null); - metadataWindow.setSaveButtonEnabled(false); - metadataWindow.setCancelButtonEnabled(false); - metadataWindow.setCancelButtonCaption(i18n.get("button.discard")); - metadataWindow.setCancelButtonIcon(FontAwesome.UNDO); + SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onSave(), event -> onCancel(), null); metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); metadataWindow.setHeight(550, Unit.PIXELS); metadataWindow.setWidth(800, Unit.PIXELS); metadataWindow.getMainLayout().setSizeFull(); metadataWindow.setResizable(true); metadataWindow.addWindowModeChangeListener(event -> onResize(event)); - setUpDetails(entity.getId(),metaData); + metadataWindow.getButtonsLayout().addComponent(discardButton, 1); + setUpDetails(entity.getId(), metaData); return metadataWindow; } - public void setUpDetails(final Long swId, final M metaData) { - keyTextField.clear(); - valueTextArea.clear(); - metadataWindow.setSaveButtonEnabled(false); - metadataWindow.setCancelButtonEnabled(false); - addIcon.setEnabled(true); - if (swId != null) { - metaDataGrid.getContainerDataSource().removeAllItems(); - populateGrid(); - metaDataGrid.getSelectionModel().reset(); - if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { - if (metaData == null) { - metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); - } else { - metaDataGrid.select(metaData.getKey()); - } - } - } - } - public E getSelectedEntity() { return selectedEntity; } @@ -173,12 +152,17 @@ public abstract class AbstractMetadataPopupLayout keyValueDetails = new LinkedHashMap<>(); for (Object key : metaDataGrid.getContainerDataSource().getItemIds()) { Item item = metaDataGrid.getContainerDataSource().getItem(key); @@ -489,4 +502,47 @@ public abstract class AbstractMetadataPopupLayout onDiscard()); + return discardButton; + } + + private void setUpDetails(final Long swId, final M metaData) { + resetDetails(); + if (swId != null) { + metaDataGrid.getContainerDataSource().removeAllItems(); + populateGrid(); + metaDataGrid.getSelectionModel().reset(); + if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { + if (metaData == null) { + metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + } else { + metaDataGrid.select(metaData.getKey()); + } + } else if (hasCreatePermission()) { + keyTextField.setEnabled(true); + valueTextArea.setEnabled(true); + addIcon.setEnabled(false); + } + } + } + + private void resetDetails() { + keyTextField.clear(); + valueTextArea.clear(); + keyTextField.setEnabled(false); + valueTextArea.setEnabled(false); + metadataWindow.setSaveButtonEnabled(false); + setDiscardButtonEnabled(false); + addIcon.setEnabled(true); + } + + private void setDiscardButtonEnabled(Boolean enable) { + discardButton.setEnabled(enable); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java index 227078554..e76053ee7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java @@ -17,7 +17,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.server.FontAwesome; -import com.vaadin.server.Resource; import com.vaadin.ui.AbstractOrderedLayout; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; @@ -161,23 +160,11 @@ public class CommonDialogWindow extends Window { public void setSaveButtonEnabled(final boolean enabled) { saveButton.setEnabled(enabled); } - - public void setCancelButtonEnabled(final boolean enabled) { - cancelButton.setEnabled(enabled); - } public HorizontalLayout getButtonsLayout() { return buttonsLayout; } - public void setCancelButtonCaption(final String caption) { - cancelButton.setCaption(caption); - } - - public void setCancelButtonIcon(final Resource icon) { - cancelButton.setIcon(icon); - } - public VerticalLayout getMainLayout() { return mainLayout; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java index c335ea8f2..4732aa23c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java @@ -63,6 +63,8 @@ public abstract class AbstractTableDetailsLayout extends private Button editButton; + private Button manageMetadataBtn; + private TabSheet detailsTab; private VerticalLayout detailsLayout; @@ -137,6 +139,12 @@ public abstract class AbstractTableDetailsLayout extends editButton.setId(getEditButtonId()); editButton.addClickListener(this::onEdit); + manageMetadataBtn = SPUIComponentProvider.getButton("", "", "", null, false, + FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class); + manageMetadataBtn.setId(getEditButtonId()); + manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon")); + manageMetadataBtn.addClickListener(this::showMetadata); + editButton.setEnabled(false); detailsTab = SPUIComponentProvider.getDetailsTabSheet(); @@ -156,6 +164,10 @@ public abstract class AbstractTableDetailsLayout extends if (hasEditPermission()) { nameEditLayout.addComponent(editButton); nameEditLayout.setComponentAlignment(editButton, Alignment.TOP_RIGHT); + if (isMetadataIconToBeDisplayed()) { + nameEditLayout.addComponent(manageMetadataBtn); + nameEditLayout.setComponentAlignment(manageMetadataBtn, Alignment.TOP_RIGHT); + } } nameEditLayout.setExpandRatio(caption, 1.0F); nameEditLayout.addStyleName(SPUIStyleDefinitions.WIDGET_TITLE); @@ -336,4 +348,10 @@ public abstract class AbstractTableDetailsLayout extends protected abstract String getName(); + protected abstract String getShowMetadataButtonId(); + + protected abstract Boolean isMetadataIconToBeDisplayed(); + + protected abstract void showMetadata(Button.ClickEvent event); + } 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 65b98fd15..b875f3a7a 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 @@ -399,10 +399,29 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return SPUIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; } + @Override + protected Boolean isMetadataIconToBeDisplayed() { + return true; + } + + @Override + protected String getShowMetadataButtonId() { + DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState + .getLastSelectedDistribution().get() : null; + return SPUIComponentIdProvider.DS_TABLE_MANAGE_METADATA_ID + "." + lastselectedDistDS.getName() + "." + + lastselectedDistDS.getVersion(); + } + 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()); } + + + @Override + protected void showMetadata(ClickEvent event) { + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java index 1c3fbc407..2041944d4 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetadataPopupLayout.java @@ -12,6 +12,7 @@ import java.util.List; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SpPermissionChecker; import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout; @@ -37,14 +38,17 @@ public class DsMetadataPopupLayout extends AbstractMetadataPopupLayout { return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; } + @Override + protected String getShowMetadataButtonId() { + return null; + } + + @Override + protected Boolean isMetadataIconToBeDisplayed() { + return false; + } + + @Override + protected void showMetadata(ClickEvent event) { + //No implementation required + } + } From e5d4e7c56095ea1793478fa729d6bdd0f7115800 Mon Sep 17 00:00:00 2001 From: AMU7KOR Date: Thu, 23 Jun 2016 15:40:29 +0530 Subject: [PATCH 04/13] Added permission check for create/update metadata Added 'cancel' button in metadata popup Added show 'metadata' icon next to 'edit' icon Conflicts: hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleDetails.java hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetDetails.java hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleDetails.java hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java Signed-off-by: AMU7KOR --- .../ui/artifacts/smtable/SoftwareModuleDetails.java | 9 ++++++--- .../detailslayout/AbstractTableDetailsLayout.java | 3 +++ .../distributions/dstable/DistributionSetDetails.java | 11 +++++++++-- .../ui/distributions/smtable/SwModuleDetails.java | 6 ++++-- .../ui/management/dstable/DistributionDetails.java | 7 +++++-- .../ui/management/targettable/TargetDetails.java | 5 +++++ 6 files changed, 32 insertions(+), 9 deletions(-) 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 1810a7c5c..15904169d 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 @@ -189,7 +189,9 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; } - private void populateMetadataDetails(){ + + @Override + protected void populateMetadataDetails(){ swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); } @@ -215,8 +217,9 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta @Override protected void showMetadata(ClickEvent event) { - UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); - + SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(getSelectedBaseEntityId()); + /* display the window */ + UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule,null)); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java index 4732aa23c..a3c9dd6c7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java @@ -221,6 +221,7 @@ public abstract class AbstractTableDetailsLayout extends populateLog(); populateDescription(); populateDetailsWidget(); + populateMetadataDetails(); } protected void populateLog() { @@ -339,6 +340,8 @@ public abstract class AbstractTableDetailsLayout extends } protected abstract void populateDetailsWidget(); + + protected abstract void populateMetadataDetails(); protected Long getSelectedBaseEntityId() { return selectedBaseEntity == null ? null : selectedBaseEntity.getId(); 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 b875f3a7a..368932d6c 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 @@ -272,7 +272,8 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet } } - private void populateMetadataDetails(){ + @Override + protected void populateMetadataDetails(){ dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); } @@ -404,6 +405,11 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return true; } + @Override + protected Boolean isMetadataIconToBeDisplayed() { + return true; + } + @Override protected String getShowMetadataButtonId() { DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState @@ -422,6 +428,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet @Override protected void showMetadata(ClickEvent event) { - UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); + DistributionSet ds = distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()); + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds,null)); } } 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 b730ede3a..6cec80028 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 @@ -197,7 +197,8 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; } - private void populateMetadataDetails() { + @Override + protected void populateMetadataDetails() { swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); } @@ -222,6 +223,7 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay @Override protected void showMetadata(ClickEvent event) { - UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); + SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(getSelectedBaseEntityId()); + UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null)); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java index 2f6c6b5e3..61f43ebfd 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionDetails.java @@ -158,7 +158,9 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail } - private void populateMetadataDetails(){ + + @Override + protected void populateMetadataDetails(){ dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); } @@ -227,7 +229,8 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail @Override protected void showMetadata(ClickEvent event) { - UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null)); + DistributionSet ds = distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()); + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds,null)); } } 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 6e694af03..997f3f794 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 @@ -263,4 +263,9 @@ public class TargetDetails extends AbstractTableDetailsLayout { //No implementation required } + @Override + protected void populateMetadataDetails() { + //No implementation required + } + } From f20140fbd53c3b9216f61001c8f6bac7f68c3be3 Mon Sep 17 00:00:00 2001 From: AMU7KOR Date: Mon, 27 Jun 2016 11:27:01 +0530 Subject: [PATCH 05/13] Fixed compilation issue Signed-off-by: AMU7KOR --- .../smtable/SoftwareModuleTable.java | 28 +++++++++++- .../dstable/DistributionSetDetails.java | 5 --- .../dstable/DistributionSetTable.java | 44 ------------------- 3 files changed, 26 insertions(+), 51 deletions(-) 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 a27ab6682..0416243f7 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,14 +8,12 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.SMFilterEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent; @@ -23,10 +21,14 @@ import org.eclipse.hawkbit.ui.artifacts.event.UploadViewAcceptCriteria; import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState; import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable; 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.smtable.SwMetadataPopupLayout; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; +import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.TableColumn; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; @@ -40,8 +42,11 @@ 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.Table; import com.vaadin.ui.UI; /** @@ -62,6 +67,9 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable showMetadataDetails((Long) itemId, nameVersionStr)); + return manageMetaDataBtn; + } + }); + } + @Override protected List getTableVisibleColumns() { final List columnList = super.getTableVisibleColumns(); if (!isMaximized()) { + columnList.add(new TableColumn(SPUILabelDefinitions.METADATA_ICON, "", 0.1F)); return columnList; } columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VENDOR, i18n.get("header.vendor"), 0.1F)); 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 368932d6c..6b1cb4689 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 @@ -405,11 +405,6 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return true; } - @Override - protected Boolean isMetadataIconToBeDisplayed() { - return true; - } - @Override protected String getShowMetadataButtonId() { DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState 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 66ce57197..58b64d1b0 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 @@ -496,51 +496,7 @@ public class DistributionSetTable extends AbstractNamedVersionTable 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; - } - - @Override - protected void addCustomGeneratedColumns() { - addGeneratedColumn(SPUILabelDefinitions.METADATA_ICON, new ColumnGenerator() { - private static final long serialVersionUID = 117186282275065399L; - - @Override - public Object generateCell(final Table source, final Object itemId, final Object columnId) { - final String nameVersionStr = getNameAndVerion(itemId); - final Button manageMetaDataBtn = createManageMetadataButton(nameVersionStr); - manageMetaDataBtn.addClickListener(event -> showMetadataDetails(((DistributionSetIdName) itemId).getId())); - return manageMetaDataBtn; - } - }); - } - @Override protected List getTableVisibleColumns() { final List columnList = super.getTableVisibleColumns(); From 22076aba8a676e77b7d2141625f74afdbdd098e6 Mon Sep 17 00:00:00 2001 From: AMU7KOR Date: Mon, 27 Jun 2016 11:36:54 +0530 Subject: [PATCH 06/13] Details : Disable 'manage metadata' icon when no row is selected Signed-off-by: AMU7KOR --- .../ui/common/detailslayout/AbstractTableDetailsLayout.java | 5 +++-- .../hawkbit/ui/management/dstable/DistributionTable.java | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java index a3c9dd6c7..b6475f647 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractTableDetailsLayout.java @@ -138,14 +138,14 @@ public abstract class AbstractTableDetailsLayout extends SPUIButtonStyleSmallNoBorder.class); editButton.setId(getEditButtonId()); editButton.addClickListener(this::onEdit); + editButton.setEnabled(false); manageMetadataBtn = SPUIComponentProvider.getButton("", "", "", null, false, FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class); manageMetadataBtn.setId(getEditButtonId()); manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon")); manageMetadataBtn.addClickListener(this::showMetadata); - - editButton.setEnabled(false); + manageMetadataBtn.setEnabled(false); detailsTab = SPUIComponentProvider.getDetailsTabSheet(); detailsTab.setImmediate(true); @@ -213,6 +213,7 @@ public abstract class AbstractTableDetailsLayout extends private void populateData(final T selectedBaseEntity) { this.selectedBaseEntity = selectedBaseEntity; editButton.setEnabled(selectedBaseEntity != null); + manageMetadataBtn.setEnabled(selectedBaseEntity != null); if (selectedBaseEntity == null) { setName(getDefaultCaption(), StringUtils.EMPTY); } else { 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 a1dc36752..f6cd80853 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 @@ -22,7 +22,6 @@ 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; @@ -33,7 +32,6 @@ 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; From 86427acd5fdf695dab38afdee48ba75a614391ac Mon Sep 17 00:00:00 2001 From: gah6kor Date: Fri, 15 Jul 2016 16:07:02 +0200 Subject: [PATCH 07/13] Adding the missing header --- .../hawkbit/ui/common/CustomCommonDialogWindow.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CustomCommonDialogWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CustomCommonDialogWindow.java index 92c583c48..0f4cfcd78 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CustomCommonDialogWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CustomCommonDialogWindow.java @@ -1,3 +1,11 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations 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; import org.eclipse.hawkbit.ui.utils.I18N; From 834dbc9e8184f42fe28a6a62ac410497b82f6784 Mon Sep 17 00:00:00 2001 From: gah6kor Date: Mon, 18 Jul 2016 11:08:23 +0200 Subject: [PATCH 08/13] Fixed Css issues --- .../common/AbstractMetadataPopupLayout.java | 158 +++++++++--------- .../ui/common/CustomCommonDialogWindow.java | 5 +- .../hawkbit/customstyles/popup-common.scss | 4 + 3 files changed, 85 insertions(+), 82 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index bf1bf3765..467475675 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -67,8 +67,8 @@ import com.vaadin.ui.themes.ValoTheme; * M is the metadata * */ -public abstract class AbstractMetadataPopupLayout extends - CustomComponent { +public abstract class AbstractMetadataPopupLayout + extends CustomComponent { private static final String DELETE_BUTTON = "DELETE_BUTTON"; @@ -102,8 +102,8 @@ public abstract class AbstractMetadataPopupLayout onSave(), event -> onCancel(), null, mainLayout, i18n); - metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); - metadataWindow.setHeight(550, Unit.PIXELS); - metadataWindow.setWidth(800, Unit.PIXELS); - metadataWindow.getMainLayout().setSizeFull(); - metadataWindow.setResizable(true); - metadataWindow.addWindowModeChangeListener(event -> onResize(event)); - ((HorizontalLayout)metadataWindow.getButtonsLayout()).addComponent(discardButton, 1); - setUpDetails(entity.getId(), metaData); - return metadataWindow; - } + public CommonDialogWindow getWindow(final E entity, final M metaData) { + selectedEntity = entity; + final String nameVersion = HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + metadataWindow = SPUIWindowDecorator.getWindow(getMetadataCaption(nameVersion), null, + SPUIDefinitions.CUSTOM_METADATA_WINDOW, this, event -> onSave(), event -> onCancel(), null, mainLayout, + i18n); + metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); + metadataWindow.setHeight(550, Unit.PIXELS); + metadataWindow.setWidth(800, Unit.PIXELS); + metadataWindow.getMainLayout().setSizeFull(); + metadataWindow.setResizable(true); + metadataWindow.getButtonsLayout().setHeight("45px"); + metadataWindow.addWindowModeChangeListener(event -> onResize(event)); + ((HorizontalLayout) metadataWindow.getButtonsLayout()).addComponent(discardButton, 1); + ((HorizontalLayout) metadataWindow.getButtonsLayout()).setComponentAlignment(discardButton, + Alignment.MIDDLE_RIGHT); + setUpDetails(entity.getId(), metaData); + return metadataWindow; + } public E getSelectedEntity() { return selectedEntity; } - public void setSelectedEntity(E selectedEntity) { + public void setSelectedEntity(final E selectedEntity) { this.selectedEntity = selectedEntity; } @@ -182,7 +186,7 @@ public abstract class AbstractMetadataPopupLayout onKeyChange(event)); @@ -257,42 +261,41 @@ public abstract class AbstractMetadataPopupLayout { + i18n.get("caption.metadata.delete.action.confirmbox"), i18n.get("message.confirm.delete.metadata", key), + i18n.get("button.ok"), i18n.get("button.cancel"), ok -> { if (ok) { deleteMetadata(getSelectedEntity(), key, value); uiNotification.displaySuccess(i18n.get("message.metadata.deleted.successfully", key)); - Object selectedRow = metaDataGrid.getSelectedRow(); + final Object selectedRow = metaDataGrid.getSelectedRow(); metaDataGrid.getContainerDataSource().removeItem(event.getItemId()); // force grid to refresh - metaDataGrid.clearSortOrder(); - if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { - if (selectedRow != null) { - if (selectedRow.equals(event.getItemId())) { - metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + metaDataGrid.clearSortOrder(); + if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { + if (selectedRow != null) { + if (selectedRow.equals(event.getItemId())) { + metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + } else { + metaDataGrid.select(selectedRow); + } + } } else { - metaDataGrid.select(selectedRow); + keyTextField.clear(); + valueTextArea.clear(); + metaDataGrid.select(null); + if (hasCreatePermission()) { + keyTextField.setEnabled(true); + valueTextArea.setEnabled(true); + addIcon.setEnabled(false); + } } } - } else { - keyTextField.clear(); - valueTextArea.clear(); - metaDataGrid.select(null); - if (hasCreatePermission()) { - keyTextField.setEnabled(true); - valueTextArea.setEnabled(true); - addIcon.setEnabled(false); - } - } - } - }); + }); UI.getCurrent().addWindow(confirmDialog.getWindow()); confirmDialog.getWindow().bringToFront(); } @@ -320,7 +323,7 @@ public abstract class AbstractMetadataPopupLayout metadataList = getMetadataList(); + final List metadataList = getMetadataList(); for (final M metaData : metadataList) { addItemToGrid(metaData.getKey(), metaData.getValue()); } @@ -350,7 +353,7 @@ public abstract class AbstractMetadataPopupLayout itemsSelected = event.getSelected(); + private void onRowClick(final SelectionEvent event) { + final Set itemsSelected = event.getSelected(); if (!itemsSelected.isEmpty()) { - Object itemSelected = itemsSelected.stream().findFirst().isPresent() ? itemsSelected.stream().findFirst() - .get() : null; + final Object itemSelected = itemsSelected.stream().findFirst().isPresent() + ? itemsSelected.stream().findFirst().get() : null; popualateKeyValue(itemSelected); addIcon.setEnabled(true); } else { @@ -463,8 +466,7 @@ public abstract class AbstractMetadataPopupLayout keyValueDetails = new LinkedHashMap<>(); - for (Object key : metaDataGrid.getContainerDataSource().getItemIds()) { - Item item = metaDataGrid.getContainerDataSource().getItem(key); - String value = (String) item.getItemProperty(VALUE).getValue(); + final Map keyValueDetails = new LinkedHashMap<>(); + for (final Object key : metaDataGrid.getContainerDataSource().getItemIds()) { + final Item item = metaDataGrid.getContainerDataSource().getItem(key); + final String value = (String) item.getItemProperty(VALUE).getValue(); keyValueDetails.put((String) key, value); } metaDataGrid.getContainerDataSource().removeAllItems(); - for (Entry entry : keyValueDetails.entrySet()) { + for (final Entry entry : keyValueDetails.entrySet()) { addItemToGrid(entry.getKey(), entry.getValue()); } } private Button createDiscardButton() { - Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, + final Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, i18n.get("button.discard"), "", "", true, FontAwesome.UNDO, SPUIButtonStyleBorderWithIcon.class); discardButton.setSizeUndefined(); discardButton.addStyleName("default-color"); @@ -544,10 +546,8 @@ public abstract class AbstractMetadataPopupLayout Date: Mon, 18 Jul 2016 11:08:23 +0200 Subject: [PATCH 09/13] Formatted the code --- .../common/AbstractMetadataPopupLayout.java | 159 +++++++++--------- .../ui/common/CustomCommonDialogWindow.java | 5 +- .../hawkbit/customstyles/popup-common.scss | 4 + 3 files changed, 86 insertions(+), 82 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index bf1bf3765..f894f8f04 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -67,8 +67,8 @@ import com.vaadin.ui.themes.ValoTheme; * M is the metadata * */ -public abstract class AbstractMetadataPopupLayout extends - CustomComponent { +public abstract class AbstractMetadataPopupLayout + extends CustomComponent { private static final String DELETE_BUTTON = "DELETE_BUTTON"; @@ -102,8 +102,8 @@ public abstract class AbstractMetadataPopupLayout onSave(), event -> onCancel(), null, mainLayout, i18n); - metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); - metadataWindow.setHeight(550, Unit.PIXELS); - metadataWindow.setWidth(800, Unit.PIXELS); - metadataWindow.getMainLayout().setSizeFull(); - metadataWindow.setResizable(true); - metadataWindow.addWindowModeChangeListener(event -> onResize(event)); - ((HorizontalLayout)metadataWindow.getButtonsLayout()).addComponent(discardButton, 1); - setUpDetails(entity.getId(), metaData); - return metadataWindow; - } + public CommonDialogWindow getWindow(final E entity, final M metaData) { + selectedEntity = entity; + final String nameVersion = HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + metadataWindow = SPUIWindowDecorator.getWindow(getMetadataCaption(nameVersion), null, + SPUIDefinitions.CUSTOM_METADATA_WINDOW, this, event -> onSave(), event -> onCancel(), null, mainLayout, + i18n); + metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID); + metadataWindow.setHeight(550, Unit.PIXELS); + metadataWindow.setWidth(800, Unit.PIXELS); + metadataWindow.getMainLayout().setSizeFull(); + metadataWindow.setResizable(true); + metadataWindow.getButtonsLayout().setHeight("45px"); + metadataWindow.addWindowModeChangeListener(event -> onResize(event)); + ((HorizontalLayout) metadataWindow.getButtonsLayout()).addComponent(discardButton, 1); + ((HorizontalLayout) metadataWindow.getButtonsLayout()).setComponentAlignment(discardButton, + Alignment.MIDDLE_RIGHT); + setUpDetails(entity.getId(), metaData); + return metadataWindow; + } public E getSelectedEntity() { return selectedEntity; } - public void setSelectedEntity(E selectedEntity) { + public void setSelectedEntity(final E selectedEntity) { this.selectedEntity = selectedEntity; } @@ -182,11 +186,12 @@ public abstract class AbstractMetadataPopupLayout onKeyChange(event)); @@ -257,42 +262,41 @@ public abstract class AbstractMetadataPopupLayout { + i18n.get("caption.metadata.delete.action.confirmbox"), i18n.get("message.confirm.delete.metadata", key), + i18n.get("button.ok"), i18n.get("button.cancel"), ok -> { if (ok) { deleteMetadata(getSelectedEntity(), key, value); uiNotification.displaySuccess(i18n.get("message.metadata.deleted.successfully", key)); - Object selectedRow = metaDataGrid.getSelectedRow(); + final Object selectedRow = metaDataGrid.getSelectedRow(); metaDataGrid.getContainerDataSource().removeItem(event.getItemId()); // force grid to refresh - metaDataGrid.clearSortOrder(); - if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { - if (selectedRow != null) { - if (selectedRow.equals(event.getItemId())) { - metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + metaDataGrid.clearSortOrder(); + if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) { + if (selectedRow != null) { + if (selectedRow.equals(event.getItemId())) { + metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0)); + } else { + metaDataGrid.select(selectedRow); + } + } } else { - metaDataGrid.select(selectedRow); + keyTextField.clear(); + valueTextArea.clear(); + metaDataGrid.select(null); + if (hasCreatePermission()) { + keyTextField.setEnabled(true); + valueTextArea.setEnabled(true); + addIcon.setEnabled(false); + } } } - } else { - keyTextField.clear(); - valueTextArea.clear(); - metaDataGrid.select(null); - if (hasCreatePermission()) { - keyTextField.setEnabled(true); - valueTextArea.setEnabled(true); - addIcon.setEnabled(false); - } - } - } - }); + }); UI.getCurrent().addWindow(confirmDialog.getWindow()); confirmDialog.getWindow().bringToFront(); } @@ -320,7 +324,7 @@ public abstract class AbstractMetadataPopupLayout metadataList = getMetadataList(); + final List metadataList = getMetadataList(); for (final M metaData : metadataList) { addItemToGrid(metaData.getKey(), metaData.getValue()); } @@ -350,7 +354,7 @@ public abstract class AbstractMetadataPopupLayout itemsSelected = event.getSelected(); + private void onRowClick(final SelectionEvent event) { + final Set itemsSelected = event.getSelected(); if (!itemsSelected.isEmpty()) { - Object itemSelected = itemsSelected.stream().findFirst().isPresent() ? itemsSelected.stream().findFirst() - .get() : null; + final Object itemSelected = itemsSelected.stream().findFirst().isPresent() + ? itemsSelected.stream().findFirst().get() : null; popualateKeyValue(itemSelected); addIcon.setEnabled(true); } else { @@ -463,8 +467,7 @@ public abstract class AbstractMetadataPopupLayout keyValueDetails = new LinkedHashMap<>(); - for (Object key : metaDataGrid.getContainerDataSource().getItemIds()) { - Item item = metaDataGrid.getContainerDataSource().getItem(key); - String value = (String) item.getItemProperty(VALUE).getValue(); + final Map keyValueDetails = new LinkedHashMap<>(); + for (final Object key : metaDataGrid.getContainerDataSource().getItemIds()) { + final Item item = metaDataGrid.getContainerDataSource().getItem(key); + final String value = (String) item.getItemProperty(VALUE).getValue(); keyValueDetails.put((String) key, value); } metaDataGrid.getContainerDataSource().removeAllItems(); - for (Entry entry : keyValueDetails.entrySet()) { + for (final Entry entry : keyValueDetails.entrySet()) { addItemToGrid(entry.getKey(), entry.getValue()); } } private Button createDiscardButton() { - Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, + final Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, i18n.get("button.discard"), "", "", true, FontAwesome.UNDO, SPUIButtonStyleBorderWithIcon.class); discardButton.setSizeUndefined(); discardButton.addStyleName("default-color"); @@ -544,10 +547,8 @@ public abstract class AbstractMetadataPopupLayout Date: Mon, 18 Jul 2016 16:01:49 +0200 Subject: [PATCH 10/13] Formatted the code --- .../eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index f894f8f04..467475675 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -191,7 +191,6 @@ public abstract class AbstractMetadataPopupLayout Date: Mon, 18 Jul 2016 16:15:30 +0200 Subject: [PATCH 11/13] Formatted the code --- .../eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index 467475675..08294a182 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -184,6 +184,7 @@ public abstract class AbstractMetadataPopupLayout Date: Tue, 19 Jul 2016 12:42:16 +0200 Subject: [PATCH 12/13] Removed the discard and maximize buttons --- .../common/AbstractMetadataPopupLayout.java | 67 ------------------- 1 file changed, 67 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java index ab7c03c86..050d7c79f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractMetadataPopupLayout.java @@ -8,10 +8,7 @@ */ package org.eclipse.hawkbit.ui.common; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import javax.annotation.PostConstruct; @@ -21,7 +18,6 @@ import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.NamedVersionedEntity; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer; -import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleNoBorderWithIcon; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.decorators.SPUIWindowDecorator; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; @@ -39,7 +35,6 @@ import com.vaadin.data.util.IndexedContainer; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.SelectionEvent; import com.vaadin.server.FontAwesome; -import com.vaadin.shared.ui.window.WindowMode; import com.vaadin.ui.AbstractTextField.TextChangeEventMode; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; @@ -53,7 +48,6 @@ import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window.WindowModeChangeEvent; import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent; import com.vaadin.ui.themes.ValoTheme; @@ -93,8 +87,6 @@ public abstract class AbstractMetadataPopupLayout onResize(event)); - ((HorizontalLayout) metadataWindow.getButtonsLayout()).addComponent(discardButton, 1); - ((HorizontalLayout) metadataWindow.getButtonsLayout()).setComponentAlignment(discardButton, - Alignment.MIDDLE_RIGHT); setUpDetails(entity.getId(), metaData); return metadataWindow; } @@ -169,7 +156,6 @@ public abstract class AbstractMetadataPopupLayout keyValueDetails = new LinkedHashMap<>(); - for (final Object key : metaDataGrid.getContainerDataSource().getItemIds()) { - final Item item = metaDataGrid.getContainerDataSource().getItem(key); - final String value = (String) item.getItemProperty(VALUE).getValue(); - keyValueDetails.put((String) key, value); - } - metaDataGrid.getContainerDataSource().removeAllItems(); - for (final Entry entry : keyValueDetails.entrySet()) { - addItemToGrid(entry.getKey(), entry.getValue()); - } - } - - private Button createDiscardButton() { - final Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON, - i18n.get("button.discard"), "", "", true, FontAwesome.UNDO, SPUIButtonStyleNoBorderWithIcon.class); - discardButton.setSizeUndefined(); - discardButton.addStyleName("default-color"); - discardButton.addClickListener(event -> onDiscard()); - return discardButton; - } - private void setUpDetails(final Long swId, final M metaData) { resetDetails(); if (swId != null) { @@ -543,12 +481,7 @@ public abstract class AbstractMetadataPopupLayout Date: Thu, 21 Jul 2016 11:44:41 +0200 Subject: [PATCH 13/13] Upgrade Apache Collections to 4.1 due to known vulnerability. Signed-off-by: kaizimmerm --- pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index e699db0f1..9038d2e56 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,6 @@ 5.2.4.Final 1.2.0.RELEASE 1.6.1.RELEASE - 3.6.2 0.18.0.RELEASE Fowler-SR1 @@ -111,7 +110,7 @@ 1.1 1.1.1 3.4 - 4.0 + 4.1 20141113 2.0.0 @@ -528,11 +527,6 @@ org.eclipse.persistence.jpa ${eclipselink.version} - - com.rabbitmq - amqp-client - ${rabbitmq.version} - cz.jirutka.rsql