diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java index f913a6c95..c897947c4 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java @@ -215,7 +215,7 @@ public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, Syst } @Override - @CacheEvict(value = { "tenantMetadata" }, key = "#tenant.toUpperCase()") + @CacheEvict(value = { "tenantMetadata" }, key = "#tenant.toUpperCase()", cacheManager = "directCacheManager") @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying public void deleteTenant(final String tenant) { @@ -242,7 +242,7 @@ public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, Syst } @Override - @Cacheable(value = "tenantMetadata", keyGenerator = "tenantKeyGenerator") + @Cacheable(value = "tenantMetadata", keyGenerator = "tenantKeyGenerator", cacheManager = "directCacheManager") @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying public TenantMetaData getTenantMetadata() { @@ -277,7 +277,7 @@ public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, Syst } @Override - @CachePut(value = "tenantMetadata", key = "#metaData.tenant.toUpperCase()") + @CachePut(value = "tenantMetadata", key = "#metaData.tenant.toUpperCase()", cacheManager = "directCacheManager") @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying public TenantMetaData updateTenantMetadata(final TenantMetaData metaData) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/ConfirmationDialog.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/ConfirmationDialog.java index 5f20d942a..bd1f4cb9e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/ConfirmationDialog.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/ConfirmationDialog.java @@ -89,6 +89,7 @@ public class ConfirmationDialog implements Button.ClickListener { final Button cancelButton = SPUIComponentProvider.getButton(null, cancelLabel, "", null, false, null, SPUIButtonStyleTiny.class); cancelButton.addClickListener(this); + cancelButton.setId(SPUIComponentIdProvider.CANCEL_BUTTON); window.setModal(true); window.addStyleName(SPUIStyleDefinitions.CONFIRMBOX_WINDOW_SYLE); if (this.callback == null) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java index 1e4a35002..b9e75efed 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java @@ -8,39 +8,60 @@ */ package org.eclipse.hawkbit.ui.customrenderers.client.renderers; +import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider; + import com.google.gwt.user.client.ui.Button; import com.vaadin.client.renderers.ButtonRenderer; import com.vaadin.client.ui.VButton; import com.vaadin.client.widget.grid.RendererCellReference; /** - * - * Renders button with provided HTML content. - * Used to display button with icons. - * + * Renders button with provided HTML content. Used to display button with icons. */ public class HtmlButtonRenderer extends ButtonRenderer { + + public static final String DISABLE_VALUE = "_Disabled_"; + @Override - public void render(RendererCellReference cell, String text, Button button) { + public void render(final RendererCellReference cell, final String text, final Button button) { + final boolean buttonEnable = isButtonEnable(cell.getElement().getClassName()); if (text != null) { button.setHTML(text); } - applystyles(button); + applystyles(button, buttonEnable); // this is to allow the button to disappear, if the text is null button.setVisible(text != null); - button.getElement().setId("rollout.action.button.id"); + button.getElement().setId(SPUIComponentIdProvider.ROLLOUT_ACTION_ID + "." + cell.getColumnIndex()); + button.setEnabled(buttonEnable); } - private void applystyles(Button button) { + /** + * see here https://vaadin.com/forum#!/thread/9418390/9765924 + * + * @param text + * the button text + * @return is button enable. + */ + private static boolean isButtonEnable(final String text) { + return !text.contains(DISABLE_VALUE); + } + + private void applystyles(final Button button, final boolean buttonEnable) { + button.setStyleName(VButton.CLASSNAME); button.addStyleName(getStyle("tiny")); - button.addStyleName(getStyle("borderless")); - button.addStyleName(getStyle("icon-only")); + button.addStyleName(getStyle("borderless-colored")); button.addStyleName(getStyle("button-no-border")); + button.addStyleName(getStyle("action-type-padding")); + + if (buttonEnable) { + return; + } + button.addStyleName("v-disabled"); } - - + private String getStyle(final String style) { return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString(); } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java index 367c9dc8b..0bc0a4f97 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java @@ -31,7 +31,7 @@ public class HtmlButtonRenderer extends ButtonRenderer { * @param listener * RendererClickListener */ - public HtmlButtonRenderer(RendererClickListener listener) { + public HtmlButtonRenderer(final RendererClickListener listener) { super(listener); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTable.java index 6e83769b5..5ee3be084 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTable.java @@ -87,7 +87,7 @@ public class TargetFilterTable extends Table { setStyleName("sp-table"); setSizeFull(); setImmediate(true); - setHeight(100.0f, Unit.PERCENTAGE); + setHeight(100.0F, Unit.PERCENTAGE); addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES); addStyleName(ValoTheme.TABLE_SMALL); addCustomGeneratedColumns(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryTable.java index 944b3fdf9..ffc7d1e3a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryTable.java @@ -27,6 +27,7 @@ import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; +import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder; import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent; import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent; import org.eclipse.hawkbit.ui.management.event.TargetTableEvent; @@ -49,15 +50,14 @@ import org.vaadin.spring.events.EventBus; import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.google.common.collect.Lists; import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.data.util.HierarchicalContainer; -import com.vaadin.event.Action.Handler; import com.vaadin.server.FontAwesome; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; @@ -73,11 +73,13 @@ import com.vaadin.ui.themes.ValoTheme; */ @SpringComponent @ViewScope -public class ActionHistoryTable extends TreeTable implements Handler { +public class ActionHistoryTable extends TreeTable { + private static final long serialVersionUID = -1631514704696786653L; + private static final Logger LOG = LoggerFactory.getLogger(ActionHistoryTable.class); private static final String BUTTON_CANCEL = "button.cancel"; private static final String BUTTON_OK = "button.ok"; - private static final long serialVersionUID = -1631514704696786653L; + @Autowired private I18N i18n; @@ -94,14 +96,10 @@ public class ActionHistoryTable extends TreeTable implements Handler { private ManagementUIState managementUIState; private Container hierarchicalContainer; - private boolean alreadyHasMessages = false; + private boolean alreadyHasMessages; private Target target; - com.vaadin.event.Action actionCancel; - com.vaadin.event.Action actionForce; - com.vaadin.event.Action actionForceQuit; - private static final Logger LOG = LoggerFactory.getLogger(ActionHistoryTable.class); private static final String STATUS_ICON_GREEN = "statusIconGreen"; /** @@ -109,10 +107,6 @@ public class ActionHistoryTable extends TreeTable implements Handler { */ @PostConstruct public void init() { - actionCancel = new com.vaadin.event.Action(i18n.get("message.cancel.action")); - actionForceQuit = new com.vaadin.event.Action(i18n.get("message.forcequit.action")); - actionForceQuit.setIcon(FontAwesome.WARNING); - actionForce = new com.vaadin.event.Action(i18n.get("message.force.action")); initializeTableSettings(); buildComponent(); restorePreviousState(); @@ -149,11 +143,12 @@ public class ActionHistoryTable extends TreeTable implements Handler { } private void setColumnExpandRatioForMinimisedTable() { - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DIST, 0.3f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_STATUS, 0.15f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DATETIME, 0.3f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_FORCED, 0.15f); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DIST, 0.3F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_STATUS, 0.15F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DATETIME, 0.3F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_FORCED, 0.15F); + setColumnExpandRatio(SPUIDefinitions.ACTIONS_COLUMN, 0.2F); } private void initializeTableSettings() { @@ -163,14 +158,15 @@ public class ActionHistoryTable extends TreeTable implements Handler { setMultiSelect(false); setSortEnabled(true); setColumnReorderingAllowed(true); - setHeight(100.0f, Unit.PERCENTAGE); - setWidth(100.0f, Unit.PERCENTAGE); + setHeight(100.0F, Unit.PERCENTAGE); + setWidth(100.0F, Unit.PERCENTAGE); setImmediate(true); setStyleName("sp-table"); addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES); addStyleName(ValoTheme.TABLE_SMALL); setColumnAlignment(SPUIDefinitions.ACTION_HIS_TBL_FORCED, Align.CENTER); setColumnAlignment(SPUIDefinitions.ACTION_HIS_TBL_STATUS, Align.CENTER); + setColumnAlignment(SPUIDefinitions.ACTIONS_COLUMN, Align.CENTER); // listeners for child addExpandListener(event -> { expandParentActionRow(event.getItemId()); @@ -180,11 +176,6 @@ public class ActionHistoryTable extends TreeTable implements Handler { collapseParentActionRow(event.getItemId()); managementUIState.getExpandParentActionRowId().remove(event.getItemId()); }); - /* - * Add the cancel action handler for active actions. To be used to - * cancel the action. - */ - addActionHandler(this); } /** @@ -203,6 +194,7 @@ public class ActionHistoryTable extends TreeTable implements Handler { null); hierarchicalContainer.addContainerProperty(SPUIDefinitions.ACTION_HIS_TBL_MSGS_HIDDEN, List.class, null); hierarchicalContainer.addContainerProperty(SPUIDefinitions.ACTION_HIS_TBL_ROLLOUT_NAME, String.class, null); + } private List getVisbleColumns() { @@ -212,6 +204,8 @@ public class ActionHistoryTable extends TreeTable implements Handler { visibleColumnIds.add(SPUIDefinitions.ACTION_HIS_TBL_DATETIME); visibleColumnIds.add(SPUIDefinitions.ACTION_HIS_TBL_STATUS); visibleColumnIds.add(SPUIDefinitions.ACTION_HIS_TBL_FORCED); + visibleColumnIds.add(SPUIDefinitions.ACTIONS_COLUMN); + if (managementUIState.isActionHistoryMaximized()) { visibleColumnIds.add(SPUIDefinitions.ACTION_HIS_TBL_ROLLOUT_NAME); visibleColumnIds.add(SPUIDefinitions.ACTION_HIS_TBL_MSGS); @@ -241,12 +235,12 @@ public class ActionHistoryTable extends TreeTable implements Handler { private void getcontainerData() { hierarchicalContainer.removeAllItems(); - + if (target != null) { /* service method to create action history for target */ final List actionHistory = deploymentManagement - .findActionsWithStatusCountByTargetOrderByIdDesc(target); - + .findActionsWithStatusCountByTargetOrderByIdDesc(target); + addDetailsToContainer(actionHistory); } } @@ -299,23 +293,22 @@ public class ActionHistoryTable extends TreeTable implements Handler { * add distribution name to the item which will be displayed in the * table. The name should not exceed certain limit. */ - item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DIST).setValue(actionWithStatusCount.getDsName() + ":" + - actionWithStatusCount.getDsVersion()); + item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DIST) + .setValue(actionWithStatusCount.getDsName() + ":" + actionWithStatusCount.getDsVersion()); item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_FORCED).setValue(action); /* Default no child */ ((Hierarchical) hierarchicalContainer).setChildrenAllowed(actionWithStatusCount.getAction().getId(), false); item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DATETIME) - .setValue(SPDateTimeUtil.getFormattedDate((actionWithStatusCount.getAction().getLastModifiedAt() != null) - ? actionWithStatusCount.getAction().getLastModifiedAt() - : actionWithStatusCount.getAction().getLastModifiedAt())); + .setValue(SPDateTimeUtil.getFormattedDate(actionWithStatusCount.getAction().getLastModifiedAt())); item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ROLLOUT_NAME) .setValue(actionWithStatusCount.getRolloutName()); if (actionWithStatusCount.getActionStatusCount() > 0) { - ((Hierarchical) hierarchicalContainer).setChildrenAllowed(actionWithStatusCount.getAction().getId(), true); + ((Hierarchical) hierarchicalContainer).setChildrenAllowed(actionWithStatusCount.getAction().getId(), + true); } } } @@ -349,12 +342,18 @@ public class ActionHistoryTable extends TreeTable implements Handler { return getForcedColumn(itemId); } }); + + addGeneratedColumn(SPUIDefinitions.ACTIONS_COLUMN, new Table.ColumnGenerator() { + + private static final long serialVersionUID = 1L; + + @Override + public Component generateCell(final Table source, final Object itemId, final Object columnId) { + return createActionBarColumn(itemId); + } + }); } - /** - * @param itemId - * @return - */ private Component getForcedColumn(final Object itemId) { final Action actionWithActiveStatus = (Action) hierarchicalContainer.getItem(itemId) .getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_FORCED).getValue(); @@ -371,10 +370,6 @@ public class ActionHistoryTable extends TreeTable implements Handler { return actionLabel; } - /** - * @param itemId - * @return - */ private Component getActiveColumn(final Object itemId) { final Action.Status status = (Action.Status) hierarchicalContainer.getItem(itemId) .getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_STATUS_HIDDEN).getValue(); @@ -396,10 +391,44 @@ public class ActionHistoryTable extends TreeTable implements Handler { return activeStatusIcon; } - /** - * @param itemId - * @return - */ + private HorizontalLayout createActionBarColumn(final Object itemId) { + final HorizontalLayout actionBar = new HorizontalLayout(); + final Item item = hierarchicalContainer.getItem(itemId); + final Long actionId = (Long) item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID_HIDDEN).getValue(); + final String activeValue = (String) item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ACTIVE_HIDDEN) + .getValue(); + final Action actionWithActiveStatus = (Action) item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_FORCED) + .getValue(); + + if (actionWithActiveStatus == null) { + return null; + } + final boolean isActionActive = target != null && SPUIDefinitions.ACTIVE.equals(activeValue); + + final Button actionCancel = SPUIComponentProvider.getButton( + SPUIComponentIdProvider.ACTION_HISTORY_TABLE_CANCEL_ID, "", i18n.get("message.cancel.action"), + ValoTheme.BUTTON_TINY, true, FontAwesome.TIMES, SPUIButtonStyleSmallNoBorder.class); + actionCancel.setEnabled(isActionActive && !actionWithActiveStatus.isCancelingOrCanceled()); + actionCancel.addClickListener(event -> confirmAndCancelAction(actionId)); + + final Button actionForce = SPUIComponentProvider.getButton( + SPUIComponentIdProvider.ACTION_HISTORY_TABLE_FORCE_ID, "", i18n.get("message.force.action"), + ValoTheme.BUTTON_TINY, true, FontAwesome.BOLT, SPUIButtonStyleSmallNoBorder.class); + actionForce.setEnabled( + isActionActive && !actionWithActiveStatus.isForce() && !actionWithActiveStatus.isCancelingOrCanceled()); + actionForce.addClickListener(event -> confirmAndForceAction(actionId)); + + final Button actionForceQuit = SPUIComponentProvider.getButton( + SPUIComponentIdProvider.ACTION_HISTORY_TABLE_FORCE_QUIT_ID, "", i18n.get("message.forcequit.action"), + ValoTheme.BUTTON_TINY + " redicon", true, FontAwesome.TIMES, SPUIButtonStyleSmallNoBorder.class); + actionForceQuit.setEnabled(isActionActive && actionWithActiveStatus.isCancelingOrCanceled()); + actionForceQuit.addClickListener(event -> confirmAndForceQuitAction(actionId)); + + actionBar.addComponents(actionCancel, actionForce, actionForceQuit); + + return actionBar; + } + private Component getStatusColumn(final Object itemId) { final Action.Status status = (Action.Status) hierarchicalContainer.getItem(itemId) .getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_STATUS_HIDDEN).getValue(); @@ -426,11 +455,11 @@ public class ActionHistoryTable extends TreeTable implements Handler { final Pageable pageReq = new PageRequest(0, 1000, new Sort(Direction.DESC, ActionStatusFields.ID.getFieldName())); final Page actionStatusList; - if (managementUIState.isActionHistoryMaximized()) { - actionStatusList = deploymentManagement.findActionStatusByActionWithMessages(pageReq, action); - } else { - actionStatusList = deploymentManagement.findActionStatusByAction(pageReq, action); - } + if (managementUIState.isActionHistoryMaximized()) { + actionStatusList = deploymentManagement.findActionStatusByActionWithMessages(pageReq, action); + } else { + actionStatusList = deploymentManagement.findActionStatusByAction(pageReq, action); + } final List content = actionStatusList.getContent(); /* * Since the recent action status and messages are already @@ -448,9 +477,8 @@ public class ActionHistoryTable extends TreeTable implements Handler { */ childItem.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ACTIVE_HIDDEN).setValue(""); - childItem.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DIST) - .setValue(action.getDistributionSet().getName() + ":" - + action.getDistributionSet().getVersion()); + childItem.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DIST).setValue( + action.getDistributionSet().getName() + ":" + action.getDistributionSet().getVersion()); childItem.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_DATETIME) .setValue(SPDateTimeUtil.getFormattedDate(actionStatus.getCreatedAt())); @@ -636,14 +664,15 @@ public class ActionHistoryTable extends TreeTable implements Handler { private void setColumnExpantRatioOnTableMaximize() { /* set messages column can expand the rest of the available space */ - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTIVE, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_STATUS, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DIST, 0.2f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_FORCED, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ROLLOUT_NAME, 0.1f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_MSGS, 0.35f); - setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DATETIME, 0.15f); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTIVE, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_STATUS, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DIST, 0.2F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_FORCED, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_ROLLOUT_NAME, 0.1F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_MSGS, 0.35F); + setColumnExpandRatio(SPUIDefinitions.ACTION_HIS_TBL_DATETIME, 0.15F); + setColumnExpandRatio(SPUIDefinitions.ACTIONS_COLUMN, 0.2F); } /** @@ -705,46 +734,6 @@ public class ActionHistoryTable extends TreeTable implements Handler { setColumnExpandRatioForMinimisedTable(); } - @Override - public void handleAction(final com.vaadin.event.Action action, final Object sender, final Object target) { - /* Get the actionId details of the cancel item or row */ - final Item item = hierarchicalContainer.getItem(target); - final Long actionId = (Long) item.getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ACTION_ID_HIDDEN).getValue(); - if (action.equals(actionCancel)) { - if (actionId != null) { - confirmAndCancelAction(actionId); - } - } else if (action.equals(actionForce)) { - confirmAndForceAction(actionId); - } else if (action.equals(actionForceQuit)) { - confirmAndForceQuitAction(actionId); - } - } - - @Override - public com.vaadin.event.Action[] getActions(final Object target, final Object sender) { - final List actions = Lists.newArrayList(); - if (target != null) { - /* Check if the row or item belongs to active action */ - final String activeValue = (String) hierarchicalContainer.getItem(target) - .getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_ACTIVE_HIDDEN).getValue(); - if (SPUIDefinitions.ACTIVE.equals(activeValue)) { - final Action actionWithActiveStatus = (Action) hierarchicalContainer.getItem(target) - .getItemProperty(SPUIDefinitions.ACTION_HIS_TBL_FORCED).getValue(); - if (!actionWithActiveStatus.isForce()) { - actions.add(actionForce); - } - if (!actionWithActiveStatus.isCancelingOrCanceled()) { - actions.add(actionCancel); - } else { - actions.add(actionForceQuit); - } - - } - } - return actions.toArray(new com.vaadin.event.Action[actions.size()]); - } - /** * Show confirmation window and if ok then only, force the action. * @@ -755,21 +744,15 @@ public class ActionHistoryTable extends TreeTable implements Handler { /* Display the confirmation */ final ConfirmationDialog confirmDialog = new ConfirmationDialog(i18n.get("caption.force.action.confirmbox"), i18n.get("message.force.action.confirm"), i18n.get(BUTTON_OK), i18n.get(BUTTON_CANCEL), ok -> { - if (ok) { - /* cancel the action */ - deploymentManagement.forceTargetAction(actionId); - - /* - * Refresh the action history table to show latest - * change of the action cancellation and update the - * Target Details - */ - - populateAndupdateTargetDetails(target); - notification.displaySuccess(i18n.get("message.force.action.success")); + if (!ok) { + return; } + deploymentManagement.forceTargetAction(actionId); + populateAndupdateTargetDetails(target); + notification.displaySuccess(i18n.get("message.force.action.success")); }); UI.getCurrent().addWindow(confirmDialog.getWindow()); + confirmDialog.getWindow().bringToFront(); } @@ -777,22 +760,19 @@ public class ActionHistoryTable extends TreeTable implements Handler { /* Display the confirmation */ final ConfirmationDialog confirmDialog = new ConfirmationDialog(i18n.get("caption.forcequit.action.confirmbox"), i18n.get("message.forcequit.action.confirm"), i18n.get(BUTTON_OK), i18n.get(BUTTON_CANCEL), ok -> { - if (ok) { - final boolean cancelResult = forceQuitActiveAction(actionId); - if (cancelResult) { - /* - * Refresh the action history table to show latest - * change of the action cancellation and update the - * Target Details - */ - populateAndupdateTargetDetails(target); - notification.displaySuccess(i18n.get("message.forcequit.action.success")); - } else { - notification.displayValidationError(i18n.get("message.forcequit.action.failed")); - } + if (!ok) { + return; } - } , FontAwesome.WARNING); + final boolean cancelResult = forceQuitActiveAction(actionId); + if (cancelResult) { + populateAndupdateTargetDetails(target); + notification.displaySuccess(i18n.get("message.forcequit.action.success")); + } else { + notification.displayValidationError(i18n.get("message.forcequit.action.failed")); + } + }, FontAwesome.WARNING); UI.getCurrent().addWindow(confirmDialog.getWindow()); + confirmDialog.getWindow().bringToFront(); } @@ -803,21 +783,21 @@ public class ActionHistoryTable extends TreeTable implements Handler { * as Id if the action needs to be cancelled. */ private void confirmAndCancelAction(final Long actionId) { + if (actionId == null) { + return; + } + final ConfirmationDialog confirmDialog = new ConfirmationDialog(i18n.get("caption.cancel.action.confirmbox"), i18n.get("message.cancel.action.confirm"), i18n.get(BUTTON_OK), i18n.get(BUTTON_CANCEL), ok -> { - if (ok) { - final boolean cancelResult = cancelActiveAction(actionId); - if (cancelResult) { - /* - * Refresh the action history table to show latest - * change of the action cancellation and update the - * Target Details - */ - populateAndupdateTargetDetails(target); - notification.displaySuccess(i18n.get("message.cancel.action.success")); - } else { - notification.displayValidationError(i18n.get("message.cancel.action.failed")); - } + if (!ok) { + return; + } + final boolean cancelResult = cancelActiveAction(actionId); + if (cancelResult) { + populateAndupdateTargetDetails(target); + notification.displaySuccess(i18n.get("message.cancel.action.success")); + } else { + notification.displayValidationError(i18n.get("message.cancel.action.failed")); } }); UI.getCurrent().addWindow(confirmDialog.getWindow()); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java index bc27e7aa3..ad61a1f56 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/footer/ActionTypeOptionGroupLayout.java @@ -79,7 +79,6 @@ public class ActionTypeOptionGroupLayout extends HorizontalLayout { private void createOptionGroup() { actionTypeOptionGroup = new FlexibleOptionGroup(); - actionTypeOptionGroup.setId(SPUIComponentIdProvider.ROLLOUT_ACTION_BUTTON_ID); actionTypeOptionGroup.addItem(ActionTypeOption.SOFT); actionTypeOptionGroup.addItem(ActionTypeOption.FORCED); actionTypeOptionGroup.addItem(ActionTypeOption.AUTO_FORCED); @@ -100,6 +99,7 @@ public class ActionTypeOptionGroupLayout extends HorizontalLayout { addComponent(forceLabel); final FlexibleOptionGroupItemComponent softItem = actionTypeOptionGroup.getItemComponent(ActionTypeOption.SOFT); + softItem.setId(SPUIComponentIdProvider.ACTION_DETAILS_SOFT_ID); softItem.setStyleName(STYLE_DIST_WINDOW_ACTIONTYPE); addComponent(softItem); final Label softLabel = new Label(); 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 e994192be..b58e2e7b8 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 @@ -16,6 +16,7 @@ import static org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil.HTML_UL_OPEN_TAG; import java.util.ArrayList; import java.util.Arrays; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -48,17 +49,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition; -import org.vaadin.peter.contextmenu.ContextMenu; -import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItem; -import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItemClickEvent; 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.PropertyValueGenerator; import com.vaadin.data.util.converter.Converter; -import com.vaadin.server.AbstractClientConnector; import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; @@ -77,11 +73,9 @@ public class RolloutListGrid extends AbstractGrid { private static final String UPDATE_OPTION = "Update"; - private static final String RESUME_OPTION = "Resume"; - private static final String PAUSE_OPTION = "Pause"; - private static final String START_OPTION = "Start"; + private static final String RUN_OPTION = "Run"; private static final String DS_TYPE = "type"; @@ -143,7 +137,7 @@ public class RolloutListGrid extends AbstractGrid { final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource(); final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId()); if (item == null) { - refreshGrid(); + refreshGrid(); return; } item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus()); @@ -196,8 +190,15 @@ public class RolloutListGrid extends AbstractGrid { rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, TotalTargetCountStatus.class, null, false, false); - rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.ACTION, String.class, - FontAwesome.CIRCLE_O.getHtml(), 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); + } } @Override @@ -218,8 +219,16 @@ public class RolloutListGrid extends AbstractGrid { getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMinimumWidth(40); getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMaximumWidth(100); - getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(75); - getColumn(SPUILabelDefinitions.ACTION).setMaximumWidth(75); + getColumn(RUN_OPTION).setMinimumWidth(25); + getColumn(RUN_OPTION).setMaximumWidth(25); + + getColumn(PAUSE_OPTION).setMinimumWidth(25); + getColumn(PAUSE_OPTION).setMaximumWidth(25); + + if (permissionChecker.hasRolloutUpdatePermission()) { + getColumn(UPDATE_OPTION).setMinimumWidth(25); + getColumn(UPDATE_OPTION).setMaximumWidth(25); + } getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280); @@ -229,9 +238,9 @@ public class RolloutListGrid extends AbstractGrid { @Override protected void setColumnHeaderNames() { getColumn(ROLLOUT_RENDERER_DATA).setHeaderCaption(i18n.get("header.name")); - getColumn(DS_TYPE).setHeaderCaption("Type"); - getColumn(SW_MODULES).setHeaderCaption("swModules"); - getColumn(IS_REQUIRED_MIGRATION_STEP).setHeaderCaption("IsRequiredMigrationStep"); + getColumn(DS_TYPE).setHeaderCaption(i18n.get("header.type")); + getColumn(SW_MODULES).setHeaderCaption(i18n.get("header.swmodules")); + getColumn(IS_REQUIRED_MIGRATION_STEP).setHeaderCaption(i18n.get("header.migrations.step")); getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get("header.distributionset")); getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get("header.numberofgroups")); getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets")); @@ -243,7 +252,16 @@ public class RolloutListGrid extends AbstractGrid { getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS) .setHeaderCaption(i18n.get("header.detail.status")); getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status")); - getColumn(SPUILabelDefinitions.ACTION).setHeaderCaption(i18n.get("upload.action")); + + getColumn(RUN_OPTION).setHeaderCaption(i18n.get("header.action.run")); + getColumn(PAUSE_OPTION).setHeaderCaption(i18n.get("header.action.pause")); + + if (permissionChecker.hasRolloutUpdatePermission()) { + getColumn(UPDATE_OPTION).setHeaderCaption(i18n.get("header.action.update")); + } + + final HeaderCell join = getDefaultHeaderRow().join(RUN_OPTION, PAUSE_OPTION, UPDATE_OPTION); + join.setText(i18n.get("header.action")); } @Override @@ -263,7 +281,13 @@ public class RolloutListGrid extends AbstractGrid { columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS); columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS); columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS); - columnList.add(SPUILabelDefinitions.ACTION); + + columnList.add(RUN_OPTION); + columnList.add(PAUSE_OPTION); + + if (permissionChecker.hasRolloutUpdatePermission()) { + columnList.add(UPDATE_OPTION); + } columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE); columnList.add(SPUILabelDefinitions.VAR_CREATED_USER); @@ -306,11 +330,21 @@ public class RolloutListGrid extends AbstractGrid { createRolloutStatusToFontMap(); getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter()); - getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(this::onClickOfActionBtn)); - final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class); 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()))); + } + } private void createRolloutStatusToFontMap() { @@ -332,18 +366,7 @@ public class RolloutListGrid extends AbstractGrid { } private void alignColumns() { - setCellStyleGenerator(new CellStyleGenerator() { - private static final long serialVersionUID = 5573570647129792429L; - - @Override - public String getStyle(final CellReference cellReference) { - final String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS, SPUILabelDefinitions.ACTION }; - if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) { - return "centeralign"; - } - return null; - } - }); + setCellStyleGenerator(new RollouStatusCellStyleGenerator(getContainerDataSource())); } private void onClickOfRolloutName(final RendererClickEvent event) { @@ -357,82 +380,44 @@ public class RolloutListGrid extends AbstractGrid { eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS); } - private void onClickOfActionBtn(final RendererClickEvent event) { - final ContextMenu contextMenu = createContextMenu((Long) event.getItemId()); - contextMenu.setAsContextMenuOf((AbstractClientConnector) event.getComponent()); - contextMenu.open(event.getClientX(), event.getClientY()); - } - - private ContextMenu createContextMenu(final Long rolloutId) { - final ContextMenu context = new ContextMenu(); - context.addItemClickListener(this::menuItemClicked); + private void pauseRollout(final Long rolloutId) { final Item row = getContainerDataSource().getItem(rolloutId); + final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS) .getValue(); - switch (rolloutStatus) { - case READY: - final ContextMenuItem startItem = context.addItem(START_OPTION); - startItem.setData(new ContextMenuData(rolloutId, ACTION.START)); - break; - case RUNNING: - final ContextMenuItem pauseItem = context.addItem(PAUSE_OPTION); - pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE)); - break; - case PAUSED: - final ContextMenuItem resumeItem = context.addItem(RESUME_OPTION); - resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME)); - break; - case STARTING: - case CREATING: - case ERROR_CREATING: - case ERROR_STARTING: - // do not provide any action on these statuses - return context; - default: - break; - } - getUpdateMenuItem(context, rolloutId); - return context; - } - - private void getUpdateMenuItem(final ContextMenu context, final Long rolloutId) { - // Add 'Update' option only if user has update permission - if (!permissionChecker.hasRolloutUpdatePermission()) { + if (!RolloutStatus.RUNNING.equals(rolloutStatus)) { return; } - final ContextMenuItem cancelItem = context.addItem(UPDATE_OPTION); - cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE)); + + final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue(); + + rolloutManagement.pauseRollout(rolloutManagement.findRolloutById(rolloutId)); + uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName)); } - private void menuItemClicked(final ContextMenuItemClickEvent event) { - final ContextMenuItem item = (ContextMenuItem) event.getSource(); - final ContextMenuData contextMenuData = (ContextMenuData) item.getData(); - final Item row = getContainerDataSource().getItem(contextMenuData.getRolloutId()); + private void startOrResumeRollout(final Long rolloutId) { + final Item row = getContainerDataSource().getItem(rolloutId); + + final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS) + .getValue(); final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue(); - switch (contextMenuData.getAction()) { - case PAUSE: - rolloutManagement.pauseRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId())); - uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName)); - break; - case RESUME: - rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId())); - uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName)); - break; - case START: + + if (RolloutStatus.READY.equals(rolloutStatus)) { rolloutManagement.startRolloutAsync(rolloutManagement.findRolloutByName(rolloutName)); uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName)); - break; - case UPDATE: - onUpdate(contextMenuData); - break; - default: - break; + return; + } + + if (RolloutStatus.PAUSED.equals(rolloutStatus)) { + rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(rolloutId)); + uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName)); + return; } } - private void onUpdate(final ContextMenuData contextMenuData) { - final CommonDialogWindow addTargetWindow = addUpdateRolloutWindow.getWindow(contextMenuData.getRolloutId()); + private void updateRollout(final Long rolloutId) { + final CommonDialogWindow addTargetWindow = addUpdateRolloutWindow.getWindow(rolloutId); addTargetWindow.setCaption(i18n.get("caption.update.rollout")); UI.getCurrent().addWindow(addTargetWindow); addTargetWindow.setVisible(Boolean.TRUE); @@ -442,29 +427,6 @@ public class RolloutListGrid extends AbstractGrid { ((LazyQueryContainer) getContainerDataSource()).refresh(); } - /** - * Generator to generate fontIcon by String. - */ - public final class FontIconGenerator extends PropertyValueGenerator { - - private static final long serialVersionUID = 2544026030795375748L; - private final FontAwesome fontIcon; - - public FontIconGenerator(final FontAwesome icon) { - this.fontIcon = icon; - } - - @Override - public String getValue(final Item item, final Object itemId, final Object propertyId) { - return fontIcon.getHtml(); - } - - @Override - public Class getType() { - return String.class; - } - } - private String getDescription(final CellReference cell) { if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) { return cell.getProperty().getValue().toString().toLowerCase(); @@ -518,61 +480,70 @@ public class RolloutListGrid extends AbstractGrid { return stringBuilder.toString(); } - enum ACTION { - PAUSE, RESUME, START, UPDATE - } + private static class RollouStatusCellStyleGenerator implements CellStyleGenerator { - /** - * Represents data of context menu item. - * - */ - public static class ContextMenuData { + private static final long serialVersionUID = 1L; + /** + * Contains all expected rollout status per column to enable or disable + * the button. + */ + private static final Map EXPECTED_ROLLOUT_STATUS_ENABLE_BUTTON = new HashMap<>(); + private final Container.Indexed containerDataSource; - private Long rolloutId; - - private ACTION action; + static { + EXPECTED_ROLLOUT_STATUS_ENABLE_BUTTON.put(RUN_OPTION, RolloutStatus.READY); + EXPECTED_ROLLOUT_STATUS_ENABLE_BUTTON.put(PAUSE_OPTION, RolloutStatus.RUNNING); + } /** - * Set rollout if and action. + * Constructor * - * @param rolloutId - * id of rollout - * @param action - * user action {@link ACTION} + * @param containerDataSource + * the container */ - public ContextMenuData(final Long rolloutId, final ACTION action) { - this.action = action; - this.rolloutId = rolloutId; + public RollouStatusCellStyleGenerator(final Container.Indexed containerDataSource) { + this.containerDataSource = containerDataSource; } - /** - * @return the rolloutId - */ - public Long getRolloutId() { - return rolloutId; + @Override + public String getStyle(final CellReference cellReference) { + if (SPUILabelDefinitions.VAR_STATUS.equals(cellReference.getPropertyId())) { + return "centeralign"; + } + return convertRolloutStatusToString(cellReference); } - /** - * @param rolloutId - * the rolloutId to set - */ - public void setRolloutId(final Long rolloutId) { - this.rolloutId = rolloutId; + private String convertRolloutStatusToString(final CellReference cellReference) { + final Object propertyId = cellReference.getPropertyId(); + final RolloutStatus expectedRolloutStatus = EXPECTED_ROLLOUT_STATUS_ENABLE_BUTTON.get(propertyId); + if (expectedRolloutStatus == null) { + return null; + } + + if (RUN_OPTION.equals(cellReference.getPropertyId())) { + return getStatus(cellReference, RolloutStatus.READY, RolloutStatus.PAUSED); + } + + if (PAUSE_OPTION.equals(cellReference.getPropertyId())) { + return getStatus(cellReference, RolloutStatus.RUNNING); + } + + return null; } - /** - * @return the action - */ - public ACTION getAction() { - return action; + private String getStatus(final CellReference cellReference, final RolloutStatus... expectedRolloutStatus) { + final RolloutStatus currentRolloutStatus = getRolloutStatus(cellReference.getItemId()); + + if (Arrays.asList(expectedRolloutStatus).contains(currentRolloutStatus)) { + return null; + } + + return org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer.DISABLE_VALUE; } - /** - * @param action - * the action to set - */ - public void setAction(final ACTION action) { - this.action = action; + private RolloutStatus getRolloutStatus(final Object itemId) { + final Item row = containerDataSource.getItem(itemId); + return (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue(); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java index 3ecbe9b41..5c0456c7d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIComponentIdProvider.java @@ -246,6 +246,11 @@ public final class SPUIComponentIdProvider { */ public static final String DISCARD_SW_MODULE_TYPE = "save.actions.popup.discard.sw.module.type"; + /** + * Action history table cancel Id. + */ + public static final String ACTION_DETAILS_SOFT_ID = "action.details.soft.group"; + /** * ID - Label. */ @@ -293,6 +298,21 @@ public final class SPUIComponentIdProvider { */ public static final String ACTION_HISTORY_TABLE_ID = "action.history.tableId"; + /** + * Action history table cancel Id. + */ + public static final String ACTION_HISTORY_TABLE_CANCEL_ID = "action.history.table.action.cancel"; + + /** + * Action history table force Id. + */ + public static final String ACTION_HISTORY_TABLE_FORCE_ID = "action.history.table.action.force"; + + /** + * Action history table force quit Id. + */ + public static final String ACTION_HISTORY_TABLE_FORCE_QUIT_ID = "action.history.table.action.force.quit"; + /** * Target filter wrapper id. */ @@ -837,19 +857,26 @@ public final class SPUIComponentIdProvider { * Rollout target filter query combo id. */ public static final String ROLLOUT_TARGET_FILTER_COMBO_ID = "rollout.target.filter.combo.id"; + /** * Rollout action button id. */ - public static final String ROLLOUT_ACTION_BUTTON_ID = "rollout.action.button.id"; + public static final String ROLLOUT_ACTION_ID = "rollout.action.button.id"; + + /** + * Rollout start button id. + */ + public static final String ROLLOUT_RUN_BUTTON_ID = ROLLOUT_ACTION_ID + ".9"; + /** * Rollout pause button id. */ - public static final String ROLLOUT_PAUSE_BUTTON_ID = "rollout.pause.button.id"; + public static final String ROLLOUT_PAUSE_BUTTON_ID = ROLLOUT_ACTION_ID + ".10"; /** * Rollout resume button id. */ - public static final String ROLLOUT_RESUME_BUTTON_ID = "rollout.resume.button.id"; + public static final String ROLLOUT_UPDATE_BUTTON_ID = ROLLOUT_ACTION_ID + ".11"; /** * Rollout save or start option group id. diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java index e49ba76dc..2ee565bb1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java @@ -87,6 +87,11 @@ public final class SPUIDefinitions { */ public static final String ACTION_HIS_TBL_STATUS = "Status"; + /** + * Actions column. + */ + public static final String ACTIONS_COLUMN = "Actions"; + /** * Action history messages of particular action update. */ diff --git a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/rollout.scss b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/rollout.scss index b9049068e..d55d2eb2c 100644 --- a/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/rollout.scss +++ b/hawkbit-ui/src/main/resources/VAADIN/themes/hawkbit/customstyles/rollout.scss @@ -52,6 +52,10 @@ opacity: 0.5; } + .action-type-padding{ + padding: 0 0px !important; + } + .rollout-caption-links{ font-weight: 400; height: 25px ; diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index bcb0a3031..383341f4f 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -14,7 +14,6 @@ # Button names prefix with - button button.save = Save button.delete = Delete -button.discard = Discard button.discard.all = Discard All button.delete.all = Delete All button.assign.all = Save Assign diff --git a/hawkbit-ui/src/main/resources/messages_de.properties b/hawkbit-ui/src/main/resources/messages_de.properties index eded994a3..cec24e1d8 100644 --- a/hawkbit-ui/src/main/resources/messages_de.properties +++ b/hawkbit-ui/src/main/resources/messages_de.properties @@ -437,6 +437,14 @@ header.distributionset = Distribution set header.numberofgroups = No. of groups header.detail.status = Detail status header.total.targets = Total targets +header.type = Type +header.swmodules = SwModules +header.migrations.step=IsRequiredMigrationStep + +header.action=Actions +header.action.run=Run +header.action.pause=Pause +header.action.update=Edit header.rolloutgroup.installed.percentage = % Finished header.rolloutgroup.threshold.error = Error threshold diff --git a/hawkbit-ui/src/main/resources/messages_en.properties b/hawkbit-ui/src/main/resources/messages_en.properties index 438063131..dbb2b5c6f 100644 --- a/hawkbit-ui/src/main/resources/messages_en.properties +++ b/hawkbit-ui/src/main/resources/messages_en.properties @@ -434,11 +434,21 @@ header.distributionset = Distribution Set header.numberofgroups = No. of groups header.detail.status = Detail status header.total.targets = Total targets +header.type = Type +header.swmodules = SwModules +header.migrations.step=IsRequiredMigrationStep + +header.action=Actions +header.action.run=Run +header.action.pause=Pause +header.action.update=Edit header.rolloutgroup.installed.percentage = % Finished header.rolloutgroup.threshold.error = Error threshold header.rolloutgroup.threshold = Trigger threshold + + header.rolloutgroup.target.date = Date and time header.rolloutgroup.target.message = Messages