Added permission check for create/update metadata

Added 'cancel' button in metadata popup
Added show 'metadata' icon next to 'edit' icon

Signed-off-by: AMU7KOR <Asharani.Murugesh@in.bosch.com>
This commit is contained in:
AMU7KOR
2016-06-23 15:40:29 +05:30
committed by Kai Zimmermann
parent 176e2d52c1
commit a53a6c9f0c
12 changed files with 244 additions and 87 deletions

View File

@@ -200,4 +200,23 @@ public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDeta
&& selectedUploadSWModule.getName().equals(softwareModule.getName())
&& selectedUploadSWModule.getVersion().equals(softwareModule.getVersion());
}
@Override
protected Boolean isMetadataIconToBeDisplayed() {
return true;
}
@Override
protected String getShowMetadataButtonId() {
SoftwareModule selectedBaseEntity = getSelectedBaseEntity();
return SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + selectedBaseEntity.getName() + "."
+ selectedBaseEntity.getVersion();
}
@Override
protected void showMetadata(ClickEvent event) {
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null));
}
}

View File

@@ -21,6 +21,7 @@ import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.repository.model.NamedVersionedEntity;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleBorderWithIcon;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -81,7 +82,7 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
@Autowired
private UINotification uiNotification;
@Autowired
protected transient EventBus.SessionEventBus eventBus;
@@ -91,6 +92,8 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
private Button addIcon;
private Button discardButton;
private Grid metaDataGrid;
private Label headerCaption;
@@ -103,9 +106,8 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
private void init() {
createComponents();
buildLayout();
}
/**
* Returns metadata popup.
@@ -120,41 +122,18 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
selectedEntity = entity;
String nameVersion = HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
metadataWindow = SPUIComponentProvider.getWindow(getMetadataCaption(nameVersion), null,
SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onSave(), event -> onDiscard(), null);
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
metadataWindow.setCancelButtonCaption(i18n.get("button.discard"));
metadataWindow.setCancelButtonIcon(FontAwesome.UNDO);
SPUIDefinitions.CREATE_UPDATE_WINDOW, this, event -> onSave(), event -> onCancel(), null);
metadataWindow.setId(SPUIComponentIdProvider.METADATA_POPUP_ID);
metadataWindow.setHeight(550, Unit.PIXELS);
metadataWindow.setWidth(800, Unit.PIXELS);
metadataWindow.getMainLayout().setSizeFull();
metadataWindow.setResizable(true);
metadataWindow.addWindowModeChangeListener(event -> onResize(event));
setUpDetails(entity.getId(),metaData);
metadataWindow.getButtonsLayout().addComponent(discardButton, 1);
setUpDetails(entity.getId(), metaData);
return metadataWindow;
}
public void setUpDetails(final Long swId, final M metaData) {
keyTextField.clear();
valueTextArea.clear();
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
addIcon.setEnabled(true);
if (swId != null) {
metaDataGrid.getContainerDataSource().removeAllItems();
populateGrid();
metaDataGrid.getSelectionModel().reset();
if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) {
if (metaData == null) {
metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0));
} else {
metaDataGrid.select(metaData.getKey());
}
}
}
}
public E getSelectedEntity() {
return selectedEntity;
}
@@ -173,12 +152,17 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
protected abstract void deleteMetadata(E entity, String key, String value);
protected abstract boolean hasCreatePermission();
protected abstract boolean hasUpdatePermission();
private void createComponents() {
keyTextField = createKeyTextField();
valueTextArea = createValueTextField();
metaDataGrid = createMetadataGrid();
addIcon = createAddIcon();
headerCaption = createHeaderCaption();
discardButton = createDiscardButton();
}
private void buildLayout() {
@@ -188,8 +172,10 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
headerLayout.setMargin(false);
headerLayout.setSizeFull();
headerLayout.addComponent(headerCaption);
headerLayout.addComponents(addIcon);
headerLayout.setComponentAlignment(addIcon, Alignment.MIDDLE_RIGHT);
if (hasCreatePermission()) {
headerLayout.addComponents(addIcon);
headerLayout.setComponentAlignment(addIcon, Alignment.MIDDLE_RIGHT);
}
headerLayout.setExpandRatio(headerCaption, 1.0F);
final HorizontalLayout headerWrapperLayout = new HorizontalLayout();
@@ -294,9 +280,13 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
}
} else {
keyTextField.clear();
keyTextField.setEnabled(true);
valueTextArea.clear();
metaDataGrid.select(null);
if (hasCreatePermission()) {
keyTextField.setEnabled(true);
valueTextArea.setEnabled(true);
addIcon.setEnabled(false);
}
}
}
});
@@ -329,9 +319,11 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
if (metadataCompositeKey != null) {
Item item = metaDataGrid.getContainerDataSource().getItem(metadataCompositeKey);
keyTextField.setValue((String) item.getItemProperty(KEY).getValue());
// TODO value to be stored in table???
valueTextArea.setValue((String) item.getItemProperty(VALUE).getValue());
keyTextField.setEnabled(false);
if (hasUpdatePermission()) {
valueTextArea.setEnabled(true);
}
}
}
@@ -356,10 +348,12 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
}
private void onAdd(ClickEvent event) {
metaDataGrid.deselect(metaDataGrid.getSelectedRow());
valueTextArea.clear();
keyTextField.clear();
keyTextField.setEnabled(true);
valueTextArea.setEnabled(true);
addIcon.setEnabled(true);
metaDataGrid.deselect(metaDataGrid.getSelectedRow());
}
private void onSave() {
@@ -376,7 +370,10 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
metaDataGrid.select(metadata.getKey());
addIcon.setEnabled(true);
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
setDiscardButtonEnabled(false);
if (!hasUpdatePermission()) {
valueTextArea.setEnabled(false);
}
}
} else {
M metadata = updateMetadata(entity, key, value);
@@ -385,7 +382,7 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
metaDataGrid.select(metadata.getKey());
addIcon.setEnabled(true);
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
setDiscardButtonEnabled(false);
}
}
}
@@ -429,18 +426,24 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
popualateKeyValue(itemSelected);
}
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
setDiscardButtonEnabled(false);
}
private void onCancel() {
metadataWindow.close();
UI.getCurrent().removeWindow(metadataWindow);
}
private void onKeyChange(TextChangeEvent event) {
if (!valueTextArea.getValue().isEmpty() && !event.getText().isEmpty()) {
metadataWindow.setSaveButtonEnabled(true);
metadataWindow.setCancelButtonEnabled(true);
} else {
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
if (hasCreatePermission() || hasUpdatePermission()) {
if (!valueTextArea.getValue().isEmpty() && !event.getText().isEmpty()) {
metadataWindow.setSaveButtonEnabled(true);
setDiscardButtonEnabled(true);
} else {
metadataWindow.setSaveButtonEnabled(false);
setDiscardButtonEnabled(false);
}
}
}
private void onRowClick(SelectionEvent event) {
@@ -453,20 +456,29 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
} else {
keyTextField.clear();
valueTextArea.clear();
keyTextField.setEnabled(true);
addIcon.setEnabled(false);
if (hasCreatePermission()) {
keyTextField.setEnabled(true);
valueTextArea.setEnabled(true);
addIcon.setEnabled(false);
}
else{
keyTextField.setEnabled(false);
valueTextArea.setEnabled(false);
}
}
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
setDiscardButtonEnabled(false);
}
private void onValueChange(TextChangeEvent event) {
if (!keyTextField.getValue().isEmpty() && !event.getText().isEmpty()) {
metadataWindow.setSaveButtonEnabled(true);
metadataWindow.setCancelButtonEnabled(true);
} else {
metadataWindow.setSaveButtonEnabled(false);
metadataWindow.setCancelButtonEnabled(false);
if (hasCreatePermission() || hasUpdatePermission()) {
if (!keyTextField.getValue().isEmpty() && !event.getText().isEmpty()) {
metadataWindow.setSaveButtonEnabled(true);
setDiscardButtonEnabled(true);
} else {
metadataWindow.setSaveButtonEnabled(false);
setDiscardButtonEnabled(false);
}
}
}
@@ -476,7 +488,8 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
} else {
metaDataGrid.getColumn(DELETE_BUTTON).setWidth(50);
}
//Repopulating the grid (forcing for repaint)- workaround as grid size is not getting adjusted
// Repopulating the grid (forcing for repaint)- workaround as grid size
// is not getting adjusted
Map<String, String> keyValueDetails = new LinkedHashMap<>();
for (Object key : metaDataGrid.getContainerDataSource().getItemIds()) {
Item item = metaDataGrid.getContainerDataSource().getItem(key);
@@ -489,4 +502,47 @@ public abstract class AbstractMetadataPopupLayout<E extends NamedVersionedEntity
}
}
private Button createDiscardButton() {
Button discardButton = SPUIComponentProvider.getButton(SPUIComponentIdProvider.CANCEL_BUTTON,
i18n.get("button.discard"), "", "", true, FontAwesome.UNDO, SPUIButtonStyleBorderWithIcon.class);
discardButton.setSizeUndefined();
discardButton.addStyleName("default-color");
discardButton.addClickListener(event -> onDiscard());
return discardButton;
}
private void setUpDetails(final Long swId, final M metaData) {
resetDetails();
if (swId != null) {
metaDataGrid.getContainerDataSource().removeAllItems();
populateGrid();
metaDataGrid.getSelectionModel().reset();
if (!metaDataGrid.getContainerDataSource().getItemIds().isEmpty()) {
if (metaData == null) {
metaDataGrid.select(metaDataGrid.getContainerDataSource().getIdByIndex(0));
} else {
metaDataGrid.select(metaData.getKey());
}
} else if (hasCreatePermission()) {
keyTextField.setEnabled(true);
valueTextArea.setEnabled(true);
addIcon.setEnabled(false);
}
}
}
private void resetDetails() {
keyTextField.clear();
valueTextArea.clear();
keyTextField.setEnabled(false);
valueTextArea.setEnabled(false);
metadataWindow.setSaveButtonEnabled(false);
setDiscardButtonEnabled(false);
addIcon.setEnabled(true);
}
private void setDiscardButtonEnabled(Boolean enable) {
discardButton.setEnabled(enable);
}
}

View File

@@ -17,7 +17,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.Resource;
import com.vaadin.ui.AbstractOrderedLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
@@ -161,23 +160,11 @@ public class CommonDialogWindow extends Window {
public void setSaveButtonEnabled(final boolean enabled) {
saveButton.setEnabled(enabled);
}
public void setCancelButtonEnabled(final boolean enabled) {
cancelButton.setEnabled(enabled);
}
public HorizontalLayout getButtonsLayout() {
return buttonsLayout;
}
public void setCancelButtonCaption(final String caption) {
cancelButton.setCaption(caption);
}
public void setCancelButtonIcon(final Resource icon) {
cancelButton.setIcon(icon);
}
public VerticalLayout getMainLayout() {
return mainLayout;
}

View File

@@ -63,6 +63,8 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
private Button editButton;
private Button manageMetadataBtn;
private TabSheet detailsTab;
private VerticalLayout detailsLayout;
@@ -137,6 +139,12 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
editButton.setId(getEditButtonId());
editButton.addClickListener(this::onEdit);
manageMetadataBtn = SPUIComponentProvider.getButton("", "", "", null, false,
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
manageMetadataBtn.setId(getEditButtonId());
manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon"));
manageMetadataBtn.addClickListener(this::showMetadata);
editButton.setEnabled(false);
detailsTab = SPUIComponentProvider.getDetailsTabSheet();
@@ -156,6 +164,10 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
if (hasEditPermission()) {
nameEditLayout.addComponent(editButton);
nameEditLayout.setComponentAlignment(editButton, Alignment.TOP_RIGHT);
if (isMetadataIconToBeDisplayed()) {
nameEditLayout.addComponent(manageMetadataBtn);
nameEditLayout.setComponentAlignment(manageMetadataBtn, Alignment.TOP_RIGHT);
}
}
nameEditLayout.setExpandRatio(caption, 1.0F);
nameEditLayout.addStyleName(SPUIStyleDefinitions.WIDGET_TITLE);
@@ -336,4 +348,10 @@ public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends
protected abstract String getName();
protected abstract String getShowMetadataButtonId();
protected abstract Boolean isMetadataIconToBeDisplayed();
protected abstract void showMetadata(Button.ClickEvent event);
}

View File

@@ -399,10 +399,29 @@ public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDet
return SPUIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID;
}
@Override
protected Boolean isMetadataIconToBeDisplayed() {
return true;
}
@Override
protected String getShowMetadataButtonId() {
DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState
.getLastSelectedDistribution().get() : null;
return SPUIComponentIdProvider.DS_TABLE_MANAGE_METADATA_ID + "." + lastselectedDistDS.getName() + "."
+ lastselectedDistDS.getVersion();
}
private boolean isDistributionSetSelected(DistributionSet ds) {
DistributionSetIdName lastselectedDistDS = manageDistUIState.getLastSelectedDistribution().isPresent() ? manageDistUIState
.getLastSelectedDistribution().get() : null;
return ds != null && lastselectedDistDS != null && lastselectedDistDS.getName().equals(ds.getName())
&& lastselectedDistDS.getVersion().endsWith(ds.getVersion());
}
@Override
protected void showMetadata(ClickEvent event) {
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null));
}
}

View File

@@ -12,6 +12,7 @@ import java.util.List;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetMetadata;
import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout;
@@ -37,14 +38,17 @@ public class DsMetadataPopupLayout extends AbstractMetadataPopupLayout<Distribut
@Autowired
private EntityFactory entityFactory;
@Autowired
protected SpPermissionChecker permChecker;
@Override
protected void checkForDuplicate(DistributionSet entity, String value) {
distributionSetManagement.findOne(entity, value);
}
/**
* Create metadata for DistributionSet.
*/
@Override
protected DistributionSetMetadata createMetadata(DistributionSet entity, String key, String value) {
DistributionSetMetadata dsMetaData = distributionSetManagement.createDistributionSetMetadata(entityFactory
@@ -80,4 +84,14 @@ public class DsMetadataPopupLayout extends AbstractMetadataPopupLayout<Distribut
distributionSetManagement.deleteDistributionSetMetadata(entity, key);
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_DISTRIBUTION_SET_METADATA, dsMetaData));
}
@Override
protected boolean hasCreatePermission() {
return permChecker.hasCreateDistributionPermission();
}
@Override
protected boolean hasUpdatePermission() {
return permChecker.hasUpdateDistributionPermission();
}
}

