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 ae252ee11..76461eee7 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,150 +8,36 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; -import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.ui.SpPermissionChecker; -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.common.detailslayout.AbstractSoftwareModuleDetails; import org.eclipse.hawkbit.ui.distributions.smtable.SwMetadataPopupLayout; -import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.vaadin.spring.events.EventBus.UIEventBus; -import org.vaadin.spring.events.EventScope; -import org.vaadin.spring.events.annotation.EventBusListenerMethod; - -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Label; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.UI; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; /** * Software module details. */ -public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDetailsLayout { +public class SoftwareModuleDetails extends AbstractSoftwareModuleDetails { - private static final long serialVersionUID = -4900381301076646366L; - - private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; + private static final long serialVersionUID = 1L; private final ArtifactUploadState artifactUploadState; - private final transient SoftwareManagement softwareManagement; - - private final SwMetadataPopupLayout swMetadataPopupLayout; - - private final SoftwareModuleMetadatadetailslayout swmMetadataTable; - - SoftwareModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, + SoftwareModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow, final ArtifactUploadState artifactUploadState, final SoftwareManagement softwareManagement, final SwMetadataPopupLayout swMetadataPopupLayout, final EntityFactory entityFactory) { - super(i18n, eventBus, permissionChecker, null); - this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + super(i18n, eventBus, permissionChecker, null, softwareManagement, swMetadataPopupLayout, entityFactory, + softwareModuleAddUpdateWindow); this.artifactUploadState = artifactUploadState; - this.softwareManagement = softwareManagement; - this.swMetadataPopupLayout = swMetadataPopupLayout; - - swmMetadataTable = new SoftwareModuleMetadatadetailslayout(); - swmMetadataTable.init(getI18n(), getPermissionChecker(), softwareManagement, swMetadataPopupLayout, - entityFactory); - addTabs(detailsTab); restoreState(); } - @EventBusListenerMethod(scope = EventScope.UI) - void onEvent(final MetadataEvent event) { - UI.getCurrent().access(() -> { - final MetaData softwareModuleMetadata = event.getMetaData(); - if (softwareModuleMetadata != null && isSoftwareModuleSelected(event.getModule())) { - if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA) { - swmMetadataTable.createMetadata(event.getMetaData().getKey()); - } else if (event - .getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA) { - swmMetadataTable.deleteMetadata(event.getMetaData().getKey()); - } - } - }); - } - - @Override - protected String getEditButtonId() { - return UIComponentIdProvider.UPLOAD_SW_MODULE_EDIT_BUTTON; - } - - @Override - protected void addTabs(final TabSheet detailsTab) { - detailsTab.addTab(createDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); - detailsTab.addTab(createDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); - detailsTab.addTab(createLogLayout(), getI18n().getMessage("caption.logs.tab"), null); - detailsTab.addTab(swmMetadataTable, getI18n().getMessage("caption.metadata"), null); - } - - @Override - protected void onEdit(final ClickEvent event) { - final Window addSoftwareModule = softwareModuleAddUpdateWindow - .createUpdateSoftwareModuleWindow(getSelectedBaseEntityId()); - addSoftwareModule.setCaption(getI18n().getMessage("upload.caption.update.swmodule")); - UI.getCurrent().addWindow(addSoftwareModule); - addSoftwareModule.setVisible(Boolean.TRUE); - } - - @Override - protected void populateDetailsWidget() { - if (getSelectedBaseEntity() != null) { - String maxAssign; - if (getSelectedBaseEntity().getType().getMaxAssignments() == 1) { - maxAssign = getI18n().getMessage("label.singleAssign.type"); - } else { - maxAssign = getI18n().getMessage("label.multiAssign.type"); - } - updateSoftwareModuleDetailsLayout(getSelectedBaseEntity().getType().getName(), - getSelectedBaseEntity().getVendor(), maxAssign); - } else { - updateSoftwareModuleDetailsLayout(StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY); - } - populateMetadataDetails(); - } - - private void updateSoftwareModuleDetailsLayout(final String type, final String vendor, final String maxAssign) { - final VerticalLayout detailsTabLayout = getDetailsLayout(); - - detailsTabLayout.removeAllComponents(); - - final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.vendor"), - HawkbitCommonUtil.trimAndNullIfEmpty(vendor) == null ? "" : vendor); - vendorLabel.setId(UIComponentIdProvider.DETAILS_VENDOR_LABEL_ID); - detailsTabLayout.addComponent(vendorLabel); - - if (type != null) { - final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.type"), - type); - typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); - detailsTabLayout.addComponent(typeLabel); - } - - final Label assignLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.assigned.type"), - HawkbitCommonUtil.trimAndNullIfEmpty(maxAssign) == null ? "" : maxAssign); - assignLabel.setId(UIComponentIdProvider.SWM_DTLS_MAX_ASSIGN); - detailsTabLayout.addComponent(assignLabel); - - } - - @Override - protected String getDefaultCaption() { - return getI18n().getMessage("upload.swModuleTable.header"); - } - @Override protected boolean onLoadIsTableRowSelected() { return artifactUploadState.getSelectedBaseSoftwareModule().isPresent(); @@ -162,47 +48,14 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta return artifactUploadState.isSwModuleTableMaximized(); } - @EventBusListenerMethod(scope = EventScope.UI) - void onEvent(final SoftwareModuleEvent softwareModuleEvent) { - onBaseEntityEvent(softwareModuleEvent); - } - - @Override - protected boolean hasEditPermission() { - return getPermissionChecker().hasUpdateDistributionPermission(); - } - @Override protected String getTabSheetId() { return null; } @Override - protected String getDetailsHeaderCaptionId() { - return UIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; - } - - @Override - protected void populateMetadataDetails() { - swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); - } - - private boolean isSoftwareModuleSelected(final SoftwareModule softwareModule) { - final SoftwareModule selectedUploadSWModule = artifactUploadState.getSelectedBaseSoftwareModule().orElse(null); - return softwareModule != null && selectedUploadSWModule != null - && selectedUploadSWModule.getName().equals(softwareModule.getName()) - && selectedUploadSWModule.getVersion().equals(softwareModule.getVersion()); - } - - @Override - protected boolean isMetadataIconToBeDisplayed() { - return true; - } - - @Override - protected void showMetadata(final ClickEvent event) { - softwareManagement.findSoftwareModuleById(getSelectedBaseEntityId()) - .ifPresent(swmodule -> UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null))); + protected boolean isSoftwareModuleSelected(final SoftwareModule softwareModule) { + return compareSoftwareModulesById(softwareModule, artifactUploadState.getSelectedBaseSwModuleId().orElse(null)); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTableHeader.java index dc6908cbc..6fd305c42 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTableHeader.java @@ -13,33 +13,24 @@ import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent; import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState; -import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader; +import org.eclipse.hawkbit.ui.common.table.AbstractSoftwareModuleTableHeader; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.event.dd.DropHandler; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.UI; -import com.vaadin.ui.Window; - /** * Header of Software module table. */ -public class SoftwareModuleTableHeader extends AbstractTableHeader { +public class SoftwareModuleTableHeader extends AbstractSoftwareModuleTableHeader { - private static final long serialVersionUID = 242961845006626297L; + private static final long serialVersionUID = 1L; - private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; - - SoftwareModuleTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, final UIEventBus eventbus, - final ArtifactUploadState artifactUploadState, + SoftwareModuleTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, + final UIEventBus eventbus, final ArtifactUploadState artifactUploadState, final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow) { - super(i18n, permChecker, eventbus, null, null, artifactUploadState); - this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + super(i18n, permChecker, eventbus, null, null, artifactUploadState, softwareModuleAddUpdateWindow); } @EventBusListenerMethod(scope = EventScope.UI) @@ -49,59 +40,11 @@ public class SoftwareModuleTableHeader extends AbstractTableHeader { } } - @Override - protected String getHeaderCaption() { - return i18n.getMessage("upload.swModuleTable.header"); - } - - @Override - protected String getSearchBoxId() { - return UIComponentIdProvider.SW_MODULE_SEARCH_TEXT_FIELD; - } - - @Override - protected String getSearchRestIconId() { - return UIComponentIdProvider.SW_MODULE_SEARCH_RESET_ICON; - } - - @Override - protected String getAddIconId() { - return UIComponentIdProvider.SW_MODULE_ADD_BUTTON; - } - @Override protected String onLoadSearchBoxValue() { return artifactUploadState.getSoftwareModuleFilters().getSearchText().orElse(null); } - @Override - protected String getDropFilterId() { - /* No dropping on software module table header in Upload View */ - return null; - } - - @Override - protected boolean hasCreatePermission() { - return permChecker.hasCreateDistributionPermission(); - } - - @Override - protected boolean isDropHintRequired() { - /* No dropping on software module table header in Upload View */ - return false; - } - - @Override - protected boolean isDropFilterRequired() { - /* No dropping on software module table header in Upload View */ - return false; - } - - @Override - protected String getShowFilterButtonLayoutId() { - return "show.type.icon"; - } - @Override protected void showFilterButtonsLayout() { artifactUploadState.setSwTypeFilterClosed(false); @@ -117,11 +60,6 @@ public class SoftwareModuleTableHeader extends AbstractTableHeader { } } - @Override - protected String getMaxMinIconId() { - return UIComponentIdProvider.SW_MAX_MIN_TABLE_ICON; - } - @Override public void maximizeTable() { artifactUploadState.setSwModuleTableMaximized(Boolean.TRUE); @@ -152,50 +90,8 @@ public class SoftwareModuleTableHeader extends AbstractTableHeader { } @Override - protected void addNewItem(final ClickEvent event) { - final Window addSoftwareModule = softwareModuleAddUpdateWindow.createAddSoftwareModuleWindow(); - addSoftwareModule.setCaption(i18n.getMessage("upload.caption.add.new.swmodule")); - UI.getCurrent().addWindow(addSoftwareModule); - addSoftwareModule.setVisible(Boolean.TRUE); - } - - @Override - protected Boolean isAddNewItemAllowed() { - return Boolean.TRUE; - } - - @Override - protected String getFilterIconStyle() { - return null; - } - - @Override - protected String getDropFilterWrapperId() { - return null; - } - - @Override - protected DropHandler getDropFilterHandler() { - return null; - } - - @Override - protected String getBulkUploadIconId() { - return null; - } - - @Override - protected void bulkUpload(final ClickEvent event) { - // No implementation as no bulk upload is supported. - } - - @Override - protected Boolean isBulkUploadAllowed() { - return Boolean.FALSE; - } - - @Override - protected boolean isBulkUploadInProgress() { + protected boolean isDropHintRequired() { + /* No dropping on software module table header in Upload View */ return false; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractDistributionSetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractDistributionSetDetails.java new file mode 100644 index 000000000..5106ae767 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractDistributionSetDetails.java @@ -0,0 +1,213 @@ +/** + * 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.Optional; + +import org.eclipse.hawkbit.repository.DistributionSetManagement; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.TagManagement; +import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken; +import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.distributions.dstable.DsMetadataPopupLayout; +import org.eclipse.hawkbit.ui.management.dstable.DistributionAddUpdateWindowLayout; +import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; +import org.eclipse.hawkbit.ui.management.state.ManagementUIState; +import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.UINotification; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.vaadin.spring.events.EventBus.UIEventBus; +import org.vaadin.spring.events.EventScope; +import org.vaadin.spring.events.annotation.EventBusListenerMethod; + +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Label; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +/** + * Abstract class which contains common code for Distribution Set Details + * + */ +public abstract class AbstractDistributionSetDetails + extends AbstractNamedVersionedEntityTableDetailsLayout { + + private static final long serialVersionUID = 1L; + + private final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout; + + private final DistributionSetMetadatadetailsLayout dsMetadataTable; + + private final UINotification uiNotification; + + private final transient DistributionSetManagement distributionSetManagement; + + private final DsMetadataPopupLayout dsMetadataPopupLayout; + + private final DistributionTagToken distributionTagToken; + + private final SoftwareModuleDetailsTable softwareModuleDetailsTable; + + private VerticalLayout softwareModuleTab; + + protected AbstractDistributionSetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final ManagementUIState managementUIState, + final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout, + final DistributionSetManagement distributionSetManagement, + final DsMetadataPopupLayout dsMetadataPopupLayout, final EntityFactory entityFactory, + final UINotification uiNotification, final TagManagement tagManagement, + final SoftwareModuleDetailsTable softwareModuleDetailsTable) { + super(i18n, eventBus, permissionChecker, managementUIState); + this.distributionAddUpdateWindowLayout = distributionAddUpdateWindowLayout; + this.uiNotification = uiNotification; + this.distributionSetManagement = distributionSetManagement; + this.dsMetadataPopupLayout = dsMetadataPopupLayout; + this.distributionTagToken = new DistributionTagToken(permissionChecker, i18n, uiNotification, eventBus, + managementUIState, tagManagement, distributionSetManagement); + this.softwareModuleDetailsTable = softwareModuleDetailsTable; + + dsMetadataTable = new DistributionSetMetadatadetailsLayout(i18n, permissionChecker, distributionSetManagement, + dsMetadataPopupLayout, entityFactory, uiNotification); + createSoftwareModuleTab(); + addDetailsTab(); + } + + @Override + protected void onEdit(final ClickEvent event) { + final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(getSelectedBaseEntityId()); + newDistWindow.setCaption(getI18n().getMessage(UIComponentIdProvider.DIST_UPDATE_CAPTION)); + UI.getCurrent().addWindow(newDistWindow); + newDistWindow.setVisible(Boolean.TRUE); + } + + @EventBusListenerMethod(scope = EventScope.UI) + void onEvent(final DistributionTableEvent distributionTableEvent) { + onBaseEntityEvent(distributionTableEvent); + } + + @Override + protected String getDefaultCaption() { + return getI18n().getMessage("distribution.details.header"); + } + + @Override + protected String getEditButtonId() { + return UIComponentIdProvider.DS_EDIT_BUTTON; + } + + @Override + protected boolean hasEditPermission() { + return getPermissionChecker().hasUpdateDistributionPermission(); + } + + @Override + protected String getTabSheetId() { + return UIComponentIdProvider.DISTRIBUTIONSET_DETAILS_TABSHEET_ID; + } + + @Override + protected void populateMetadataDetails() { + dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); + } + + @Override + protected String getDetailsHeaderCaptionId() { + return UIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; + } + + @Override + protected boolean isMetadataIconToBeDisplayed() { + return true; + } + + @Override + protected void showMetadata(final ClickEvent event) { + final Optional ds = distributionSetManagement + .findDistributionSetById(getSelectedBaseEntityId()); + if (!ds.isPresent()) { + uiNotification.displayWarning(getI18n().getMessage("distributionset.not.exists")); + return; + } + UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds.get(), null)); + } + + private final void addDetailsTab() { + getDetailsTab().addTab(getDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); + getDetailsTab().addTab(getDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); + getDetailsTab().addTab(softwareModuleTab, getI18n().getMessage("caption.softwares.distdetail.tab"), null); + getDetailsTab().addTab(getTagsLayout(), getI18n().getMessage("caption.tags.tab"), null); + getDetailsTab().addTab(getLogLayout(), getI18n().getMessage("caption.logs.tab"), null); + getDetailsTab().addTab(dsMetadataTable, getI18n().getMessage("caption.metadata"), null); + } + + protected void populateDetails() { + if (getSelectedBaseEntity() != null) { + updateDistributionSetDetailsLayout(getSelectedBaseEntity().getType().getName(), + getSelectedBaseEntity().isRequiredMigrationStep()); + } else { + updateDistributionSetDetailsLayout(null, null); + } + } + + protected void populateModule() { + softwareModuleDetailsTable.populateModule(getSelectedBaseEntity()); + } + + private final void createSoftwareModuleTab() { + this.softwareModuleTab = createTabLayout(); + softwareModuleTab.setSizeFull(); + softwareModuleTab.addComponent(softwareModuleDetailsTable); + } + + private void updateDistributionSetDetailsLayout(final String type, final Boolean isMigrationRequired) { + final VerticalLayout detailsTabLayout = getDetailsLayout(); + detailsTabLayout.removeAllComponents(); + + if (type != null) { + final Label typeLabel = SPUIComponentProvider + .createNameValueLabel(getI18n().getMessage("label.dist.details.type"), type); + typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); + detailsTabLayout.addComponent(typeLabel); + } + + if (isMigrationRequired != null) { + detailsTabLayout.addComponent(SPUIComponentProvider.createNameValueLabel( + getI18n().getMessage("checkbox.dist.migration.required"), isMigrationRequired.equals(Boolean.TRUE) + ? getI18n().getMessage("label.yes") : getI18n().getMessage("label.no"))); + } + } + + protected SoftwareModuleDetailsTable getSoftwareModuleTable() { + return softwareModuleDetailsTable; + } + + protected DistributionAddUpdateWindowLayout getDistributionAddUpdateWindowLayout() { + return distributionAddUpdateWindowLayout; + } + + protected UINotification getUiNotification() { + return uiNotification; + } + + protected DistributionSetManagement getDistributionSetManagement() { + return distributionSetManagement; + } + + protected DsMetadataPopupLayout getDsMetadataPopupLayout() { + return dsMetadataPopupLayout; + } + + protected DistributionTagToken getDistributionTagToken() { + return distributionTagToken; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractSoftwareModuleDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractSoftwareModuleDetails.java new file mode 100644 index 000000000..4af3ca046 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractSoftwareModuleDetails.java @@ -0,0 +1,204 @@ +/** + * 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 org.apache.commons.lang3.StringUtils; +import org.eclipse.hawkbit.repository.EntityFactory; +import org.eclipse.hawkbit.repository.SoftwareManagement; +import org.eclipse.hawkbit.repository.model.MetaData; +import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; +import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; +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.management.state.ManagementUIState; +import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; +import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.vaadin.spring.events.EventBus.UIEventBus; +import org.vaadin.spring.events.EventScope; +import org.vaadin.spring.events.annotation.EventBusListenerMethod; + +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Label; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +/** + * Abstract class which contains common code for Software Module Details + * + */ +public abstract class AbstractSoftwareModuleDetails + extends AbstractNamedVersionedEntityTableDetailsLayout { + + private static final long serialVersionUID = 1L; + + private final SoftwareModuleMetadatadetailslayout swmMetadataTable; + + private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; + + private final transient SoftwareManagement softwareManagement; + + private final SwMetadataPopupLayout swMetadataPopupLayout; + + protected AbstractSoftwareModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final ManagementUIState managementUIState, + final SoftwareManagement softwareManagement, final SwMetadataPopupLayout swMetadataPopupLayout, + final EntityFactory entityFactory, final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow) { + super(i18n, eventBus, permissionChecker, managementUIState); + this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + this.softwareManagement = softwareManagement; + this.swMetadataPopupLayout = swMetadataPopupLayout; + + swmMetadataTable = new SoftwareModuleMetadatadetailslayout(); + swmMetadataTable.init(getI18n(), getPermissionChecker(), softwareManagement, swMetadataPopupLayout, + entityFactory); + + addDetailsTab(); + } + + /** + * MetadataEvent. + * + * @param event + * as instance of {@link MetadataEvent} + */ + @EventBusListenerMethod(scope = EventScope.UI) + void onEvent(final MetadataEvent event) { + UI.getCurrent().access(() -> { + final MetaData softwareModuleMetadata = event.getMetaData(); + if (softwareModuleMetadata == null || !isSoftwareModuleSelected(event.getModule())) { + return; + } + if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.createMetadata(event.getMetaData().getKey()); + } else if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA) { + swmMetadataTable.deleteMetadata(event.getMetaData().getKey()); + } + }); + } + + @EventBusListenerMethod(scope = EventScope.UI) + void onEvent(final SoftwareModuleEvent softwareModuleEvent) { + onBaseEntityEvent(softwareModuleEvent); + } + + private final void addDetailsTab() { + getDetailsTab().addTab(getDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); + getDetailsTab().addTab(getDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); + getDetailsTab().addTab(getLogLayout(), getI18n().getMessage("caption.logs.tab"), null); + getDetailsTab().addTab(swmMetadataTable, getI18n().getMessage("caption.metadata"), null); + } + + @Override + protected void populateMetadataDetails() { + swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); + } + + @Override + protected void onEdit(final ClickEvent event) { + final Window addSoftwareModule = softwareModuleAddUpdateWindow + .createUpdateSoftwareModuleWindow(getSelectedBaseEntityId()); + addSoftwareModule.setCaption(getI18n().getMessage("upload.caption.update.swmodule")); + UI.getCurrent().addWindow(addSoftwareModule); + addSoftwareModule.setVisible(Boolean.TRUE); + } + + @Override + protected String getEditButtonId() { + return UIComponentIdProvider.UPLOAD_SW_MODULE_EDIT_BUTTON; + } + + @Override + protected String getDefaultCaption() { + return getI18n().getMessage("upload.swModuleTable.header"); + } + + @Override + protected boolean hasEditPermission() { + return getPermissionChecker().hasUpdateDistributionPermission(); + } + + @Override + protected String getDetailsHeaderCaptionId() { + return UIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; + } + + @Override + protected boolean isMetadataIconToBeDisplayed() { + return true; + } + + @Override + protected void showMetadata(final ClickEvent event) { + softwareManagement.findSoftwareModuleById(getSelectedBaseEntityId()) + .ifPresent(swmodule -> UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null))); + } + + protected void updateSoftwareModuleDetailsLayout(final String type, final String vendor, final String maxAssign) { + final VerticalLayout detailsTabLayout = getDetailsLayout(); + + detailsTabLayout.removeAllComponents(); + + final Label vendorLabel = SPUIComponentProvider.createNameValueLabel( + getI18n().getMessage("label.dist.details.vendor"), + HawkbitCommonUtil.trimAndNullIfEmpty(vendor) == null ? "" : vendor); + vendorLabel.setId(UIComponentIdProvider.DETAILS_VENDOR_LABEL_ID); + detailsTabLayout.addComponent(vendorLabel); + + if (type != null) { + final Label typeLabel = SPUIComponentProvider + .createNameValueLabel(getI18n().getMessage("label.dist.details.type"), type); + typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); + detailsTabLayout.addComponent(typeLabel); + } + + final Label assignLabel = SPUIComponentProvider.createNameValueLabel( + getI18n().getMessage("label.assigned.type"), + HawkbitCommonUtil.trimAndNullIfEmpty(maxAssign) == null ? "" : maxAssign); + assignLabel.setId(UIComponentIdProvider.SWM_DTLS_MAX_ASSIGN); + detailsTabLayout.addComponent(assignLabel); + } + + @Override + protected void populateDetailsWidget() { + populateDetails(); + populateMetadataDetails(); + } + + protected boolean compareSoftwareModulesById(final SoftwareModule softwareModule, + final Long selectedBaseSwModuleId) { + if (softwareModule == null) { + return false; + } + + return softwareModule.getId().equals(selectedBaseSwModuleId); + } + + protected abstract boolean isSoftwareModuleSelected(SoftwareModule softwareModule); + + private void populateDetails() { + if (getSelectedBaseEntity() != null) { + String maxAssign; + if (getSelectedBaseEntity().getType().getMaxAssignments() == 1) { + maxAssign = getI18n().getMessage("label.singleAssign.type"); + } else { + maxAssign = getI18n().getMessage("label.multiAssign.type"); + } + updateSoftwareModuleDetailsLayout(getSelectedBaseEntity().getType().getName(), + getSelectedBaseEntity().getVendor(), maxAssign); + } else { + updateSoftwareModuleDetailsLayout(StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY); + } + } + +} 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 710cd7a47..1bb875ad7 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 @@ -16,14 +16,15 @@ import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.builder.LabelBuilder; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.common.table.BaseUIEntityEvent; +import org.eclipse.hawkbit.ui.common.tagdetails.AbstractTagToken; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.management.state.ManagementUIState; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.server.FontAwesome; @@ -56,7 +57,7 @@ public abstract class AbstractTableDetailsLayout extends private Button manageMetadataBtn; - protected TabSheet detailsTab; + private TabSheet detailsTab; private final VerticalLayout detailsLayout; @@ -66,22 +67,35 @@ public abstract class AbstractTableDetailsLayout extends private final VerticalLayout attributesLayout; - protected final ManagementUIState managementUIState; + private final VerticalLayout tagsLayout; + + private final ManagementUIState managementUIState; protected AbstractTableDetailsLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, final ManagementUIState managementUIState) { this.i18n = i18n; this.permissionChecker = permissionChecker; this.managementUIState = managementUIState; - detailsLayout = getTabLayout(); - descriptionLayout = getTabLayout(); - logLayout = getTabLayout(); - attributesLayout = getTabLayout(); + detailsLayout = createTabLayout(); + descriptionLayout = createTabLayout(); + logLayout = createTabLayout(); + attributesLayout = createTabLayout(); + tagsLayout = createTabLayout(); createComponents(); buildLayout(); eventBus.subscribe(this); } + public void setSelectedBaseEntity(final T selectedBaseEntity) { + this.selectedBaseEntity = selectedBaseEntity; + } + + protected final VerticalLayout createTabLayout() { + final VerticalLayout tabLayout = SPUIComponentProvider.getDetailTabLayout(); + tabLayout.addStyleName("details-layout"); + return tabLayout; + } + protected SpPermissionChecker getPermissionChecker() { return permissionChecker; } @@ -94,10 +108,6 @@ public abstract class AbstractTableDetailsLayout extends return selectedBaseEntity; } - public void setSelectedBaseEntity(final T selectedBaseEntity) { - this.selectedBaseEntity = selectedBaseEntity; - } - /** * Default implementation to handle an entity event. * @@ -115,6 +125,105 @@ public abstract class AbstractTableDetailsLayout extends } } + protected void setName(final String headerCaption, final String value) { + caption.setValue(HawkbitCommonUtil.getSoftwareModuleName(headerCaption, value)); + } + + protected void restoreState() { + if (onLoadIsTableRowSelected()) { + populateData(null); + editButton.setEnabled(true); + } + if (onLoadIsTableMaximized()) { + setVisible(false); + } + } + + protected void populateTags(final AbstractTagToken tagToken) { + getTagsLayout().removeAllComponents(); + if (getSelectedBaseEntity() == null) { + return; + } + getTagsLayout().addComponent(tagToken.getTokenField()); + } + + protected void populateLog() { + logLayout.removeAllComponents(); + + logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.getMessage("label.created.at"), + SPDateTimeUtil.formatCreatedAt(selectedBaseEntity))); + + logLayout.addComponent(SPUIComponentProvider.createCreatedByLabel(i18n, selectedBaseEntity)); + + if (selectedBaseEntity == null || selectedBaseEntity.getLastModifiedAt() == null) { + return; + } + + logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.getMessage("label.modified.date"), + SPDateTimeUtil.formatLastModifiedAt(selectedBaseEntity))); + + logLayout.addComponent(SPUIComponentProvider.createLastModifiedByLabel(i18n, selectedBaseEntity)); + } + + protected void updateDescriptionLayout(final String descriptionLabel, final String description) { + descriptionLayout.removeAllComponents(); + final Label descLabel = SPUIComponentProvider.createNameValueLabel(descriptionLabel, + HawkbitCommonUtil.trimAndNullIfEmpty(description) == null ? "" : description); + /** + * By default text will be truncated based on layout width .so removing + * it as we need full description. + */ + descLabel.removeStyleName("label-style"); + descLabel.setId(UIComponentIdProvider.DETAILS_DESCRIPTION_LABEL_ID); + descriptionLayout.addComponent(descLabel); + } + + /* + * display Attributes details in Target details. + */ + protected void updateAttributesLayout(final Map attributes) { + if (null != attributes) { + attributesLayout.removeAllComponents(); + for (final Map.Entry entry : attributes.entrySet()) { + final Label conAttributeLabel = SPUIComponentProvider.createNameValueLabel( + entry.getKey().concat(" : "), + HawkbitCommonUtil.trimAndNullIfEmpty(entry.getValue()) == null ? "" : entry.getValue()); + conAttributeLabel.setDescription(entry.getKey().concat(" : ") + entry.getValue()); + conAttributeLabel.addStyleName("label-style"); + attributesLayout.addComponent(conAttributeLabel); + + } + } + } + + protected VerticalLayout getLogLayout() { + return logLayout; + } + + protected VerticalLayout getAttributesLayout() { + return attributesLayout; + } + + protected VerticalLayout getDescriptionLayout() { + return descriptionLayout; + } + + protected VerticalLayout getDetailsLayout() { + return detailsLayout; + } + + protected VerticalLayout getTagsLayout() { + return tagsLayout; + } + + protected TabSheet getDetailsTab() { + return detailsTab; + } + + protected ManagementUIState getManagementUIState() { + return managementUIState; + } + private void createComponents() { caption = createHeaderCaption(); caption.setImmediate(true); @@ -172,26 +281,6 @@ public abstract class AbstractTableDetailsLayout extends return new LabelBuilder().name(getDefaultCaption()).buildCaptionLabel(); } - protected VerticalLayout getTabLayout() { - final VerticalLayout tabLayout = SPUIComponentProvider.getDetailTabLayout(); - tabLayout.addStyleName("details-layout"); - return tabLayout; - } - - protected void setName(final String headerCaption, final String value) { - caption.setValue(HawkbitCommonUtil.getSoftwareModuleName(headerCaption, value)); - } - - protected void restoreState() { - if (onLoadIsTableRowSelected()) { - populateData(null); - editButton.setEnabled(true); - } - if (onLoadIsTableMaximized()) { - setVisible(false); - } - } - /** * If no data in table (i,e no row selected),then disable the edit button. * If row is selected ,enable edit button. @@ -210,70 +299,21 @@ public abstract class AbstractTableDetailsLayout extends populateDetailsWidget(); } - protected void populateLog() { - logLayout.removeAllComponents(); - - logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.getMessage("label.created.at"), - SPDateTimeUtil.formatCreatedAt(selectedBaseEntity))); - - logLayout.addComponent(SPUIComponentProvider.createCreatedByLabel(i18n, selectedBaseEntity)); - - if (selectedBaseEntity == null || selectedBaseEntity.getLastModifiedAt() == null) { - return; - } - - logLayout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.getMessage("label.modified.date"), - SPDateTimeUtil.formatLastModifiedAt(selectedBaseEntity))); - - logLayout.addComponent(SPUIComponentProvider.createLastModifiedByLabel(i18n, selectedBaseEntity)); - } - - protected void updateDescriptionLayout(final String descriptionLabel, final String description) { - descriptionLayout.removeAllComponents(); - final Label descLabel = SPUIComponentProvider.createNameValueLabel(descriptionLabel, - HawkbitCommonUtil.trimAndNullIfEmpty(description) == null ? "" : description); - /** - * By default text will be truncated based on layout width .so removing - * it as we need full description. - */ - descLabel.removeStyleName("label-style"); - descLabel.setId(UIComponentIdProvider.DETAILS_DESCRIPTION_LABEL_ID); - descriptionLayout.addComponent(descLabel); - } - - /* - * display Attributes details in Target details. - */ - protected void updateAttributesLayout(final Map attributes) { - if (null != attributes) { - attributesLayout.removeAllComponents(); - for (final Map.Entry entry : attributes.entrySet()) { - final Label conAttributeLabel = SPUIComponentProvider.createNameValueLabel( - entry.getKey().concat(" : "), - HawkbitCommonUtil.trimAndNullIfEmpty(entry.getValue()) == null ? "" : entry.getValue()); - conAttributeLabel.setDescription(entry.getKey().concat(" : ") + entry.getValue()); - conAttributeLabel.addStyleName("label-style"); - attributesLayout.addComponent(conAttributeLabel); - - } + private void populateDescription() { + if (selectedBaseEntity != null) { + updateDescriptionLayout(i18n.getMessage("label.description"), selectedBaseEntity.getDescription()); + } else { + updateDescriptionLayout(i18n.getMessage("label.description"), null); } } - protected VerticalLayout createLogLayout() { - return logLayout; + protected Long getSelectedBaseEntityId() { + return selectedBaseEntity == null ? null : selectedBaseEntity.getId(); } - protected VerticalLayout createAttributesLayout() { - return attributesLayout; - } + protected abstract void populateDetailsWidget(); - protected VerticalLayout createDetailsLayout() { - return detailsLayout; - } - - protected VerticalLayout createDescriptionLayout() { - return descriptionLayout; - } + protected abstract void populateMetadataDetails(); /** * Default caption of header to be displayed when no data row selected in @@ -283,13 +323,6 @@ public abstract class AbstractTableDetailsLayout extends */ protected abstract String getDefaultCaption(); - /** - * Add tabs. - * - * @param detailsTab - */ - protected abstract void addTabs(final TabSheet detailsTab); - /** * Click listener for edit button. * @@ -307,26 +340,6 @@ public abstract class AbstractTableDetailsLayout extends protected abstract boolean hasEditPermission(); - public VerticalLayout getDetailsLayout() { - return detailsLayout; - } - - private void populateDescription() { - if (selectedBaseEntity != null) { - updateDescriptionLayout(i18n.getMessage("label.description"), selectedBaseEntity.getDescription()); - } else { - updateDescriptionLayout(i18n.getMessage("label.description"), null); - } - } - - protected abstract void populateDetailsWidget(); - - protected abstract void populateMetadataDetails(); - - protected Long getSelectedBaseEntityId() { - return selectedBaseEntity == null ? null : selectedBaseEntity.getId(); - } - protected abstract String getDetailsHeaderCaptionId(); protected abstract String getName(); 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 similarity index 96% rename from hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailslayout.java rename to hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetMetadatadetailsLayout.java index ab5e2b51d..2a213c07c 100644 --- 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 @@ -1,3 +1,4 @@ + /** * Copyright (c) 2015 Bosch Software Innovations GmbH and others. * @@ -19,10 +20,10 @@ import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.VaadinMessageSource; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.data.domain.PageRequest; import com.vaadin.data.Item; @@ -37,7 +38,7 @@ import com.vaadin.ui.themes.ValoTheme; * DistributionSet Metadata details layout. * */ -public class DistributionSetMetadatadetailslayout extends Table { +public class DistributionSetMetadatadetailsLayout extends Table { private static final long serialVersionUID = 2913758299611837718L; @@ -59,8 +60,8 @@ public class DistributionSetMetadatadetailslayout extends Table { private final UINotification notification; - public DistributionSetMetadatadetailslayout(final VaadinMessageSource i18n, final SpPermissionChecker permissionChecker, - final DistributionSetManagement distributionSetManagement, + public DistributionSetMetadatadetailsLayout(final VaadinMessageSource i18n, + final SpPermissionChecker permissionChecker, final DistributionSetManagement distributionSetManagement, final DsMetadataPopupLayout dsMetadataPopupLayout, final EntityFactory entityFactory, final UINotification notification) { this.i18n = i18n; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java index d096d6ebb..b2732eafc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsTable.java @@ -144,7 +144,7 @@ public class SoftwareModuleDetailsTable extends Table { */ public void populateModule(final DistributionSet distributionSet) { removeAllItems(); - if (null != distributionSet) { + if (distributionSet != null) { if (isUnassignSoftModAllowed && permissionChecker.hasUpdateDistributionPermission()) { try { isTargetAssigned = false; @@ -157,10 +157,10 @@ public class SoftwareModuleDetailsTable extends Table { final Set swModuleMandatoryTypes = distributionSet.getType().getMandatoryModuleTypes(); final Set swModuleOptionalTypes = distributionSet.getType().getOptionalModuleTypes(); - if (null != swModuleMandatoryTypes && !swModuleMandatoryTypes.isEmpty()) { + if (swModuleMandatoryTypes != null && !swModuleMandatoryTypes.isEmpty()) { swModuleMandatoryTypes.forEach(swModule -> setSwModuleProperties(swModule, true, distributionSet)); } - if (null != swModuleOptionalTypes && !swModuleOptionalTypes.isEmpty()) { + if (swModuleOptionalTypes != null && !swModuleOptionalTypes.isEmpty()) { swModuleOptionalTypes.forEach(swModule -> setSwModuleProperties(swModule, false, distributionSet)); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractDistributionSetTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractDistributionSetTableHeader.java new file mode 100644 index 000000000..1294d0811 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractDistributionSetTableHeader.java @@ -0,0 +1,123 @@ +/** + * 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.table; + +import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState; +import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; +import org.eclipse.hawkbit.ui.management.state.ManagementUIState; +import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.vaadin.spring.events.EventBus.UIEventBus; + +import com.vaadin.event.dd.DropHandler; +import com.vaadin.ui.Button.ClickEvent; + +/** + * Abstract class which contains common method implementations for the header of + * Distribution Set Table elements + * + */ +public abstract class AbstractDistributionSetTableHeader extends AbstractTableHeader { + + private static final long serialVersionUID = 1L; + + protected AbstractDistributionSetTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, + final UIEventBus eventbus, final ManagementUIState managementUIState, + final ManageDistUIState manageDistUIstate, final ArtifactUploadState artifactUploadState) { + super(i18n, permChecker, eventbus, managementUIState, manageDistUIstate, artifactUploadState); + } + + @Override + protected String getHeaderCaption() { + return i18n.getMessage("header.dist.table"); + } + + @Override + protected String getSearchBoxId() { + return UIComponentIdProvider.DIST_SEARCH_TEXTFIELD; + } + + @Override + protected String getSearchRestIconId() { + return UIComponentIdProvider.DIST_SEARCH_ICON; + } + + @Override + protected String getAddIconId() { + return UIComponentIdProvider.DIST_ADD_ICON; + } + + @Override + protected boolean isDropHintRequired() { + return true; + } + + @Override + protected boolean hasCreatePermission() { + return permChecker.hasCreateDistributionPermission(); + } + + @Override + protected String getShowFilterButtonLayoutId() { + return UIComponentIdProvider.SHOW_DIST_TAG_ICON; + } + + @Override + protected String getMaxMinIconId() { + return UIComponentIdProvider.DS_MAX_MIN_TABLE_ICON; + } + + @Override + protected String getBulkUploadIconId() { + return null; + } + + @Override + protected Boolean isBulkUploadAllowed() { + return Boolean.FALSE; + } + + @Override + protected void bulkUpload(final ClickEvent event) { + // No implementation as no bulk upload is supported except for + // targetTable. + } + + @Override + protected boolean isBulkUploadInProgress() { + return false; + } + + @Override + protected String getDropFilterId() { + return null; + } + + @Override + protected String getFilterIconStyle() { + return null; + } + + @Override + protected String getDropFilterWrapperId() { + return null; + } + + @Override + protected DropHandler getDropFilterHandler() { + return null; + } + + @Override + protected boolean isDropFilterRequired() { + return false; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractSoftwareModuleTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractSoftwareModuleTableHeader.java new file mode 100644 index 000000000..2da67f10b --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractSoftwareModuleTableHeader.java @@ -0,0 +1,143 @@ +/** + * 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.table; + +import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; +import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState; +import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; +import org.eclipse.hawkbit.ui.management.state.ManagementUIState; +import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.vaadin.spring.events.EventBus.UIEventBus; + +import com.vaadin.event.dd.DropHandler; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.UI; +import com.vaadin.ui.Window; + +/** + * Abstract class which contains common method implementations for the header of + * Software Module Table elements + * + */ +public abstract class AbstractSoftwareModuleTableHeader extends AbstractTableHeader { + + private static final long serialVersionUID = 1L; + + private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; + + protected AbstractSoftwareModuleTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, + final UIEventBus eventbus, final ManagementUIState managementUIState, + final ManageDistUIState manageDistUIstate, final ArtifactUploadState artifactUploadState, + final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow) { + super(i18n, permChecker, eventbus, managementUIState, manageDistUIstate, artifactUploadState); + this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + } + + @Override + protected String getHeaderCaption() { + return i18n.getMessage("upload.swModuleTable.header"); + } + + @Override + protected String getSearchBoxId() { + return UIComponentIdProvider.SW_MODULE_SEARCH_TEXT_FIELD; + } + + @Override + protected String getSearchRestIconId() { + return UIComponentIdProvider.SW_MODULE_SEARCH_RESET_ICON; + } + + @Override + protected String getAddIconId() { + return UIComponentIdProvider.SW_MODULE_ADD_BUTTON; + } + + @Override + protected String getShowFilterButtonLayoutId() { + return "show.type.icon"; + } + + @Override + protected String getMaxMinIconId() { + return UIComponentIdProvider.SW_MAX_MIN_TABLE_ICON; + } + + @Override + protected Boolean isAddNewItemAllowed() { + return Boolean.TRUE; + } + + @Override + protected void addNewItem(final ClickEvent event) { + final Window addSoftwareModule = softwareModuleAddUpdateWindow.createAddSoftwareModuleWindow(); + addSoftwareModule.setCaption(i18n.getMessage("upload.caption.add.new.swmodule")); + UI.getCurrent().addWindow(addSoftwareModule); + addSoftwareModule.setVisible(Boolean.TRUE); + } + + @Override + protected boolean hasCreatePermission() { + return permChecker.hasCreateDistributionPermission(); + } + + @Override + protected String getBulkUploadIconId() { + return null; + } + + @Override + protected Boolean isBulkUploadAllowed() { + return Boolean.FALSE; + } + + @Override + protected void bulkUpload(final ClickEvent event) { + // No implementation as no bulk upload is supported except for + // targetTable. + } + + @Override + protected boolean isBulkUploadInProgress() { + return false; + } + + @Override + protected String getDropFilterId() { + return null; + } + + @Override + protected String getFilterIconStyle() { + return null; + } + + @Override + protected String getDropFilterWrapperId() { + return null; + } + + @Override + protected DropHandler getDropFilterHandler() { + return null; + } + + @Override + protected boolean isDropFilterRequired() { + return false; + } + + @Override + protected boolean isDropHintRequired() { + return false; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractTableHeader.java index 5751cfb32..b4d9a8cee 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/table/AbstractTableHeader.java @@ -28,6 +28,7 @@ import com.vaadin.event.dd.DropHandler; import com.vaadin.server.FontAwesome; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.DragAndDropWrapper; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; @@ -360,6 +361,84 @@ public abstract class AbstractTableHeader extends VerticalLayout { searchResetIcon.setEnabled(true); } + /** + * Get the Id value of the drop filter in the table header. + * + * @return Id of the drop filter if filter is displayed, otherwise returns + * null. + */ + protected abstract String getDropFilterId(); + + /** + * Get style of the filter Icon. + * + * @return style of the filter Icon + */ + protected abstract String getFilterIconStyle(); + + /** + * Get the Id value of the drop filter wrapper in the table header. + * + * @return Id of the drop filter if filter is displayed, otherwise returns + * null. + */ + protected abstract String getDropFilterWrapperId(); + + protected abstract DropHandler getDropFilterHandler(); + + /** + * Check if drop hits required to display and user has permissions for that. + * + * @return true if drop hits should be displayed and user has permission, + * otherwise false. + */ + protected abstract boolean isDropHintRequired(); + + /** + * Check if drop filter is required. + * + * @return true if drop filter is required to display, otherwise return + * false. + */ + protected abstract boolean isDropFilterRequired(); + + /** + * Checks if the creation of a new item is allowed. Default is true. + * + * @return true if the creation of a new item is allowed, otherwise returns + * false. + */ + protected abstract Boolean isAddNewItemAllowed(); + + /** + * Get Id of bulk upload Icon. + * + * @return String of bulk upload Icon. + */ + protected abstract String getBulkUploadIconId(); + + /** + * Gets the flag if bulk upload is allowed. Default is false + * + * @return true if bulk upload is allowed, otherwise returns false. + */ + protected abstract Boolean isBulkUploadAllowed(); + + /** + * Checks if bulk upload is in progress. Default is false. + * + * @return true if bulk upload is in progress, otherwise returns false. + */ + protected abstract boolean isBulkUploadInProgress(); + + /** + * Performs the bulk upload + * + * @param event + * Event of type ClickEvent + */ + protected abstract void bulkUpload(final ClickEvent event); + /** * Get the title of the table. * @@ -388,13 +467,6 @@ public abstract class AbstractTableHeader extends VerticalLayout { */ protected abstract String getAddIconId(); - /** - * Get Id of bulk upload Icon. - * - * @return String of bulk upload Icon. - */ - protected abstract String getBulkUploadIconId(); - /** * Get search box on load text value. * @@ -402,29 +474,6 @@ public abstract class AbstractTableHeader extends VerticalLayout { */ protected abstract String onLoadSearchBoxValue(); - /** - * Get the Id value of the drop filter in the table header. - * - * @return Id of the drop filter if filter is displayed, otherwise returns - * null. - */ - protected abstract String getDropFilterId(); - - /** - * Get style of the filter Icon. - * - * @return style of the filter Icon - */ - protected abstract String getFilterIconStyle(); - - /** - * Get the Id value of the drop filter wrapper in the table header. - * - * @return Id of the drop filter if filter is displayed, otherwise returns - * null. - */ - protected abstract String getDropFilterWrapperId(); - /** * Check if logged in user has create permission.. * @@ -432,22 +481,6 @@ public abstract class AbstractTableHeader extends VerticalLayout { */ protected abstract boolean hasCreatePermission(); - /** - * Check if drop hits required to display and user has permissions for that. - * - * @return true if drop hits should be displayed and user has permission, - * otherwise false. - */ - protected abstract boolean isDropHintRequired(); - - /** - * Check if drop filter is required. - * - * @return true if drop filter is required to display, otherwise return - * false. - */ - protected abstract boolean isDropFilterRequired(); - /** * Get Id of the show filter buttons layout. * @@ -491,8 +524,6 @@ public abstract class AbstractTableHeader extends VerticalLayout { */ public abstract Boolean onLoadIsTableMaximized(); - protected abstract DropHandler getDropFilterHandler(); - /** * On load show filter button is displayed. * @@ -500,16 +531,8 @@ public abstract class AbstractTableHeader extends VerticalLayout { */ public abstract Boolean onLoadIsShowFilterButtonDisplayed(); - protected abstract boolean isBulkUploadInProgress(); - protected abstract void searchBy(String newSearchText); protected abstract void addNewItem(final Button.ClickEvent event); - protected abstract void bulkUpload(final Button.ClickEvent event); - - protected abstract Boolean isAddNewItemAllowed(); - - protected abstract Boolean isBulkUploadAllowed(); - } 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 cd689465c..1bd875a6b 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 @@ -18,28 +18,23 @@ import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.TagManagement; import org.eclipse.hawkbit.repository.TargetManagement; -import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType; -import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout; -import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetMetadatadetailslayout; +import org.eclipse.hawkbit.ui.common.detailslayout.AbstractDistributionSetDetails; import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsTable; import org.eclipse.hawkbit.ui.common.detailslayout.TargetFilterQueryDetailsTable; import org.eclipse.hawkbit.ui.common.entity.SoftwareModuleIdName; -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.SaveActionWindowEvent; import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; import org.eclipse.hawkbit.ui.management.dstable.DistributionAddUpdateWindowLayout; -import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; import org.eclipse.hawkbit.ui.management.state.ManagementUIState; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; @@ -47,91 +42,75 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod; import com.vaadin.data.Item; import com.vaadin.server.FontAwesome; import com.vaadin.ui.Button; -import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.TabSheet; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; /** * Distribution set details layout. */ -public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDetailsLayout { +public class DistributionSetDetails extends AbstractDistributionSetDetails { - private static final long serialVersionUID = -4595004466943546669L; + private static final long serialVersionUID = 1L; private static final String SOFT_MODULE = "softwareModule"; private final ManageDistUIState manageDistUIState; - private final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout; - - private final DistributionTagToken distributionTagToken; - private final transient SoftwareManagement softwareManagement; - private final transient DistributionSetManagement distributionSetManagement; - private final transient TargetManagement targetManagement; - private final DsMetadataPopupLayout dsMetadataPopupLayout; - - private final SoftwareModuleDetailsTable softwareModuleTable; - - private final DistributionSetMetadatadetailslayout dsMetadataTable; - private final TargetFilterQueryDetailsTable tfqDetailsTable; - private VerticalLayout tagsLayout; - private Map assignedSWModule; - DistributionSetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, - final ManageDistUIState manageDistUIState, final ManagementUIState managementUIState, + DistributionSetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final ManageDistUIState manageDistUIState, + final ManagementUIState managementUIState, final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout, final SoftwareManagement softwareManagement, final DistributionSetManagement distributionSetManagement, final TargetManagement targetManagement, final EntityFactory entityFactory, - final UINotification uinotification, final TagManagement tagManagement, - final DsMetadataPopupLayout popupLayout, final UINotification uiNotification) { - super(i18n, eventBus, permissionChecker, managementUIState); + final UINotification uiNotification, final TagManagement tagManagement, + final DsMetadataPopupLayout dsMetadataPopupLayout) { + super(i18n, eventBus, permissionChecker, managementUIState, distributionAddUpdateWindowLayout, + distributionSetManagement, dsMetadataPopupLayout, entityFactory, uiNotification, tagManagement, + createSoftwareModuleDetailsTable(i18n, permissionChecker, distributionSetManagement, eventBus, + manageDistUIState, uiNotification)); this.manageDistUIState = manageDistUIState; - this.distributionAddUpdateWindowLayout = distributionAddUpdateWindowLayout; - this.distributionTagToken = new DistributionTagToken(permissionChecker, i18n, uinotification, eventBus, - managementUIState, tagManagement, distributionSetManagement); this.softwareManagement = softwareManagement; - this.distributionSetManagement = distributionSetManagement; this.targetManagement = targetManagement; - this.dsMetadataPopupLayout = popupLayout; - - softwareModuleTable = new SoftwareModuleDetailsTable(i18n, true, permissionChecker, distributionSetManagement, - eventBus, manageDistUIState, uiNotification); - - dsMetadataTable = new DistributionSetMetadatadetailslayout(i18n, permissionChecker, distributionSetManagement, - dsMetadataPopupLayout, entityFactory, uiNotification); tfqDetailsTable = new TargetFilterQueryDetailsTable(i18n); - addTabs(detailsTab); + + addAdditionalTab(); restoreState(); } - protected VerticalLayout createTagsLayout() { - tagsLayout = getTabLayout(); - return tagsLayout; + private void addAdditionalTab() { + getDetailsTab().addTab(tfqDetailsTable, getI18n().getMessage("caption.auto.assignment.ds"), null); + } + + private static final SoftwareModuleDetailsTable createSoftwareModuleDetailsTable(final VaadinMessageSource i18n, + final SpPermissionChecker permissionChecker, final DistributionSetManagement distributionSetManagement, + final UIEventBus eventBus, final ManageDistUIState manageDistUIState, final UINotification uiNotification) { + return new SoftwareModuleDetailsTable(i18n, true, permissionChecker, distributionSetManagement, eventBus, + manageDistUIState, uiNotification); } @Override protected void populateDetailsWidget() { populateDetails(); populateModule(); - populateTags(); + populateTags(getDistributionTagToken()); populateMetadataDetails(); populateTargetFilterQueries(); } - private void populateModule() { - softwareModuleTable.populateModule(getSelectedBaseEntity()); + @Override + protected void populateModule() { + super.populateModule(); showUnsavedAssignment(); } @@ -143,7 +122,7 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet .map(Map.Entry::getValue).orElse(null)) .orElse(null); - if (null != softwareModuleIdNameList) { + if (softwareModuleIdNameList != null) { if (assignedSWModule == null) { assignedSWModule = new HashMap<>(); } @@ -168,9 +147,8 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet } })); - for (final Map.Entry entry : assignedSWModule.entrySet()) { - final Item item = softwareModuleTable.getContainerDataSource().getItem(entry.getKey()); + final Item item = getSoftwareModuleTable().getContainerDataSource().getItem(entry.getKey()); if (item != null) { item.getItemProperty(SOFT_MODULE).setValue(createSoftModuleLayout(entry.getValue().toString())); } @@ -190,24 +168,27 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return null; } + private static String getUnsavedAssigedSwModule(final String name, final String version) { + return HawkbitCommonUtil.getFormattedNameVersion(name, version); + } + @SuppressWarnings("unchecked") private void updateSoftwareModule(final SoftwareModule module) { if (assignedSWModule == null) { assignedSWModule = new HashMap<>(); } - softwareModuleTable.getContainerDataSource().getItemIds(); + getSoftwareModuleTable().getContainerDataSource().getItemIds(); if (assignedSWModule.containsKey(module.getType().getName())) { /* * If software module type is software, means multiple softwares can - * assigned to that type. Hence if multiple softwares belongs to - * same type is dropped, then add to the list. + * assigned to that type. Hence if multipe softwares belongs to same + * type is drroped, then add to the list. */ if (module.getType().getMaxAssignments() > 1) { assignedSWModule.get(module.getType().getName()).append("
").append("") - .append(HawkbitCommonUtil.getFormattedNameVersion(module.getName(), module.getVersion())) - .append(""); + .append(getUnsavedAssigedSwModule(module.getName(), module.getVersion())).append(""); } /* @@ -216,21 +197,17 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet * same type is dropped, then override with previous one. */ if (module.getType().getMaxAssignments() == 1) { - assignedSWModule.put(module.getType().getName(), - new StringBuilder().append("").append( - HawkbitCommonUtil.getFormattedNameVersion(module.getName(), module.getVersion())) - .append("")); + assignedSWModule.put(module.getType().getName(), new StringBuilder().append("") + .append(getUnsavedAssigedSwModule(module.getName(), module.getVersion())).append("")); } } else { - assignedSWModule.put(module.getType().getName(), - new StringBuilder().append("") - .append(HawkbitCommonUtil.getFormattedNameVersion(module.getName(), module.getVersion())) - .append("")); + assignedSWModule.put(module.getType().getName(), new StringBuilder().append("") + .append(getUnsavedAssigedSwModule(module.getName(), module.getVersion())).append("")); } for (final Map.Entry entry : assignedSWModule.entrySet()) { - final Item item = softwareModuleTable.getContainerDataSource().getItem(entry.getKey()); + final Item item = getSoftwareModuleTable().getContainerDataSource().getItem(entry.getKey()); if (item != null) { item.getItemProperty(SOFT_MODULE).setValue(createSoftModuleLayout(entry.getValue().toString())); } @@ -253,70 +230,10 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return verticalLayout; } - private VerticalLayout createSoftwareModuleTab() { - final VerticalLayout softwareLayout = getTabLayout(); - softwareLayout.setSizeFull(); - softwareLayout.addComponent(softwareModuleTable); - return softwareLayout; - } - - private void populateTags() { - tagsLayout.removeAllComponents(); - if (getSelectedBaseEntity() == null) { - return; - } - tagsLayout.addComponent(distributionTagToken.getTokenField()); - } - - private void populateDetails() { - if (getSelectedBaseEntity() != null) { - updateDistributionSetDetailsLayout(getSelectedBaseEntity().getType().getName(), - getSelectedBaseEntity().isRequiredMigrationStep()); - } else { - updateDistributionSetDetailsLayout(null, null); - } - } - - @Override - protected void populateMetadataDetails() { - dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); - } - protected void populateTargetFilterQueries() { tfqDetailsTable.populateTableByDistributionSet(getSelectedBaseEntity()); } - private void updateDistributionSetDetailsLayout(final String type, final Boolean isMigrationRequired) { - final VerticalLayout detailsTabLayout = getDetailsLayout(); - detailsTabLayout.removeAllComponents(); - - if (type != null) { - final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.type"), - type); - typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); - detailsTabLayout.addComponent(typeLabel); - } - - if (isMigrationRequired != null) { - detailsTabLayout.addComponent(SPUIComponentProvider.createNameValueLabel( - getI18n().getMessage("checkbox.dist.migration.required"), - isMigrationRequired.equals(Boolean.TRUE) ? getI18n().getMessage("label.yes") : getI18n().getMessage("label.no"))); - } - } - - @Override - protected void onEdit(final ClickEvent event) { - final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(getSelectedBaseEntityId()); - newDistWindow.setCaption(getI18n().getMessage(UIComponentIdProvider.DIST_UPDATE_CAPTION)); - UI.getCurrent().addWindow(newDistWindow); - newDistWindow.setVisible(Boolean.TRUE); - } - - @Override - protected String getEditButtonId() { - return UIComponentIdProvider.DS_EDIT_BUTTON; - } - @Override protected boolean onLoadIsTableRowSelected() { return manageDistUIState.getSelectedDistributions().map(selected -> !selected.isEmpty()).orElse(false); @@ -327,27 +244,6 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet return manageDistUIState.isDsTableMaximized(); } - @Override - protected String getDefaultCaption() { - return getI18n().getMessage("distribution.details.header"); - } - - @Override - protected void addTabs(final TabSheet detailsTab) { - detailsTab.addTab(createDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); - detailsTab.addTab(createDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); - detailsTab.addTab(createSoftwareModuleTab(), getI18n().getMessage("caption.softwares.distdetail.tab"), null); - detailsTab.addTab(createTagsLayout(), getI18n().getMessage("caption.tags.tab"), null); - detailsTab.addTab(createLogLayout(), getI18n().getMessage("caption.logs.tab"), null); - detailsTab.addTab(dsMetadataTable, getI18n().getMessage("caption.metadata"), null); - detailsTab.addTab(tfqDetailsTable, getI18n().getMessage("caption.auto.assignment.ds"), null); - } - - @Override - protected boolean hasEditPermission() { - return getPermissionChecker().hasUpdateDistributionPermission(); - } - @EventBusListenerMethod(scope = EventScope.UI) void onEvent(final SoftwareModuleEvent event) { if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.ASSIGN_SOFTWARE_MODULE) { @@ -355,11 +251,6 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet } } - @EventBusListenerMethod(scope = EventScope.UI) - void onEvent(final DistributionTableEvent distributionTableEvent) { - onBaseEntityEvent(distributionTableEvent); - } - @EventBusListenerMethod(scope = EventScope.UI) void onEvent(final SaveActionWindowEvent saveActionWindowEvent) { if ((saveActionWindowEvent == SaveActionWindowEvent.SAVED_ASSIGNMENTS @@ -369,10 +260,11 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet assignedSWModule.clear(); } - distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()).ifPresent(set -> { - setSelectedBaseEntity(set); - UI.getCurrent().access(this::populateModule); - }); + getDistributionSetManagement().findDistributionSetByIdWithDetails(getSelectedBaseEntityId()) + .ifPresent(set -> { + setSelectedBaseEntity(set); + UI.getCurrent().access(this::populateModule); + }); } } @@ -388,24 +280,4 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet } } - @Override - protected String getTabSheetId() { - return UIComponentIdProvider.DISTRIBUTIONSET_DETAILS_TABSHEET_ID; - } - - @Override - protected String getDetailsHeaderCaptionId() { - return UIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; - } - - @Override - protected boolean isMetadataIconToBeDisplayed() { - return true; - } - - @Override - protected void showMetadata(final ClickEvent event) { - distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()) - .ifPresent(ds -> UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds, null))); - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java index 4fa4ed83c..6e7fb64ab 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableHeader.java @@ -9,7 +9,7 @@ package org.eclipse.hawkbit.ui.distributions.dstable; import org.eclipse.hawkbit.ui.SpPermissionChecker; -import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader; +import org.eclipse.hawkbit.ui.common.table.AbstractDistributionSetTableHeader; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent; import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; @@ -22,7 +22,6 @@ import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.event.dd.DropHandler; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.UI; import com.vaadin.ui.Window; @@ -30,9 +29,9 @@ import com.vaadin.ui.Window; /** * Distribution table header. */ -public class DistributionSetTableHeader extends AbstractTableHeader { +public class DistributionSetTableHeader extends AbstractDistributionSetTableHeader { - private static final long serialVersionUID = -3483238438474530748L; + private static final long serialVersionUID = 1L; private final DistributionAddUpdateWindowLayout addUpdateWindowLayout; @@ -49,56 +48,11 @@ public class DistributionSetTableHeader extends AbstractTableHeader { } } - @Override - protected String getHeaderCaption() { - return i18n.getMessage("header.dist.table"); - } - - @Override - protected String getSearchBoxId() { - return UIComponentIdProvider.DIST_SEARCH_TEXTFIELD; - } - - @Override - protected String getSearchRestIconId() { - return UIComponentIdProvider.DIST_SEARCH_ICON; - } - - @Override - protected String getAddIconId() { - return UIComponentIdProvider.DIST_ADD_ICON; - } - @Override protected String onLoadSearchBoxValue() { return manageDistUIstate.getManageDistFilters().getSearchText().orElse(null); } - @Override - protected String getDropFilterId() { - return null; - } - - @Override - protected boolean hasCreatePermission() { - return permChecker.hasCreateDistributionPermission(); - } - - @Override - protected boolean isDropHintRequired() { - return true; - } - - @Override - protected boolean isDropFilterRequired() { - return false; - } - - @Override - protected String getShowFilterButtonLayoutId() { - return UIComponentIdProvider.SHOW_DIST_TAG_ICON; - } - @Override protected void showFilterButtonsLayout() { manageDistUIstate.setDistTypeFilterClosed(false); @@ -113,11 +67,6 @@ public class DistributionSetTableHeader extends AbstractTableHeader { } } - @Override - protected String getMaxMinIconId() { - return UIComponentIdProvider.DS_MAX_MIN_TABLE_ICON; - } - @Override public void maximizeTable() { manageDistUIstate.setDsTableMaximized(Boolean.TRUE); @@ -159,38 +108,4 @@ public class DistributionSetTableHeader extends AbstractTableHeader { return Boolean.TRUE; } - @Override - protected String getFilterIconStyle() { - return null; - } - - @Override - protected String getDropFilterWrapperId() { - return null; - } - - @Override - protected DropHandler getDropFilterHandler() { - return null; - } - - @Override - protected String getBulkUploadIconId() { - return null; - } - - @Override - protected void bulkUpload(final ClickEvent event) { - // No implementation as no bulk upload is supported. - } - - @Override - protected Boolean isBulkUploadAllowed() { - return Boolean.FALSE; - } - - @Override - protected boolean isBulkUploadInProgress() { - return false; - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableLayout.java index 16dfb43ab..32e38ee62 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTableLayout.java @@ -55,7 +55,7 @@ public class DistributionSetTableLayout extends AbstractTableLayout { +public class SwModuleDetails extends AbstractSoftwareModuleDetails { - private static final long serialVersionUID = -1052279281066089812L; - - private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; + private static final long serialVersionUID = 1L; private final ManageDistUIState manageDistUIState; - private final transient SoftwareManagement softwareManagement; - - private final SwMetadataPopupLayout swMetadataPopupLayout; - - private final SoftwareModuleMetadatadetailslayout swmMetadataTable; - - SwModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, + SwModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow, final ManageDistUIState manageDistUIState, final SoftwareManagement softwareManagement, final SwMetadataPopupLayout swMetadataPopupLayout, final EntityFactory entityFactory) { - super(i18n, eventBus, permissionChecker, null); - this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + super(i18n, eventBus, permissionChecker, null, softwareManagement, swMetadataPopupLayout, entityFactory, + softwareModuleAddUpdateWindow); this.manageDistUIState = manageDistUIState; - this.softwareManagement = softwareManagement; - this.swMetadataPopupLayout = swMetadataPopupLayout; - - swmMetadataTable = new SoftwareModuleMetadatadetailslayout(); - swmMetadataTable.init(getI18n(), getPermissionChecker(), softwareManagement, swMetadataPopupLayout, - entityFactory); - addTabs(detailsTab); restoreState(); } - /** - * MetadataEvent. - * - * @param event - * as instance of {@link MetadataEvent} - */ - - @EventBusListenerMethod(scope = EventScope.UI) - void onEvent(final MetadataEvent event) { - UI.getCurrent().access(() -> { - final MetaData softwareModuleMetadata = event.getMetaData(); - if (softwareModuleMetadata != null && isSoftwareModuleSelected(event.getModule())) { - if (event.getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA) { - swmMetadataTable.createMetadata(event.getMetaData().getKey()); - } else if (event - .getMetadataUIEvent() == MetadataEvent.MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA) { - swmMetadataTable.deleteMetadata(event.getMetaData().getKey()); - } - } - }); - } - - @EventBusListenerMethod(scope = EventScope.UI) - void onEvent(final SoftwareModuleEvent softwareModuleEvent) { - onBaseEntityEvent(softwareModuleEvent); - } - - @Override - protected void onEdit(final ClickEvent event) { - final Window addSoftwareModule = softwareModuleAddUpdateWindow - .createUpdateSoftwareModuleWindow(getSelectedBaseEntityId()); - addSoftwareModule.setCaption(getI18n().getMessage("upload.caption.update.swmodule")); - UI.getCurrent().addWindow(addSoftwareModule); - addSoftwareModule.setVisible(Boolean.TRUE); - } - - @Override - protected String getEditButtonId() { - return UIComponentIdProvider.UPLOAD_SW_MODULE_EDIT_BUTTON; - } - - @Override - protected void addTabs(final TabSheet detailsTab) { - detailsTab.addTab(createDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); - detailsTab.addTab(createDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); - detailsTab.addTab(createLogLayout(), getI18n().getMessage("caption.logs.tab"), null); - detailsTab.addTab(swmMetadataTable, getI18n().getMessage("caption.metadata"), null); - } - - @Override - protected String getDefaultCaption() { - return getI18n().getMessage("upload.swModuleTable.header"); - } - @Override protected boolean onLoadIsTableRowSelected() { return !manageDistUIState.getSelectedSoftwareModules().isEmpty(); @@ -134,88 +50,14 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay return manageDistUIState.isSwModuleTableMaximized(); } - @Override - protected boolean hasEditPermission() { - return getPermissionChecker().hasUpdateDistributionPermission(); - } - @Override protected String getTabSheetId() { return UIComponentIdProvider.DIST_SW_MODULE_DETAILS_TABSHEET_ID; } - private void populateDetails() { - if (getSelectedBaseEntity() != null) { - String maxAssign; - if (getSelectedBaseEntity().getType().getMaxAssignments() == 1) { - maxAssign = getI18n().getMessage("label.singleAssign.type"); - } else { - maxAssign = getI18n().getMessage("label.multiAssign.type"); - } - updateSwModuleDetailsLayout(getSelectedBaseEntity().getType().getName(), - getSelectedBaseEntity().getVendor(), maxAssign); - } else { - updateSwModuleDetailsLayout(StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY); - } - } - - private void updateSwModuleDetailsLayout(final String type, final String vendor, final String maxAssign) { - - final VerticalLayout detailsTabLayout = getDetailsLayout(); - detailsTabLayout.removeAllComponents(); - - final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.vendor"), - HawkbitCommonUtil.trimAndNullIfEmpty(vendor) == null ? "" : vendor); - vendorLabel.setId(UIComponentIdProvider.DETAILS_VENDOR_LABEL_ID); - detailsTabLayout.addComponent(vendorLabel); - - if (type != null) { - final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.type"), - type); - typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); - detailsTabLayout.addComponent(typeLabel); - } - - final Label assignLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.assigned.type"), - HawkbitCommonUtil.trimAndNullIfEmpty(maxAssign) == null ? "" : maxAssign); - assignLabel.setId(UIComponentIdProvider.SWM_DTLS_MAX_ASSIGN); - detailsTabLayout.addComponent(assignLabel); - - } - @Override - protected void populateDetailsWidget() { - populateDetails(); - populateMetadataDetails(); + protected boolean isSoftwareModuleSelected(final SoftwareModule softwareModule) { + return compareSoftwareModulesById(softwareModule, manageDistUIState.getSelectedBaseSwModuleId().orElse(null)); } - @Override - protected String getDetailsHeaderCaptionId() { - return UIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID; - } - - @Override - protected void populateMetadataDetails() { - swmMetadataTable.populateSMMetadata(getSelectedBaseEntity()); - } - - private boolean isSoftwareModuleSelected(final SoftwareModule softwareModule) { - if (softwareModule == null) { - return false; - } - - return manageDistUIState.getSelectedBaseSwModuleId().map(module -> module.equals(softwareModule.getId())) - .orElse(false); - } - - @Override - protected boolean isMetadataIconToBeDisplayed() { - return true; - } - - @Override - protected void showMetadata(final ClickEvent event) { - softwareManagement.findSoftwareModuleById(getSelectedBaseEntityId()) - .ifPresent(swmodule -> UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null))); - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTableHeader.java index ccf001531..1e101cc06 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleTableHeader.java @@ -12,36 +12,27 @@ import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent; import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; -import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader; +import org.eclipse.hawkbit.ui.common.table.AbstractSoftwareModuleTableHeader; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent; import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.event.dd.DropHandler; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.UI; -import com.vaadin.ui.Window; - /** * Implementation of software module Header block using generic abstract details * style . */ -public class SwModuleTableHeader extends AbstractTableHeader { +public class SwModuleTableHeader extends AbstractSoftwareModuleTableHeader { - private static final long serialVersionUID = 242961845006626297L; + private static final long serialVersionUID = 1L; - private final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow; - - SwModuleTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, final UIEventBus eventbus, - final ManageDistUIState manageDistUIstate, + SwModuleTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, + final UIEventBus eventbus, final ManageDistUIState manageDistUIstate, final SoftwareModuleAddUpdateWindow softwareModuleAddUpdateWindow) { - super(i18n, permChecker, eventbus, null, manageDistUIstate, null); - this.softwareModuleAddUpdateWindow = softwareModuleAddUpdateWindow; + super(i18n, permChecker, eventbus, null, manageDistUIstate, null, softwareModuleAddUpdateWindow); } @EventBusListenerMethod(scope = EventScope.UI) @@ -51,53 +42,11 @@ public class SwModuleTableHeader extends AbstractTableHeader { } } - @Override - protected String getHeaderCaption() { - return i18n.getMessage("upload.swModuleTable.header"); - } - - @Override - protected String getSearchBoxId() { - return UIComponentIdProvider.SW_MODULE_SEARCH_TEXT_FIELD; - } - - @Override - protected String getSearchRestIconId() { - return UIComponentIdProvider.SW_MODULE_SEARCH_RESET_ICON; - } - - @Override - protected String getAddIconId() { - return UIComponentIdProvider.SW_MODULE_ADD_BUTTON; - } - @Override protected String onLoadSearchBoxValue() { return manageDistUIstate.getSoftwareModuleFilters().getSearchText().orElse(null); } - @Override - protected String getDropFilterId() { - /* not required */ - return null; - } - - @Override - protected boolean isDropHintRequired() { - return false; - } - - @Override - protected boolean isDropFilterRequired() { - /* Not Yet Implemented */ - return false; - } - - @Override - protected String getShowFilterButtonLayoutId() { - return "show.type.icon"; - } - @Override protected void showFilterButtonsLayout() { manageDistUIstate.setSwTypeFilterClosed(false); @@ -112,11 +61,6 @@ public class SwModuleTableHeader extends AbstractTableHeader { } } - @Override - protected String getMaxMinIconId() { - return UIComponentIdProvider.SW_MAX_MIN_TABLE_ICON; - } - @Override public void maximizeTable() { manageDistUIstate.setSwModuleTableMaximized(Boolean.TRUE); @@ -146,56 +90,4 @@ public class SwModuleTableHeader extends AbstractTableHeader { eventbus.publish(this, SMFilterEvent.FILTER_BY_TEXT); } - @Override - protected void addNewItem(final ClickEvent event) { - final Window addSoftwareModule = softwareModuleAddUpdateWindow.createAddSoftwareModuleWindow(); - addSoftwareModule.setCaption(i18n.getMessage("upload.caption.add.new.swmodule")); - UI.getCurrent().addWindow(addSoftwareModule); - addSoftwareModule.setVisible(Boolean.TRUE); - } - - @Override - protected boolean hasCreatePermission() { - return permChecker.hasCreateDistributionPermission(); - } - - @Override - protected Boolean isAddNewItemAllowed() { - return true; - } - - @Override - protected String getFilterIconStyle() { - return null; - } - - @Override - protected String getDropFilterWrapperId() { - return null; - } - - @Override - protected DropHandler getDropFilterHandler() { - return null; - } - - @Override - protected String getBulkUploadIconId() { - return null; - } - - @Override - protected void bulkUpload(final ClickEvent event) { - // No implementation as no bulk upload is supported. - } - - @Override - protected Boolean isBulkUploadAllowed() { - return Boolean.FALSE; - } - - @Override - protected boolean isBulkUploadInProgress() { - return false; - } } 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 8fdb5b7cd..33f8492f6 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 @@ -8,202 +8,60 @@ */ package org.eclipse.hawkbit.ui.management.dstable; -import java.util.Optional; import java.util.Set; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TagManagement; -import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.ui.SpPermissionChecker; -import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout; -import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetMetadatadetailslayout; +import org.eclipse.hawkbit.ui.common.detailslayout.AbstractDistributionSetDetails; 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.distributions.dstable.DsMetadataPopupLayout; -import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; import org.eclipse.hawkbit.ui.management.state.ManagementUIState; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.vaadin.spring.events.EventBus.UIEventBus; -import org.vaadin.spring.events.EventScope; -import org.vaadin.spring.events.annotation.EventBusListenerMethod; - -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Label; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.UI; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; /** * Distribution set details layout. */ -public class DistributionDetails extends AbstractNamedVersionedEntityTableDetailsLayout { +public class DistributionDetails extends AbstractDistributionSetDetails { - private static final long serialVersionUID = 350360207334118826L; + private static final long serialVersionUID = 1L; - private final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout; - private final DistributionTagToken distributionTagToken; - private final transient DistributionSetManagement distributionSetManagement; - private final DsMetadataPopupLayout dsMetadataPopupLayout; - - private final SoftwareModuleDetailsTable softwareModuleTable; - - private final DistributionSetMetadatadetailslayout dsMetadataTable; - - private final UINotification notificationMessage; - - DistributionDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, - final ManagementUIState managementUIState, final DistributionSetManagement distributionSetManagement, + DistributionDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final ManagementUIState managementUIState, + final DistributionSetManagement distributionSetManagement, final DsMetadataPopupLayout dsMetadataPopupLayout, final EntityFactory entityFactory, - final UINotification notificationMessage, final TagManagement tagManagement, + final UINotification uiNotification, final TagManagement tagManagement, final DistributionAddUpdateWindowLayout distributionAddUpdateWindowLayout) { - super(i18n, eventBus, permissionChecker, managementUIState); - - this.distributionTagToken = new DistributionTagToken(permissionChecker, i18n, notificationMessage, eventBus, - managementUIState, tagManagement, distributionSetManagement); - this.distributionSetManagement = distributionSetManagement; - this.dsMetadataPopupLayout = new DsMetadataPopupLayout(i18n, notificationMessage, eventBus, - distributionSetManagement, entityFactory, permissionChecker); - this.distributionAddUpdateWindowLayout = distributionAddUpdateWindowLayout; - this.notificationMessage = notificationMessage; - - softwareModuleTable = new SoftwareModuleDetailsTable(i18n, false, permissionChecker, null, null, null, - notificationMessage); - - dsMetadataTable = new DistributionSetMetadatadetailslayout(i18n, permissionChecker, distributionSetManagement, - dsMetadataPopupLayout, entityFactory, notificationMessage); - addTabs(detailsTab); + super(i18n, eventBus, permissionChecker, managementUIState, distributionAddUpdateWindowLayout, + distributionSetManagement, dsMetadataPopupLayout, entityFactory, uiNotification, tagManagement, + createSoftwareModuleDetailsTable(i18n, permissionChecker, uiNotification)); restoreState(); } - @EventBusListenerMethod(scope = EventScope.UI) - private void onEvent(final DistributionTableEvent distributionTableEvent) { - onBaseEntityEvent(distributionTableEvent); - } - - @Override - protected String getDefaultCaption() { - return getI18n().getMessage("distribution.details.header"); - } - - @Override - protected void addTabs(final TabSheet detailsTab) { - detailsTab.addTab(createDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); - detailsTab.addTab(createDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); - detailsTab.addTab(createSoftwareModuleTab(), getI18n().getMessage("caption.softwares.distdetail.tab"), null); - detailsTab.addTab(createTagsLayout(), getI18n().getMessage("caption.tags.tab"), null); - detailsTab.addTab(createLogLayout(), getI18n().getMessage("caption.logs.tab"), null); - detailsTab.addTab(dsMetadataTable, getI18n().getMessage("caption.metadata"), null); - } - - @Override - protected void onEdit(final ClickEvent event) { - final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow(getSelectedBaseEntityId()); - newDistWindow.setCaption(getI18n().getMessage(UIComponentIdProvider.DIST_UPDATE_CAPTION)); - UI.getCurrent().addWindow(newDistWindow); - newDistWindow.setVisible(Boolean.TRUE); - } - - @Override - protected String getEditButtonId() { - return UIComponentIdProvider.DS_EDIT_BUTTON; + private static final SoftwareModuleDetailsTable createSoftwareModuleDetailsTable(final VaadinMessageSource i18n, + final SpPermissionChecker permissionChecker, final UINotification uiNotification) { + return new SoftwareModuleDetailsTable(i18n, false, permissionChecker, null, null, null, uiNotification); } @Override protected boolean onLoadIsTableRowSelected() { - return managementUIState.getSelectedDsIdName().map(Set::isEmpty).orElse(true); + return getManagementUIState().getSelectedDsIdName().map(Set::isEmpty).orElse(true); } @Override protected boolean onLoadIsTableMaximized() { - return managementUIState.isDsTableMaximized(); - } - - @Override - protected boolean hasEditPermission() { - return getPermissionChecker().hasUpdateDistributionPermission(); - } - - @Override - protected String getTabSheetId() { - return UIComponentIdProvider.DISTRIBUTIONSET_DETAILS_TABSHEET_ID; + return getManagementUIState().isDsTableMaximized(); } @Override protected void populateDetailsWidget() { - softwareModuleTable.populateModule(getSelectedBaseEntity()); - populateDetails(getSelectedBaseEntity()); + populateModule(); + populateDetails(); + populateTags(getDistributionTagToken()); populateMetadataDetails(); - - } - - @Override - protected void populateMetadataDetails() { - dsMetadataTable.populateDSMetadata(getSelectedBaseEntity()); - } - - private void populateDetails(final DistributionSet ds) { - if (ds != null) { - updateDistributionDetailsLayout(ds.getType().getName(), ds.isRequiredMigrationStep()); - } else { - updateDistributionDetailsLayout(null, null); - } - } - - private void updateDistributionDetailsLayout(final String type, final Boolean isMigrationRequired) { - final VerticalLayout detailsTabLayout = getDetailsLayout(); - detailsTabLayout.removeAllComponents(); - - if (type != null) { - final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.type"), - type); - typeLabel.setId(UIComponentIdProvider.DETAILS_TYPE_LABEL_ID); - detailsTabLayout.addComponent(typeLabel); - } - - if (isMigrationRequired != null) { - detailsTabLayout.addComponent(SPUIComponentProvider.createNameValueLabel( - getI18n().getMessage("checkbox.dist.migration.required"), - isMigrationRequired.equals(Boolean.TRUE) ? getI18n().getMessage("label.yes") : getI18n().getMessage("label.no"))); - } - } - - private VerticalLayout createSoftwareModuleTab() { - final VerticalLayout swLayout = getTabLayout(); - swLayout.setSizeFull(); - swLayout.addComponent(softwareModuleTable); - return swLayout; - } - - protected VerticalLayout createTagsLayout() { - final VerticalLayout tagsLayout = getTabLayout(); - tagsLayout.addComponent(distributionTagToken.getTokenField()); - return tagsLayout; - } - - @Override - protected String getDetailsHeaderCaptionId() { - return UIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID; - } - - @Override - protected boolean isMetadataIconToBeDisplayed() { - return true; - } - - @Override - protected void showMetadata(final ClickEvent event) { - final Optional ds = distributionSetManagement - .findDistributionSetById(getSelectedBaseEntityId()); - if (!ds.isPresent()) { - notificationMessage.displayWarning(getI18n().getMessage("distributionset.not.exists")); - return; - } - UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(ds.get(), null)); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java index c8477d875..1084e81de 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTableHeader.java @@ -9,30 +9,29 @@ package org.eclipse.hawkbit.ui.management.dstable; import org.eclipse.hawkbit.ui.SpPermissionChecker; -import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader; +import org.eclipse.hawkbit.ui.common.table.AbstractDistributionSetTableHeader; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent; import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent; import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent; import org.eclipse.hawkbit.ui.management.state.ManagementUIState; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.event.dd.DropHandler; import com.vaadin.ui.Button.ClickEvent; /** * Distribution table header. * */ -public class DistributionTableHeader extends AbstractTableHeader { - private static final long serialVersionUID = 7597766804650170127L; +public class DistributionTableHeader extends AbstractDistributionSetTableHeader { - DistributionTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, final UIEventBus eventbus, - final ManagementUIState managementUIState) { + private static final long serialVersionUID = 1L; + + DistributionTableHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, + final UIEventBus eventbus, final ManagementUIState managementUIState) { super(i18n, permChecker, eventbus, managementUIState, null, null); } @@ -45,56 +44,11 @@ public class DistributionTableHeader extends AbstractTableHeader { } } - @Override - protected String getHeaderCaption() { - return i18n.getMessage("header.dist.table"); - } - - @Override - protected String getSearchBoxId() { - return UIComponentIdProvider.DIST_SEARCH_TEXTFIELD; - } - - @Override - protected String getSearchRestIconId() { - return UIComponentIdProvider.DIST_SEARCH_ICON; - } - - @Override - protected String getAddIconId() { - return UIComponentIdProvider.DIST_ADD_ICON; - } - @Override protected String onLoadSearchBoxValue() { return managementUIState.getDistributionTableFilters().getSearchText().orElse(null); } - @Override - protected String getDropFilterId() { - return null; - } - - @Override - protected boolean hasCreatePermission() { - return permChecker.hasCreateDistributionPermission(); - } - - @Override - protected boolean isDropHintRequired() { - return true; - } - - @Override - protected boolean isDropFilterRequired() { - return false; - } - - @Override - protected String getShowFilterButtonLayoutId() { - return UIComponentIdProvider.SHOW_DIST_TAG_ICON; - } - @Override protected void showFilterButtonsLayout() { managementUIState.setDistTagFilterClosed(false); @@ -109,11 +63,6 @@ public class DistributionTableHeader extends AbstractTableHeader { } } - @Override - protected String getMaxMinIconId() { - return UIComponentIdProvider.DS_MAX_MIN_TABLE_ICON; - } - @Override public void maximizeTable() { managementUIState.setDsTableMaximized(Boolean.TRUE); @@ -152,38 +101,4 @@ public class DistributionTableHeader extends AbstractTableHeader { return Boolean.FALSE; } - @Override - protected String getFilterIconStyle() { - return null; - } - - @Override - protected String getDropFilterWrapperId() { - return null; - } - - @Override - protected DropHandler getDropFilterHandler() { - return null; - } - - @Override - protected String getBulkUploadIconId() { - return null; - } - - @Override - protected void bulkUpload(final ClickEvent event) { - // No implementation as no bulk upload is supported. - } - - @Override - protected Boolean isBulkUploadAllowed() { - return Boolean.FALSE; - } - - @Override - protected boolean isBulkUploadInProgress() { - return false; - } } 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 99530deb3..93929e4f9 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 @@ -25,11 +25,11 @@ import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.management.event.TargetTableEvent; import org.eclipse.hawkbit.ui.management.state.ManagementUIState; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; +import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; @@ -64,10 +64,11 @@ public class TargetDetails extends AbstractTableDetailsLayout { private VerticalLayout assignedDistLayout; private VerticalLayout installedDistLayout; - TargetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker permissionChecker, - final ManagementUIState managementUIState, final UINotification uiNotification, - final TagManagement tagManagement, final TargetManagement targetManagement, - final DeploymentManagement deploymentManagement, final EntityFactory entityFactory) { + TargetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, + final SpPermissionChecker permissionChecker, final ManagementUIState managementUIState, + final UINotification uiNotification, final TagManagement tagManagement, + final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, + final EntityFactory entityFactory) { super(i18n, eventBus, permissionChecker, managementUIState); this.targetTagToken = new TargetTagToken(permissionChecker, i18n, uiNotification, eventBus, managementUIState, tagManagement, targetManagement); @@ -75,7 +76,7 @@ public class TargetDetails extends AbstractTableDetailsLayout { entityFactory); this.targetManagement = targetManagement; this.deploymentManagement = deploymentManagement; - addTabs(detailsTab); + addDetailsTab(); restoreState(); } @@ -84,34 +85,26 @@ public class TargetDetails extends AbstractTableDetailsLayout { return getI18n().getMessage("target.details.header"); } - @Override - protected void addTabs(final TabSheet detailsTab) { - detailsTab.addTab(createDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); - detailsTab.addTab(createDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); - detailsTab.addTab(createAttributesLayout(), getI18n().getMessage("caption.attributes.tab"), null); - detailsTab.addTab(createAssignedDistLayout(), getI18n().getMessage("header.target.assigned"), null); - detailsTab.addTab(createInstalledDistLayout(), getI18n().getMessage("header.target.installed"), null); - detailsTab.addTab(createTagsLayout(), getI18n().getMessage("caption.tags.tab"), null); - detailsTab.addTab(createLogLayout(), getI18n().getMessage("caption.logs.tab"), null); - + private final void addDetailsTab() { + getDetailsTab().addTab(getDetailsLayout(), getI18n().getMessage("caption.tab.details"), null); + getDetailsTab().addTab(getDescriptionLayout(), getI18n().getMessage("caption.tab.description"), null); + getDetailsTab().addTab(getAttributesLayout(), getI18n().getMessage("caption.attributes.tab"), null); + getDetailsTab().addTab(createAssignedDistLayout(), getI18n().getMessage("header.target.assigned"), null); + getDetailsTab().addTab(createInstalledDistLayout(), getI18n().getMessage("header.target.installed"), null); + getDetailsTab().addTab(getTagsLayout(), getI18n().getMessage("caption.tags.tab"), null); + getDetailsTab().addTab(getLogLayout(), getI18n().getMessage("caption.logs.tab"), null); } private Component createInstalledDistLayout() { - installedDistLayout = getTabLayout(); + installedDistLayout = createTabLayout(); return installedDistLayout; } private Component createAssignedDistLayout() { - assignedDistLayout = getTabLayout(); + assignedDistLayout = createTabLayout(); return assignedDistLayout; } - private VerticalLayout createTagsLayout() { - final VerticalLayout tagsLayout = getTabLayout(); - tagsLayout.addComponent(targetTagToken.getTokenField()); - return tagsLayout; - } - @Override protected void onEdit(final ClickEvent event) { if (getSelectedBaseEntity() == null) { @@ -137,12 +130,12 @@ public class TargetDetails extends AbstractTableDetailsLayout { @Override protected boolean onLoadIsTableRowSelected() { - return managementUIState.getLastSelectedTargetId() != null; + return getManagementUIState().getLastSelectedTargetId() != null; } @Override protected boolean onLoadIsTableMaximized() { - return managementUIState.isTargetTableMaximized(); + return getManagementUIState().isTargetTableMaximized(); } @Override @@ -163,7 +156,7 @@ public class TargetDetails extends AbstractTableDetailsLayout { populateDistributionDtls(installedDistLayout, null); populateDistributionDtls(assignedDistLayout, null); } - + populateTags(targetTagToken); } @Override @@ -176,7 +169,8 @@ public class TargetDetails extends AbstractTableDetailsLayout { final VerticalLayout detailsTabLayout = getDetailsLayout(); detailsTabLayout.removeAllComponents(); - final Label controllerLabel = SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.target.id"), + final Label controllerLabel = SPUIComponentProvider.createNameValueLabel( + getI18n().getMessage("label.target.id"), HawkbitCommonUtil.trimAndNullIfEmpty(controllerId) == null ? "" : controllerId); controllerLabel.setId(UIComponentIdProvider.TARGET_CONTROLLER_ID); detailsTabLayout.addComponent(controllerLabel); @@ -203,7 +197,8 @@ public class TargetDetails extends AbstractTableDetailsLayout { final HorizontalLayout securityTokenLayout = new HorizontalLayout(); final Label securityTableLbl = new Label( - SPUIComponentProvider.getBoldHTMLText(getI18n().getMessage("label.target.security.token")), ContentMode.HTML); + SPUIComponentProvider.getBoldHTMLText(getI18n().getMessage("label.target.security.token")), + ContentMode.HTML); securityTableLbl.addStyleName(SPUIDefinitions.TEXT_STYLE); securityTableLbl.addStyleName("label-style"); @@ -229,8 +224,8 @@ public class TargetDetails extends AbstractTableDetailsLayout { layout.addComponent(SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.name"), distributionSet.getName())); - layout.addComponent(SPUIComponentProvider.createNameValueLabel(getI18n().getMessage("label.dist.details.version"), - distributionSet.getVersion())); + layout.addComponent(SPUIComponentProvider.createNameValueLabel( + getI18n().getMessage("label.dist.details.version"), distributionSet.getVersion())); distributionSet.getModules() .forEach(module -> layout.addComponent(getSWModlabel(module.getType().getName(), module))); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTableHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTableHeader.java index 43405f1f9..4e2209b95 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTableHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTableHeader.java @@ -63,7 +63,7 @@ import com.vaadin.ui.themes.ValoTheme; */ public class TargetTableHeader extends AbstractTableHeader { - private static final long serialVersionUID = -8647521126666320022L; + private static final long serialVersionUID = 1L; private final UINotification notification; @@ -296,11 +296,6 @@ public class TargetTableHeader extends AbstractTableHeader { bulkUploadTargetWindow.setVisible(true); } - @Override - protected Boolean isAddNewItemAllowed() { - return Boolean.TRUE; - } - @Override protected Boolean isBulkUploadAllowed() { return Boolean.TRUE; @@ -425,14 +420,19 @@ public class TargetTableHeader extends AbstractTableHeader { managementUIState.getTargetTableFilters().getDistributionSet().ifPresent(this::addFilterTextField); } + @Override + protected boolean isBulkUploadInProgress() { + return managementUIState.getTargetTableFilters().getBulkUpload().getSucessfulUploadCount() != 0 + || managementUIState.getTargetTableFilters().getBulkUpload().getFailedUploadCount() != 0; + } + @Override protected String getFilterIconStyle() { return null; } @Override - protected boolean isBulkUploadInProgress() { - return managementUIState.getTargetTableFilters().getBulkUpload().getSucessfulUploadCount() != 0 - || managementUIState.getTargetTableFilters().getBulkUpload().getFailedUploadCount() != 0; + protected Boolean isAddNewItemAllowed() { + return Boolean.TRUE; } }