From 5175fc9521cd30e278ad4268bd93a22ab635cbcb Mon Sep 17 00:00:00 2001 From: Melanie Retter Date: Thu, 14 Dec 2017 08:42:45 +0100 Subject: [PATCH] Refactor Rollout Overview and Action History (#569) * Rollout actions has tooltip with information about action Signed-off-by: Melanie Retter * Fix code smells Signed-off-by: Melanie Retter * Remove columnOrder and use setColumns. Remove duplicate column "Name" Signed-off-by: Melanie Retter * PR review Signed-off-by: Melanie Retter * Use Status not the whole Rollout object for dis-/enable action buttons Signed-off-by: Melanie Retter * PR review Signed-off-by: Melanie Retter --- .../actionhistory/ActionHistoryGrid.java | 47 +-- .../ui/rollout/rollout/RolloutListGrid.java | 379 +++++++++--------- .../rolloutgroup/RolloutGroupListGrid.java | 24 +- .../RolloutGroupTargetsListGrid.java | 16 +- .../src/main/resources/messages.properties | 6 + 5 files changed, 218 insertions(+), 254 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java index c67375646..cff68af76 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java @@ -59,8 +59,8 @@ public class ActionHistoryGrid extends AbstractGrid { private static final Logger LOG = LoggerFactory.getLogger(ActionHistoryGrid.class); private static final String BUTTON_CANCEL = "button.cancel"; private static final String BUTTON_OK = "button.ok"; - private static final double FIXED_PIX_MIN = 29F; - private static final double FIXED_PIX_MAX = 32F; + private static final double FIXED_PIX_MIN = 25; + private static final double FIXED_PIX_MAX = 32; private static final String STATUS_ICON_GREEN = "statusIconGreen"; private static final String STATUS_ICON_RED = "statusIconRed"; @@ -72,7 +72,7 @@ public class ActionHistoryGrid extends AbstractGrid { private static final String VIRT_PROP_FORCED = "forced"; private static final String VIRT_PROP_TIMEFORCED = "timeForced"; - private static final String VIRT_PROP_ACTION_CANCEL = "cancel-aciton"; + private static final String VIRT_PROP_ACTION_CANCEL = "cancel-action"; private static final String VIRT_PROP_ACTION_FORCE = "force-action"; private static final String VIRT_PROP_ACTION_FORCE_QUIT = "force-quit-action"; @@ -208,7 +208,6 @@ public class ActionHistoryGrid extends AbstractGrid { rawCont.addContainerProperty(ProxyAction.PXY_ACTION_ID, Long.class, null, true, true); rawCont.addContainerProperty(ProxyAction.PXY_ACTION_ROLLOUT_NAME, String.class, null, true, true); - } @Override @@ -392,7 +391,7 @@ public class ActionHistoryGrid extends AbstractGrid { * Pinning. */ private void updateDistributionTableStyle() { - managementUIState.getDistributionTableFilters().getPinnedTarget().ifPresent((pinnedTarget) -> { + managementUIState.getDistributionTableFilters().getPinnedTarget().ifPresent(pinnedTarget -> { if (pinnedTarget.getTargetId().equals(selectedTarget.getId())) { eventBus.publish(this, PinUnpinEvent.PIN_TARGET); } @@ -633,20 +632,6 @@ public class ActionHistoryGrid extends AbstractGrid { } } - /** - * Concrete html-label converter that handles Booleans. The converter needs - * an appropriate adapter that must be set via - * {@link AbstractHtmlLabelConverter#addAdapter()} to do the work. - */ - class HtmlBooleanLabelConverter extends AbstractHtmlLabelConverter { - private static final long serialVersionUID = 1L; - - @Override - public Class getModelType() { - return Boolean.class; - } - } - /** * Concrete html-label converter that handles Actions. */ @@ -709,30 +694,6 @@ public class ActionHistoryGrid extends AbstractGrid { } } - /** - * Generator class responsible to generate a button property value for the - * grid. - */ - class ButtonPropertyValueGenerator extends PropertyValueGenerator { - private static final long serialVersionUID = 1L; - - private final String buttonLabel; - - public ButtonPropertyValueGenerator(final String buttonLabel) { - this.buttonLabel = buttonLabel; - } - - @Override - public String getValue(final Item item, final Object itemId, final Object propertyId) { - return buttonLabel; - } - - @Override - public Class getType() { - return String.class; - } - } - /** * Configuration that holds the styling properties for label- and * button-renderers that are included in grid-cells. diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java index 37593d8be..8da759c3a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java @@ -10,13 +10,13 @@ package org.eclipse.hawkbit.ui.rollout.rollout; import static org.eclipse.hawkbit.ui.rollout.DistributionBarHelper.getTooltip; -import java.util.ArrayList; import java.util.Arrays; import java.util.EnumMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.QuotaManagement; @@ -34,7 +34,8 @@ import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.grid.AbstractGrid; import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData; -import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer; +import org.eclipse.hawkbit.ui.customrenderers.renderers.AbstractGridButtonConverter; +import org.eclipse.hawkbit.ui.customrenderers.renderers.GridButtonRenderer; import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer; import org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer; import org.eclipse.hawkbit.ui.push.RolloutChangeEventContainer; @@ -58,8 +59,9 @@ import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.data.Container; import com.vaadin.data.Item; +import com.vaadin.data.util.GeneratedPropertyContainer; +import com.vaadin.data.util.PropertyValueGenerator; import com.vaadin.data.util.converter.Converter; import com.vaadin.server.FontAwesome; import com.vaadin.ui.UI; @@ -73,19 +75,16 @@ public class RolloutListGrid extends AbstractGrid { private static final long serialVersionUID = 1L; - private static final String UPDATE_OPTION = "Update"; - - private static final String COPY_OPTION = "Copy"; - - private static final String PAUSE_OPTION = "Pause"; - - private static final String RUN_OPTION = "Run"; - - private static final String DELETE_OPTION = "Delete"; - private static final String ROLLOUT_RENDERER_DATA = "rolloutRendererData"; + private static final String VIRT_PROP_RUN = "run"; + private static final String VIRT_PROP_PAUSE = "pause"; + private static final String VIRT_PROP_UPDATE = "update"; + private static final String VIRT_PROP_COPY = "copy"; + private static final String VIRT_PROP_DELETE = "delete"; + private final transient RolloutManagement rolloutManagement; + private final transient RolloutGroupManagement rolloutGroupManagement; private final AddUpdateRolloutWindowLayout addUpdateRolloutWindow; @@ -94,8 +93,25 @@ public class RolloutListGrid extends AbstractGrid { private final RolloutUIState rolloutUIState; + private static final List DELETE_COPY_BUTTON_ENABLED = Arrays.asList(RolloutStatus.CREATING, + RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING, RolloutStatus.PAUSED, RolloutStatus.READY, + RolloutStatus.RUNNING, RolloutStatus.STARTING, RolloutStatus.STOPPED, RolloutStatus.FINISHED); + + private static final List UPDATE_BUTTON_ENABLED = Arrays.asList(RolloutStatus.CREATING, + RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING, RolloutStatus.PAUSED, RolloutStatus.READY, + RolloutStatus.RUNNING, RolloutStatus.STARTING, RolloutStatus.STOPPED); + + private static final List PAUSE_BUTTON_ENABLED = Arrays.asList(RolloutStatus.RUNNING); + + private static final List RUN_BUTTON_ENABLED = Arrays.asList(RolloutStatus.READY, + RolloutStatus.PAUSED); + private static final Map statusIconMap = new EnumMap<>(RolloutStatus.class); + private static final List HIDDEN_COLUMNS = Arrays.asList(SPUILabelDefinitions.VAR_CREATED_DATE, + SPUILabelDefinitions.VAR_CREATED_USER, SPUILabelDefinitions.VAR_MODIFIED_DATE, + SPUILabelDefinitions.VAR_MODIFIED_BY, SPUILabelDefinitions.VAR_DESC); + static { statusIconMap.put(RolloutStatus.FINISHED, new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN)); @@ -115,11 +131,6 @@ public class RolloutListGrid extends AbstractGrid { statusIconMap.put(RolloutStatus.DELETING, new StatusFontIcon(null, SPUIStyleDefinitions.STATUS_SPINNER_RED)); } - private static final List HIDDEN_COLUMNS = Arrays.asList(SPUILabelDefinitions.VAR_NAME, - SPUILabelDefinitions.VAR_CREATED_DATE, SPUILabelDefinitions.VAR_CREATED_USER, - SPUILabelDefinitions.VAR_MODIFIED_DATE, SPUILabelDefinitions.VAR_MODIFIED_BY, - SPUILabelDefinitions.VAR_DESC); - RolloutListGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, final RolloutManagement rolloutManagement, final UINotification uiNotification, final RolloutUIState rolloutUIState, final SpPermissionChecker permissionChecker, @@ -135,7 +146,9 @@ public class RolloutListGrid extends AbstractGrid { this.uiNotification = uiNotification; this.rolloutUIState = rolloutUIState; + setGeneratedPropertySupport(new RolloutGeneratedPropertySupport()); init(); + hideColumnsDueToInsufficientPermissions(); } /** @@ -188,13 +201,13 @@ public class RolloutListGrid extends AbstractGrid { if (!rollout.isPresent()) { return; } - - final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource(); + final GeneratedPropertyContainer rolloutContainer = (GeneratedPropertyContainer) getContainerDataSource(); final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId()); if (item == null) { refreshContainer(); return; } + updateItem(rollout.get(), item); } @@ -228,8 +241,8 @@ public class RolloutListGrid extends AbstractGrid { @Override protected void addContainerProperties() { - final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource(); - rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false); + final LazyQueryContainer rolloutGridContainer = getGeneratedPropertySupport().getRawContainer(); + rolloutGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false, false); rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false); rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false, @@ -252,19 +265,7 @@ public class RolloutListGrid extends AbstractGrid { rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, TotalTargetCountStatus.class, null, false, false); - rolloutGridContainer.addContainerProperty(RUN_OPTION, String.class, FontAwesome.PLAY.getHtml(), false, false); - rolloutGridContainer.addContainerProperty(PAUSE_OPTION, String.class, FontAwesome.PAUSE.getHtml(), false, - false); - - if (permissionChecker.hasRolloutUpdatePermission()) { - rolloutGridContainer.addContainerProperty(UPDATE_OPTION, String.class, FontAwesome.EDIT.getHtml(), false, - false); - } - if (permissionChecker.hasRolloutCreatePermission()) { - rolloutGridContainer.addContainerProperty(COPY_OPTION, String.class, FontAwesome.COPY.getHtml(), false, - false); - } - rolloutGridContainer.addContainerProperty(DELETE_OPTION, String.class, FontAwesome.TRASH_O.getHtml(), false, + rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, true, false); } @@ -286,24 +287,20 @@ public class RolloutListGrid extends AbstractGrid { getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMinimumWidth(40); getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMaximumWidth(60); - getColumn(RUN_OPTION).setMinimumWidth(25); - getColumn(RUN_OPTION).setMaximumWidth(25); + getColumn(VIRT_PROP_RUN).setMinimumWidth(25); + getColumn(VIRT_PROP_RUN).setMaximumWidth(25); - getColumn(PAUSE_OPTION).setMinimumWidth(25); - getColumn(PAUSE_OPTION).setMaximumWidth(25); + getColumn(VIRT_PROP_PAUSE).setMinimumWidth(25); + getColumn(VIRT_PROP_PAUSE).setMaximumWidth(25); - if (permissionChecker.hasRolloutUpdatePermission()) { - getColumn(UPDATE_OPTION).setMinimumWidth(25); - getColumn(UPDATE_OPTION).setMaximumWidth(25); - } + getColumn(VIRT_PROP_UPDATE).setMinimumWidth(25); + getColumn(VIRT_PROP_UPDATE).setMaximumWidth(25); - if (permissionChecker.hasRolloutCreatePermission()) { - getColumn(COPY_OPTION).setMinimumWidth(25); - getColumn(COPY_OPTION).setMaximumWidth(25); - } + getColumn(VIRT_PROP_COPY).setMinimumWidth(25); + getColumn(VIRT_PROP_COPY).setMaximumWidth(25); - getColumn(DELETE_OPTION).setMinimumWidth(25); - getColumn(DELETE_OPTION).setMaximumWidth(40); + getColumn(VIRT_PROP_DELETE).setMinimumWidth(25); + getColumn(VIRT_PROP_DELETE).setMaximumWidth(40); getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280); } @@ -324,33 +321,19 @@ public class RolloutListGrid extends AbstractGrid { .setHeaderCaption(i18n.getMessage("header.detail.status")); getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.getMessage("header.status")); - getColumn(RUN_OPTION).setHeaderCaption(i18n.getMessage("header.action.run")); - getColumn(PAUSE_OPTION).setHeaderCaption(i18n.getMessage("header.action.pause")); - - if (permissionChecker.hasRolloutUpdatePermission()) { - getColumn(UPDATE_OPTION).setHeaderCaption(i18n.getMessage("header.action.update")); - } - - if (permissionChecker.hasRolloutCreatePermission()) { - getColumn(COPY_OPTION).setHeaderCaption(i18n.getMessage("header.action.copy")); - } - - getColumn(DELETE_OPTION).setHeaderCaption(i18n.getMessage("header.action.delete")); + getColumn(VIRT_PROP_RUN).setHeaderCaption(i18n.getMessage("header.action.run")); + getColumn(VIRT_PROP_PAUSE).setHeaderCaption(i18n.getMessage("header.action.pause")); + getColumn(VIRT_PROP_UPDATE).setHeaderCaption(i18n.getMessage("header.action.update")); + getColumn(VIRT_PROP_COPY).setHeaderCaption(i18n.getMessage("header.action.copy")); + getColumn(VIRT_PROP_DELETE).setHeaderCaption(i18n.getMessage("header.action.delete")); joinColumns().setText(i18n.getMessage("header.action")); } private HeaderCell joinColumns() { - if (permissionChecker.hasRolloutUpdatePermission() && permissionChecker.hasRolloutCreatePermission()) { - return getDefaultHeaderRow().join(RUN_OPTION, PAUSE_OPTION, UPDATE_OPTION, COPY_OPTION, DELETE_OPTION); - } - if (permissionChecker.hasRolloutUpdatePermission()) { - return getDefaultHeaderRow().join(RUN_OPTION, PAUSE_OPTION, UPDATE_OPTION, DELETE_OPTION); - } - if (permissionChecker.hasRolloutCreatePermission()) { - return getDefaultHeaderRow().join(RUN_OPTION, PAUSE_OPTION, COPY_OPTION, DELETE_OPTION); - } - return getDefaultHeaderRow().join(RUN_OPTION, PAUSE_OPTION); + + return getDefaultHeaderRow().join(VIRT_PROP_RUN, VIRT_PROP_PAUSE, VIRT_PROP_UPDATE, VIRT_PROP_COPY, + VIRT_PROP_DELETE); } @Override @@ -360,32 +343,16 @@ public class RolloutListGrid extends AbstractGrid { @Override protected void setColumnProperties() { - final List columnList = new ArrayList<>(); - columnList.add(ROLLOUT_RENDERER_DATA); - columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION); - columnList.add(SPUILabelDefinitions.VAR_STATUS); - columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS); - columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS); - columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS); - columnList.add(RUN_OPTION); - columnList.add(PAUSE_OPTION); + final List columnsToShowInOrder = Arrays.asList(ROLLOUT_RENDERER_DATA, + SPUILabelDefinitions.VAR_DIST_NAME_VERSION, SPUILabelDefinitions.VAR_STATUS, + SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, + SPUILabelDefinitions.VAR_TOTAL_TARGETS, VIRT_PROP_RUN, VIRT_PROP_PAUSE, VIRT_PROP_UPDATE, + VIRT_PROP_COPY, VIRT_PROP_DELETE, SPUILabelDefinitions.VAR_CREATED_DATE, + SPUILabelDefinitions.VAR_CREATED_USER, SPUILabelDefinitions.VAR_MODIFIED_DATE, + SPUILabelDefinitions.VAR_MODIFIED_BY, SPUILabelDefinitions.VAR_DESC); - if (permissionChecker.hasRolloutUpdatePermission()) { - columnList.add(UPDATE_OPTION); - } - if (permissionChecker.hasRolloutCreatePermission()) { - columnList.add(COPY_OPTION); - } - columnList.add(DELETE_OPTION); - - columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE); - columnList.add(SPUILabelDefinitions.VAR_CREATED_USER); - columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE); - columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY); - columnList.add(SPUILabelDefinitions.VAR_DESC); - setColumnOrder(columnList.toArray()); - alignColumns(); + setColumns(columnsToShowInOrder.toArray()); } @Override @@ -393,6 +360,12 @@ public class RolloutListGrid extends AbstractGrid { for (final Object propertyId : HIDDEN_COLUMNS) { getColumn(propertyId).setHidden(true); } + + getColumn(VIRT_PROP_RUN).setHidable(false); + getColumn(VIRT_PROP_PAUSE).setHidable(false); + getColumn(VIRT_PROP_DELETE).setHidable(false); + getColumn(VIRT_PROP_UPDATE).setHidable(false); + getColumn(VIRT_PROP_COPY).setHidable(false); } @Override @@ -413,28 +386,92 @@ public class RolloutListGrid extends AbstractGrid { customObjectRenderer.addClickListener(this::onClickOfRolloutName); getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer); - getColumn(RUN_OPTION) - .setRenderer(new HtmlButtonRenderer(clickEvent -> startOrResumeRollout((Long) clickEvent.getItemId()))); - - getColumn(PAUSE_OPTION) - .setRenderer(new HtmlButtonRenderer(clickEvent -> pauseRollout((Long) clickEvent.getItemId()))); - - if (permissionChecker.hasRolloutUpdatePermission()) { - getColumn(UPDATE_OPTION) - .setRenderer(new HtmlButtonRenderer(clickEvent -> updateRollout((Long) clickEvent.getItemId()))); - } - if (permissionChecker.hasRolloutCreatePermission()) { - getColumn(COPY_OPTION) - .setRenderer(new HtmlButtonRenderer(clickEvent -> copyRollout((Long) clickEvent.getItemId()))); - } - - getColumn(DELETE_OPTION) - .setRenderer(new HtmlButtonRenderer(clickEvent -> deleteRollout((Long) clickEvent.getItemId()))); - + getColumn(VIRT_PROP_RUN).setRenderer( + new GridButtonRenderer(clickEvent -> startOrResumeRollout((Long) clickEvent.getItemId())), + new RolloutGridButtonConverter(this::createRunButtonMetadata)); + getColumn(VIRT_PROP_PAUSE).setRenderer( + new GridButtonRenderer(clickEvent -> pauseRollout((Long) clickEvent.getItemId())), + new RolloutGridButtonConverter(this::createPauseButtonMetadata)); + getColumn(VIRT_PROP_UPDATE).setRenderer( + new GridButtonRenderer(clickEvent -> updateRollout((Long) clickEvent.getItemId())), + new RolloutGridButtonConverter(this::createUpdateButtonMetadata)); + getColumn(VIRT_PROP_COPY).setRenderer( + new GridButtonRenderer(clickEvent -> copyRollout((Long) clickEvent.getItemId())), + new RolloutGridButtonConverter(this::createCopyButtonMetadata)); + getColumn(VIRT_PROP_DELETE).setRenderer( + new GridButtonRenderer(clickEvent -> deleteRollout((Long) clickEvent.getItemId())), + new RolloutGridButtonConverter(this::createDeleteButtonMetadata)); } - private void alignColumns() { - setCellStyleGenerator(new RollouStatusCellStyleGenerator(getContainerDataSource())); + /** + * Generator class responsible to retrieve a Rollout from the grid data in + * order to generate a virtual property. + */ + class GenericPropertyValueGenerator extends PropertyValueGenerator { + private static final long serialVersionUID = 1L; + + @Override + public RolloutStatus getValue(final Item item, final Object itemId, final Object propertyId) { + return (RolloutStatus) item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue(); + } + + @Override + public Class getType() { + return RolloutStatus.class; + } + } + + /** + * Adds support for virtual properties (aka generated properties) + */ + class RolloutGeneratedPropertySupport extends AbstractGeneratedPropertySupport { + + @Override + public GeneratedPropertyContainer getDecoratedContainer() { + return (GeneratedPropertyContainer) getContainerDataSource(); + } + + @Override + public LazyQueryContainer getRawContainer() { + return (LazyQueryContainer) (getDecoratedContainer()).getWrappedContainer(); + } + + @Override + protected GeneratedPropertyContainer addGeneratedContainerProperties() { + final GeneratedPropertyContainer decoratedContainer = getDecoratedContainer(); + + decoratedContainer.addGeneratedProperty(VIRT_PROP_RUN, new GenericPropertyValueGenerator()); + decoratedContainer.addGeneratedProperty(VIRT_PROP_PAUSE, new GenericPropertyValueGenerator()); + decoratedContainer.addGeneratedProperty(VIRT_PROP_UPDATE, new GenericPropertyValueGenerator()); + decoratedContainer.addGeneratedProperty(VIRT_PROP_COPY, new GenericPropertyValueGenerator()); + decoratedContainer.addGeneratedProperty(VIRT_PROP_DELETE, new GenericPropertyValueGenerator()); + + return decoratedContainer; + } + } + + /** + * Concrete grid-button converter that handles Rollouts Status. + */ + class RolloutGridButtonConverter extends AbstractGridButtonConverter { + + private static final long serialVersionUID = 1L; + + /** + * Constructor that sets the appropriate adapter. + * + * @param adapter + * adapts RolloutStatus to + * StatusFontIcon + */ + public RolloutGridButtonConverter(final GridButtonAdapter adapter) { + addAdapter(adapter); + } + + @Override + public Class getModelType() { + return RolloutStatus.class; + } } private void onClickOfRolloutName(final RendererClickEvent event) { @@ -554,79 +591,39 @@ public class RolloutListGrid extends AbstractGrid { return description; } - private static class RollouStatusCellStyleGenerator implements CellStyleGenerator { + private static boolean hasToBeDisabled(final RolloutStatus currentRolloutStatus, + final List expectedRolloutStatus) { + return !expectedRolloutStatus.contains(currentRolloutStatus); + } - private static final List DELETE_COPY_BUTTON_ENABLED = Arrays.asList(RolloutStatus.CREATING, - RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING, RolloutStatus.PAUSED, RolloutStatus.READY, - RolloutStatus.RUNNING, RolloutStatus.STARTING, RolloutStatus.STOPPED, RolloutStatus.FINISHED); + private StatusFontIcon createRunButtonMetadata(final RolloutStatus rolloutStatus) { + final boolean isDisabled = hasToBeDisabled(rolloutStatus, RUN_BUTTON_ENABLED); + return new StatusFontIcon(FontAwesome.PLAY, null, i18n.getMessage("tooltip.rollout.run"), + UIComponentIdProvider.ROLLOUT_RUN_BUTTON_ID, isDisabled); + } - private static final List UPDATE_BUTTON_ENABLED = Arrays.asList(RolloutStatus.CREATING, - RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING, RolloutStatus.PAUSED, RolloutStatus.READY, - RolloutStatus.RUNNING, RolloutStatus.STARTING, RolloutStatus.STOPPED); + private StatusFontIcon createPauseButtonMetadata(final RolloutStatus rolloutStatus) { + final boolean isDisabled = hasToBeDisabled(rolloutStatus, PAUSE_BUTTON_ENABLED); + return new StatusFontIcon(FontAwesome.PAUSE, null, i18n.getMessage("tooltip.rollout.pause"), + UIComponentIdProvider.ROLLOUT_PAUSE_BUTTON_ID, isDisabled); + } - private static final List PAUSE_BUTTON_ENABLED = Arrays.asList(RolloutStatus.RUNNING); + private StatusFontIcon createCopyButtonMetadata(final RolloutStatus rolloutStatus) { + final boolean isDisabled = hasToBeDisabled(rolloutStatus, DELETE_COPY_BUTTON_ENABLED); + return new StatusFontIcon(FontAwesome.COPY, null, i18n.getMessage("tooltip.rollout.copy"), + UIComponentIdProvider.ROLLOUT_COPY_BUTTON_ID, isDisabled); + } - private static final List RUN_BUTTON_ENABLED = Arrays.asList(RolloutStatus.READY, - RolloutStatus.PAUSED); + private StatusFontIcon createUpdateButtonMetadata(final RolloutStatus rolloutStatus) { + final boolean isDisabled = hasToBeDisabled(rolloutStatus, UPDATE_BUTTON_ENABLED); + return new StatusFontIcon(FontAwesome.EDIT, null, i18n.getMessage("tooltip.rollout.update"), + UIComponentIdProvider.ROLLOUT_UPDATE_BUTTON_ID, isDisabled); + } - private static final long serialVersionUID = 1L; - - private final Container.Indexed containerDataSource; - - /** - * Constructor - * - * @param containerDataSource - * the container - */ - public RollouStatusCellStyleGenerator(final Container.Indexed containerDataSource) { - this.containerDataSource = containerDataSource; - } - - @Override - public String getStyle(final CellReference cellReference) { - if (SPUILabelDefinitions.VAR_STATUS.equals(cellReference.getPropertyId())) { - return "centeralign"; - } - return convertRolloutStatusToString(cellReference); - } - - private String convertRolloutStatusToString(final CellReference cellReference) { - final String propertyId = (String) cellReference.getPropertyId(); - - if (RUN_OPTION.equals(propertyId)) { - return getStatus(cellReference, RUN_BUTTON_ENABLED); - } - - if (PAUSE_OPTION.equals(propertyId)) { - return getStatus(cellReference, PAUSE_BUTTON_ENABLED); - } - - if (UPDATE_OPTION.equals(propertyId)) { - return getStatus(cellReference, UPDATE_BUTTON_ENABLED); - } - - if (DELETE_OPTION.equals(propertyId) || COPY_OPTION.equals(propertyId)) { - return getStatus(cellReference, DELETE_COPY_BUTTON_ENABLED); - } - - return null; - } - - private String getStatus(final CellReference cellReference, final List expectedRolloutStatus) { - final RolloutStatus currentRolloutStatus = getRolloutStatus(cellReference.getItemId()); - - if (expectedRolloutStatus.contains(currentRolloutStatus)) { - return null; - } - - return org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer.DISABLE_VALUE; - } - - private RolloutStatus getRolloutStatus(final Object itemId) { - final Item row = containerDataSource.getItem(itemId); - return (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue(); - } + private StatusFontIcon createDeleteButtonMetadata(final RolloutStatus rolloutStatus) { + final boolean isDisabled = hasToBeDisabled(rolloutStatus, DELETE_COPY_BUTTON_ENABLED); + return new StatusFontIcon(FontAwesome.TRASH_O, null, i18n.getMessage("tooltip.rollout.delete"), + UIComponentIdProvider.ROLLOUT_DELETE_BUTTON_ID, isDisabled); } /** @@ -636,7 +633,7 @@ public class RolloutListGrid extends AbstractGrid { */ class RolloutStatusConverter implements Converter { - private static final long serialVersionUID = -1217685750825632678L; + private static final long serialVersionUID = 1L; @Override public RolloutStatus convertToModel(final String value, final Class targetType, @@ -737,4 +734,18 @@ public class RolloutListGrid extends AbstractGrid { } } + private final void hideColumnsDueToInsufficientPermissions() { + + final List modifiableColumnsList = getColumns().stream().map(Column::getPropertyId) + .collect(Collectors.toList()); + + if (!permissionChecker.hasRolloutUpdatePermission()) { + modifiableColumnsList.remove(VIRT_PROP_UPDATE); + } + if (!permissionChecker.hasRolloutCreatePermission()) { + modifiableColumnsList.remove(VIRT_PROP_COPY); + } + setColumns(modifiableColumnsList.toArray()); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupListGrid.java index fafdefa8d..a03d3933b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupListGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupListGrid.java @@ -141,7 +141,6 @@ public class RolloutGroupListGrid extends AbstractGrid { @Override protected void addContainerProperties() { final LazyQueryContainer rolloutGroupGridContainer = (LazyQueryContainer) getContainerDataSource(); - rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false); rolloutGroupGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false, false); @@ -221,20 +220,14 @@ public class RolloutGroupListGrid extends AbstractGrid { @Override protected void setColumnProperties() { - final List columnList = new ArrayList<>(); - columnList.add(ROLLOUT_RENDERER_DATA); - columnList.add(SPUILabelDefinitions.VAR_STATUS); - columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS); - columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS); - columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE); - columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD); - columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD); - columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE); - columnList.add(SPUILabelDefinitions.VAR_CREATED_USER); - columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE); - columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY); - columnList.add(SPUILabelDefinitions.VAR_DESC); - setColumnOrder(columnList.toArray()); + final Object[] columnsToShowInOrder = new Object[] { ROLLOUT_RENDERER_DATA, SPUILabelDefinitions.VAR_STATUS, + SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, SPUILabelDefinitions.VAR_TOTAL_TARGETS, + SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE, + SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD, + SPUILabelDefinitions.VAR_CREATED_DATE, SPUILabelDefinitions.VAR_CREATED_USER, + SPUILabelDefinitions.VAR_MODIFIED_DATE, SPUILabelDefinitions.VAR_MODIFIED_BY, + SPUILabelDefinitions.VAR_DESC }; + setColumns(columnsToShowInOrder); alignColumns(); } @@ -253,7 +246,6 @@ public class RolloutGroupListGrid extends AbstractGrid { @Override protected void setHiddenColumns() { final List columnsToBeHidden = new ArrayList<>(); - columnsToBeHidden.add(SPUILabelDefinitions.VAR_NAME); columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE); columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER); columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetsListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetsListGrid.java index f6a1d5114..f39756f5c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetsListGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetsListGrid.java @@ -8,9 +8,7 @@ */ package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets; -import java.util.ArrayList; import java.util.EnumMap; -import java.util.List; import java.util.Locale; import java.util.Map; @@ -164,15 +162,11 @@ public class RolloutGroupTargetsListGrid extends AbstractGrid columnList = new ArrayList<>(); - columnList.add(SPUILabelDefinitions.VAR_NAME); - columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE); - columnList.add(SPUILabelDefinitions.VAR_CREATED_BY); - columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE); - columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY); - columnList.add(SPUILabelDefinitions.VAR_STATUS); - columnList.add(SPUILabelDefinitions.VAR_DESC); - setColumnOrder(columnList.toArray()); + final Object[] columnsToShowInOrder = new Object[] { SPUILabelDefinitions.VAR_NAME, + SPUILabelDefinitions.VAR_CREATED_DATE, SPUILabelDefinitions.VAR_CREATED_BY, + SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, + SPUILabelDefinitions.VAR_STATUS, SPUILabelDefinitions.VAR_DESC }; + setColumns(columnsToShowInOrder); alignColumns(); } diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index c1d45fc4d..f70848847 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -232,6 +232,12 @@ tooltip.check.for.mandatory=Check to make Mandatory tooltip.artifact.icon=Show Artifact Details tooltip.click.to.edit = Click to edit tooltip.metadata.icon = Manage Metadata +#rollout action +tooltip.rollout.run = Run +tooltip.rollout.pause = Pause +tooltip.rollout.update = Update.. +tooltip.rollout.copy = Copy.. +tooltip.rollout.delete = Delete.. # Notification messages prefix with - message message.save.success = {0} saved successfully