View File

@@ -1,18 +0,0 @@
/**
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.distributions.event;
/**
*
*
*/
public enum SwModuleUIEvent {
HIDE_FILTER_BY_TYPE, SHOW_FILTER_BY_TYPE, DELETED_ALL_SOFWARE ;
}

View File

@@ -12,6 +12,7 @@ import java.util.List;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
@@ -46,6 +47,9 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
@Autowired
private ManageDistUIState manageDistUIState;
@Autowired
protected SpPermissionChecker permChecker;
@Override
protected void checkForDuplicate(SoftwareModule entity, String value) {
softwareManagement.findSoftwareModuleMetadata(entity, value);
@@ -86,5 +90,15 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
softwareManagement.deleteSoftwareModuleMetadata(entity, key);
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA, swMetadata));
}
@Override
protected boolean hasCreatePermission() {
return permChecker.hasCreateDistributionPermission();
}
@Override
protected boolean hasUpdatePermission() {
return permChecker.hasUpdateDistributionPermission();
}
}

View File

@@ -208,4 +208,20 @@ public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLay
&& selectedDistSWModuleId.equals(softwareModule.getId());
}
@Override
protected Boolean isMetadataIconToBeDisplayed() {
return true;
}
@Override
protected String getShowMetadataButtonId() {
SoftwareModule selectedBaseEntity = getSelectedBaseEntity();
return SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + selectedBaseEntity.getName() + "."
+ selectedBaseEntity.getVersion();
}
@Override
protected void showMetadata(ClickEvent event) {
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null));
}
}

View File

@@ -206,11 +206,28 @@ public class DistributionDetails extends AbstractNamedVersionedEntityTableDetail
return SPUIComponentIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID;
}
@Override
protected Boolean isMetadataIconToBeDisplayed() {
return true;
}
@Override
protected String getShowMetadataButtonId() {
DistributionSetIdName lastselectedDistDS = managementUIState.getLastSelectedDistribution().isPresent() ? managementUIState
.getLastSelectedDistribution().get() : null;
return SPUIComponentIdProvider.DS_TABLE_MANAGE_METADATA_ID + "." + lastselectedDistDS.getName() + "."
+ lastselectedDistDS.getVersion();
}
private boolean isDistributionSetSelected(DistributionSet ds) {
DistributionSetIdName lastselectedManageDS = managementUIState.getLastSelectedDistribution().isPresent() ? managementUIState
.getLastSelectedDistribution().get() : null;
return ds!=null && lastselectedManageDS != null && lastselectedManageDS.getName().equals(ds.getName())
&& lastselectedManageDS.getVersion().endsWith(ds.getVersion());
}
@Override
protected void showMetadata(ClickEvent event) {
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(getSelectedBaseEntity(),null));
}
}

View File

@@ -253,7 +253,7 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
private Button createManageMetadataButton(String nameVersionStr) {
final Button manageMetadataBtn = SPUIComponentProvider.getButton(
SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
SPUIComponentIdProvider.DS_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
manageMetadataBtn.addStyleName(SPUIStyleDefinitions.ARTIFACT_DTLS_ICON);
manageMetadataBtn.addStyleName(SPUIStyleDefinitions.DS_METADATA_ICON);

View File

@@ -248,4 +248,19 @@ public class TargetDetails extends AbstractTableDetailsLayout<Target> {
return SPUIComponentIdProvider.TARGET_DETAILS_HEADER_LABEL_ID;
}
@Override
protected String getShowMetadataButtonId() {
return null;
}
@Override
protected Boolean isMetadataIconToBeDisplayed() {
return false;
}
@Override
protected void showMetadata(ClickEvent event) {
//No implementation required
}
}