Feature download only (#810)
* Added initial version of DOWNLOAD_ONLY * Added DOWNLOAD_ONLY option to ActionTypeOptionGroupLayout * Removed DOWNLOAD_ONLY checkbox, added Download Only UI option * Mark actions that finished with DOWNLOADED as finished * initial changes to realize downoadOnly in UI * Changed method of disabling maintenanceWindow into smarter solution * Added new icon for download only option * Set DistributionSet as unassigned when DOWNLOAD_ONLY * Enabled update action status for DOWNLOAD_ONLY after download * Current state of abstraction task * Assign DistributionSet to target if target installs it after downloading * Abstracted class redundant methods * Added tests * Fixed Rollout finish status for DWONLOAD_ONLY Rollouts * Added Rollout type json property in test documentation * Added DOWNLOAD_ONLY test for target assignment * Added event listener also to DistributionTable * Fixed event listener problem * Change column name to "Type" and added also DownloadOnly icon to that column. * Cleanup * Center aligned the icons in type column * Fixed DistributionSet already assigned but not installed * Rename download_only to downloadonly * Further changes regarding center aligned the icons * Fixed target assign status in Rollout view when download_only * Fixed SonarQube issues * Fixed SonarQube issues + code formatting * Fixed Tests * Marked squid:S128 as suppressed - irrelevant * Adapting rollouts view by additional column (not finished by now) * Putted type column on proper position * Trying to display icons in new type column in rollouts view * Added icon also for soft, icon might change -> just change * createOptionGroup method in ActionTypeOptionGroupLayout class * added first draft of type column in rollouts view * increase visibility of sendUpdateMessageToTarget method * Ground functionality of new type column in deployment view is now implemented * Type column implementation in rollouts view is finished for now * Rebased on master * Fixed DurationControl change on ScheduleControl change. * (Re)Added Soft deployment Icon * Fixed SonarQube issues * Fixed SonarQube issues * Fixed failing test * Fixes + added missing header * Added message to the fail() instruction * Fixed copyright header * Apply suggestions from code review * Fixed TotalTargetCountStatus.java * Removed unused method from TotalTargetCountStatus.java * add id to rollout create and update UI popup * Added download_only tests for MgmtTargetResourceTest.java * added missing header in TotalTargetCountStatusTest.java * Rename because of newest changes * added Download_Only dmf integration tests * Renamed MgmtAction.forcedType to actionType * renamed actionType to forceType for Mgmt API * added missing javadocs for public methods * Added Download Only support for AutoAssignment Signed-off-by: Ahmed Sayed <ahmed.sayed@bosch-si.com> Signed-off-by: Ammar Bikic <ammar.bikic@bosch-si.com>
This commit is contained in:
@@ -134,7 +134,7 @@ public abstract class AbstractGrid<T extends Indexed> extends Grid implements Re
|
||||
setColumnProperties();
|
||||
setColumnHeaderNames();
|
||||
setColumnsHidable();
|
||||
addColumnRenderes();
|
||||
addColumnRenderers();
|
||||
setColumnExpandRatio();
|
||||
|
||||
setHiddenColumns();
|
||||
@@ -327,7 +327,7 @@ public abstract class AbstractGrid<T extends Indexed> extends Grid implements Re
|
||||
* Template method invoked by {@link #addNewContainerDS()} for adding
|
||||
* special column renderers if needed.
|
||||
*/
|
||||
protected abstract void addColumnRenderes();
|
||||
protected abstract void addColumnRenderers();
|
||||
|
||||
/**
|
||||
* Template method invoked by {@link #addNewContainerDS()} that hides
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
/**
|
||||
* 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.management;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.eclipse.hawkbit.repository.DeploymentManagement;
|
||||
import org.eclipse.hawkbit.repository.MaintenanceScheduleHelper;
|
||||
import org.eclipse.hawkbit.repository.exception.InvalidMaintenanceScheduleException;
|
||||
import org.eclipse.hawkbit.repository.model.Action.ActionType;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.RepositoryModelConstants;
|
||||
import org.eclipse.hawkbit.repository.model.TargetWithActionType;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.ConfirmationTab;
|
||||
import org.eclipse.hawkbit.ui.common.entity.DistributionSetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.entity.TargetIdName;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.SaveActionWindowEvent;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.AbstractActionTypeOptionGroupLayout;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.ActionTypeOptionGroupAssignmentLayout;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.MaintenanceWindowLayout;
|
||||
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
|
||||
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.vaadin.spring.events.EventBus.UIEventBus;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.vaadin.data.Property;
|
||||
import com.vaadin.ui.CheckBox;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Link;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Helper Class for Target Assignment Operations from the Deployment View
|
||||
*/
|
||||
public final class TargetAssignmentOperations {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(TargetAssignmentOperations.class);
|
||||
|
||||
private TargetAssignmentOperations() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Save all target(s)-distributionSet assignments
|
||||
*
|
||||
* @param managementUIState
|
||||
* the management UI state
|
||||
* @param actionTypeOptionGroupLayout
|
||||
* the action Type Option Group Layout
|
||||
* @param maintenanceWindowLayout
|
||||
* the Maintenance Window Layout
|
||||
* @param deploymentManagement
|
||||
* the Deployment Management
|
||||
* @param notification
|
||||
* the UI Notification
|
||||
* @param eventBus
|
||||
* the UI Event Bus
|
||||
* @param i18n
|
||||
* the Vaadin Message Source for multi language
|
||||
* @param eventSource
|
||||
* the source object for sending potential events
|
||||
*/
|
||||
public static void saveAllAssignments(final ManagementUIState managementUIState,
|
||||
final ActionTypeOptionGroupAssignmentLayout actionTypeOptionGroupLayout,
|
||||
final MaintenanceWindowLayout maintenanceWindowLayout, final DeploymentManagement deploymentManagement,
|
||||
final UINotification notification, final UIEventBus eventBus, final VaadinMessageSource i18n,
|
||||
final Object eventSource) {
|
||||
final Set<TargetIdName> itemIds = managementUIState.getAssignedList().keySet();
|
||||
Long distId;
|
||||
List<TargetIdName> targetIdSetList;
|
||||
List<TargetIdName> tempIdList;
|
||||
final ActionType actionType = ((AbstractActionTypeOptionGroupLayout.ActionTypeOption) actionTypeOptionGroupLayout
|
||||
.getActionTypeOptionGroup().getValue()).getActionType();
|
||||
final long forcedTimeStamp = actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.getValue() == AbstractActionTypeOptionGroupLayout.ActionTypeOption.AUTO_FORCED
|
||||
? actionTypeOptionGroupLayout.getForcedTimeDateField().getValue().getTime()
|
||||
: RepositoryModelConstants.NO_FORCE_TIME;
|
||||
|
||||
final Map<Long, List<TargetIdName>> saveAssignedList = Maps.newHashMapWithExpectedSize(itemIds.size());
|
||||
|
||||
for (final TargetIdName itemId : itemIds) {
|
||||
final DistributionSetIdName distitem = managementUIState.getAssignedList().get(itemId);
|
||||
distId = distitem.getId();
|
||||
|
||||
if (saveAssignedList.containsKey(distId)) {
|
||||
targetIdSetList = saveAssignedList.get(distId);
|
||||
} else {
|
||||
targetIdSetList = new ArrayList<>();
|
||||
}
|
||||
targetIdSetList.add(itemId);
|
||||
saveAssignedList.put(distId, targetIdSetList);
|
||||
}
|
||||
|
||||
final String maintenanceSchedule = maintenanceWindowLayout.getMaintenanceSchedule();
|
||||
final String maintenanceDuration = maintenanceWindowLayout.getMaintenanceDuration();
|
||||
final String maintenanceTimeZone = maintenanceWindowLayout.getMaintenanceTimeZone();
|
||||
|
||||
for (final Map.Entry<Long, List<TargetIdName>> mapEntry : saveAssignedList.entrySet()) {
|
||||
tempIdList = saveAssignedList.get(mapEntry.getKey());
|
||||
final DistributionSetAssignmentResult distributionSetAssignmentResult = deploymentManagement
|
||||
.assignDistributionSet(mapEntry.getKey(),
|
||||
tempIdList.stream().map(t -> maintenanceWindowLayout.isEnabled()
|
||||
? new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp,
|
||||
maintenanceSchedule, maintenanceDuration, maintenanceTimeZone)
|
||||
: new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp))
|
||||
.collect(Collectors.toList()));
|
||||
if (distributionSetAssignmentResult.getAssigned() > 0) {
|
||||
notification.displaySuccess(
|
||||
i18n.getMessage("message.target.assignment", distributionSetAssignmentResult.getAssigned()));
|
||||
}
|
||||
if (distributionSetAssignmentResult.getAlreadyAssigned() > 0) {
|
||||
notification.displaySuccess(i18n.getMessage("message.target.alreadyAssigned",
|
||||
distributionSetAssignmentResult.getAlreadyAssigned()));
|
||||
}
|
||||
}
|
||||
refreshPinnedDetails(saveAssignedList, managementUIState, eventBus, eventSource);
|
||||
managementUIState.getAssignedList().clear();
|
||||
notification.displaySuccess(i18n.getMessage("message.target.ds.assign.success"));
|
||||
eventBus.publish(eventSource, SaveActionWindowEvent.SAVED_ASSIGNMENTS);
|
||||
}
|
||||
|
||||
private static void refreshPinnedDetails(final Map<Long, List<TargetIdName>> saveAssignedList,
|
||||
final ManagementUIState managementUIState, final UIEventBus eventBus, final Object eventSource) {
|
||||
final Optional<Long> pinnedDist = managementUIState.getTargetTableFilters().getPinnedDistId();
|
||||
final Optional<TargetIdName> pinnedTarget = managementUIState.getDistributionTableFilters().getPinnedTarget();
|
||||
|
||||
if (pinnedDist.isPresent()) {
|
||||
if (saveAssignedList.keySet().contains(pinnedDist.get())) {
|
||||
eventBus.publish(eventSource, PinUnpinEvent.PIN_DISTRIBUTION);
|
||||
}
|
||||
} else if (pinnedTarget.isPresent()) {
|
||||
final Set<TargetIdName> assignedTargetIds = managementUIState.getAssignedList().keySet();
|
||||
if (assignedTargetIds.contains(pinnedTarget.get())) {
|
||||
eventBus.publish(eventSource, PinUnpinEvent.PIN_TARGET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check wether the maintenance window is valid or not
|
||||
*
|
||||
* @param maintenanceWindowLayout
|
||||
* the maintenance window layout
|
||||
* @param notification
|
||||
* the UI Notification
|
||||
* @return boolean if maintenance window is valid or not
|
||||
*/
|
||||
public static boolean isMaintenanceWindowValid(final MaintenanceWindowLayout maintenanceWindowLayout,
|
||||
final UINotification notification) {
|
||||
if (maintenanceWindowLayout.isEnabled()) {
|
||||
try {
|
||||
MaintenanceScheduleHelper.validateMaintenanceSchedule(maintenanceWindowLayout.getMaintenanceSchedule(),
|
||||
maintenanceWindowLayout.getMaintenanceDuration(),
|
||||
maintenanceWindowLayout.getMaintenanceTimeZone());
|
||||
} catch (final InvalidMaintenanceScheduleException e) {
|
||||
LOG.error("Maintenance window is not valid", e);
|
||||
notification.displayValidationError(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the Assignment Confirmation Tab
|
||||
*
|
||||
* @param actionTypeOptionGroupLayout
|
||||
* the action Type Option Group Layout
|
||||
* @param maintenanceWindowLayout
|
||||
* the Maintenance Window Layout
|
||||
* @param saveButtonToggle
|
||||
* The event listener to derimne if save button should be enabled or not
|
||||
* @param i18n
|
||||
* the Vaadin Message Source for multi language
|
||||
* @param uiProperties
|
||||
* the UI Properties
|
||||
* @return the Assignment Confirmation tab
|
||||
*/
|
||||
public static ConfirmationTab createAssignmentTab(
|
||||
final ActionTypeOptionGroupAssignmentLayout actionTypeOptionGroupLayout,
|
||||
final MaintenanceWindowLayout maintenanceWindowLayout, final Consumer<Boolean> saveButtonToggle,
|
||||
final VaadinMessageSource i18n, final UiProperties uiProperties) {
|
||||
|
||||
final CheckBox maintenanceWindowControl = maintenanceWindowControl(i18n, maintenanceWindowLayout,
|
||||
saveButtonToggle);
|
||||
final Link maintenanceWindowHelpLink = maintenanceWindowHelpLinkControl(uiProperties, i18n);
|
||||
final HorizontalLayout layout = createHorizontalLayout(maintenanceWindowControl, maintenanceWindowHelpLink);
|
||||
actionTypeOptionGroupLayout.selectDefaultOption();
|
||||
|
||||
initMaintenanceWindow(maintenanceWindowLayout, saveButtonToggle);
|
||||
addValueChangeListener(actionTypeOptionGroupLayout, maintenanceWindowControl, maintenanceWindowHelpLink);
|
||||
return createAssignmentTab(actionTypeOptionGroupLayout, layout, maintenanceWindowLayout);
|
||||
}
|
||||
|
||||
private static HorizontalLayout createHorizontalLayout(final CheckBox maintenanceWindowControl,
|
||||
final Link maintenanceWindowHelpLink) {
|
||||
final HorizontalLayout layout = new HorizontalLayout();
|
||||
layout.addComponent(maintenanceWindowControl);
|
||||
layout.addComponent(maintenanceWindowHelpLink);
|
||||
return layout;
|
||||
}
|
||||
|
||||
private static ConfirmationTab createAssignmentTab(
|
||||
final ActionTypeOptionGroupAssignmentLayout actionTypeOptionGroupLayout, final HorizontalLayout layout,
|
||||
final MaintenanceWindowLayout maintenanceWindowLayout) {
|
||||
final ConfirmationTab assignmentTab = new ConfirmationTab();
|
||||
assignmentTab.addComponent(actionTypeOptionGroupLayout);
|
||||
assignmentTab.addComponent(layout);
|
||||
assignmentTab.addComponent(maintenanceWindowLayout);
|
||||
return assignmentTab;
|
||||
}
|
||||
|
||||
private static void initMaintenanceWindow(final MaintenanceWindowLayout maintenanceWindowLayout,
|
||||
final Consumer<Boolean> saveButtonToggle) {
|
||||
maintenanceWindowLayout.setVisible(false);
|
||||
maintenanceWindowLayout.setEnabled(false);
|
||||
maintenanceWindowLayout.getScheduleControl().addTextChangeListener(
|
||||
event -> saveButtonToggle.accept(maintenanceWindowLayout.onScheduleChange(event)));
|
||||
maintenanceWindowLayout.getDurationControl().addTextChangeListener(
|
||||
event -> saveButtonToggle.accept(maintenanceWindowLayout.onDurationChange(event)));
|
||||
}
|
||||
|
||||
private static CheckBox maintenanceWindowControl(final VaadinMessageSource i18n,
|
||||
final MaintenanceWindowLayout maintenanceWindowLayout, final Consumer<Boolean> saveButtonToggle) {
|
||||
final CheckBox enableMaintenanceWindow = new CheckBox(i18n.getMessage("caption.maintenancewindow.enabled"));
|
||||
enableMaintenanceWindow.setId(UIComponentIdProvider.MAINTENANCE_WINDOW_ENABLED_ID);
|
||||
enableMaintenanceWindow.addStyleName(ValoTheme.CHECKBOX_SMALL);
|
||||
enableMaintenanceWindow.addStyleName("dist-window-maintenance-window-enable");
|
||||
enableMaintenanceWindow.addValueChangeListener(event -> {
|
||||
final Boolean isMaintenanceWindowEnabled = enableMaintenanceWindow.getValue();
|
||||
maintenanceWindowLayout.setVisible(isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.setEnabled(isMaintenanceWindowEnabled);
|
||||
saveButtonToggle.accept(!isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.clearAllControls();
|
||||
});
|
||||
return enableMaintenanceWindow;
|
||||
}
|
||||
|
||||
private static void addValueChangeListener(final ActionTypeOptionGroupAssignmentLayout actionTypeOptionGroupLayout,
|
||||
final CheckBox enableMaintenanceWindowControl, final Link maintenanceWindowHelpLinkControl) {
|
||||
actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.addValueChangeListener(new Property.ValueChangeListener() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public void valueChange(final Property.ValueChangeEvent event) {
|
||||
if (event.getProperty().getValue()
|
||||
.equals(AbstractActionTypeOptionGroupLayout.ActionTypeOption.DOWNLOAD_ONLY)) {
|
||||
enableMaintenanceWindowControl.setValue(false);
|
||||
enableMaintenanceWindowControl.setEnabled(false);
|
||||
maintenanceWindowHelpLinkControl.setEnabled(false);
|
||||
|
||||
} else {
|
||||
enableMaintenanceWindowControl.setEnabled(true);
|
||||
maintenanceWindowHelpLinkControl.setEnabled(true);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static Link maintenanceWindowHelpLinkControl(final UiProperties uiProperties,
|
||||
final VaadinMessageSource i18n) {
|
||||
final String maintenanceWindowHelpUrl = uiProperties.getLinks().getDocumentation().getMaintenanceWindowView();
|
||||
return SPUIComponentProvider.getHelpLink(i18n, maintenanceWindowHelpUrl);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -69,8 +69,10 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
private static final String STATUS_ICON_NEUTRAL = "statusIconNeutral";
|
||||
private static final String STATUS_ICON_ACTIVE = "statusIconActive";
|
||||
private static final String STATUS_ICON_FORCED = "statusIconForced";
|
||||
private static final String STATUS_ICON_DOWNLOAD_ONLY = "statusIconDownloadOnly";
|
||||
private static final String STATUS_ICON_SOFT = "statusIconSoft";
|
||||
|
||||
private static final String VIRT_PROP_FORCED = "forced";
|
||||
private static final String VIRT_PROP_TYPE = "type";
|
||||
private static final String VIRT_PROP_TIMEFORCED = "timeForced";
|
||||
private static final String VIRT_PROP_ACTION_CANCEL = "cancel-action";
|
||||
private static final String VIRT_PROP_ACTION_FORCE = "force-action";
|
||||
@@ -79,20 +81,20 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
private static final Object[] maxColumnOrder = new Object[] { ProxyAction.PXY_ACTION_IS_ACTIVE_DECO,
|
||||
ProxyAction.PXY_ACTION_ID, ProxyAction.PXY_ACTION_DS_NAME_VERSION, ProxyAction.PXY_ACTION_LAST_MODIFIED_AT,
|
||||
ProxyAction.PXY_ACTION_STATUS, ProxyAction.PXY_ACTION_MAINTENANCE_WINDOW,
|
||||
ProxyAction.PXY_ACTION_ROLLOUT_NAME, VIRT_PROP_FORCED, VIRT_PROP_TIMEFORCED, VIRT_PROP_ACTION_CANCEL,
|
||||
ProxyAction.PXY_ACTION_ROLLOUT_NAME, VIRT_PROP_TYPE, VIRT_PROP_TIMEFORCED, VIRT_PROP_ACTION_CANCEL,
|
||||
VIRT_PROP_ACTION_FORCE, VIRT_PROP_ACTION_FORCE_QUIT };
|
||||
|
||||
private static final Object[] minColumnOrder = new Object[] { ProxyAction.PXY_ACTION_IS_ACTIVE_DECO,
|
||||
ProxyAction.PXY_ACTION_DS_NAME_VERSION, ProxyAction.PXY_ACTION_LAST_MODIFIED_AT,
|
||||
ProxyAction.PXY_ACTION_STATUS, ProxyAction.PXY_ACTION_MAINTENANCE_WINDOW, VIRT_PROP_FORCED,
|
||||
ProxyAction.PXY_ACTION_STATUS, ProxyAction.PXY_ACTION_MAINTENANCE_WINDOW, VIRT_PROP_TYPE,
|
||||
VIRT_PROP_TIMEFORCED, VIRT_PROP_ACTION_CANCEL, VIRT_PROP_ACTION_FORCE, VIRT_PROP_ACTION_FORCE_QUIT };
|
||||
|
||||
private static final String[] leftAlignedColumns = new String[] { VIRT_PROP_TIMEFORCED };
|
||||
private static final String[] leftAlignedColumns = new String[] {};
|
||||
|
||||
private static final String[] centerAlignedColumns = new String[] { ProxyAction.PXY_ACTION_IS_ACTIVE_DECO,
|
||||
ProxyAction.PXY_ACTION_STATUS };
|
||||
ProxyAction.PXY_ACTION_STATUS, VIRT_PROP_TYPE, ProxyAction.PXY_ACTION_ID, VIRT_PROP_TIMEFORCED };
|
||||
|
||||
private static final String[] rightAlignedColumns = new String[] { VIRT_PROP_FORCED, ProxyAction.PXY_ACTION_ID };
|
||||
private static final String[] rightAlignedColumns = new String[] {};
|
||||
|
||||
private final transient DeploymentManagement deploymentManagement;
|
||||
private final UINotification notification;
|
||||
@@ -107,19 +109,7 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
private final BeanQueryFactory<ActionBeanQuery> targetQF = new BeanQueryFactory<>(ActionBeanQuery.class);
|
||||
|
||||
boolean forceClientRefreshToggle = true;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param i18n
|
||||
* @param deploymentManagement
|
||||
* @param eventBus
|
||||
* @param notification
|
||||
* @param managementUIState
|
||||
* @param permissionChecker
|
||||
*/
|
||||
protected ActionHistoryGrid(final VaadinMessageSource i18n, final DeploymentManagement deploymentManagement,
|
||||
ActionHistoryGrid(final VaadinMessageSource i18n, final DeploymentManagement deploymentManagement,
|
||||
final UIEventBus eventBus, final UINotification notification, final ManagementUIState managementUIState,
|
||||
final SpPermissionChecker permissionChecker) {
|
||||
super(i18n, eventBus, permissionChecker);
|
||||
@@ -220,14 +210,14 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
getColumn(ProxyAction.PXY_ACTION_LAST_MODIFIED_AT).setConverter(new LongToFormattedDateStringConverter());
|
||||
getColumn(ProxyAction.PXY_ACTION_STATUS).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlStatusLabelConverter(this::createStatusLabelMetadata));
|
||||
getColumn(ProxyAction.PXY_ACTION_IS_ACTIVE_DECO).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlIsActiveLabelConverter(this::createIsActiveLabelMetadata));
|
||||
getColumn(VIRT_PROP_FORCED).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlVirtPropLabelConverter(this::createForcedLabelMetadata));
|
||||
getColumn(VIRT_PROP_TYPE).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlVirtPropLabelConverter(this::createTypeLabelMetadata));
|
||||
getColumn(VIRT_PROP_TIMEFORCED).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlVirtPropLabelConverter(this::createTimeForcedLabelMetadata));
|
||||
getColumn(VIRT_PROP_ACTION_CANCEL).setRenderer(
|
||||
@@ -270,14 +260,23 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
return activeStates.get(isActiveDeco);
|
||||
}
|
||||
|
||||
private StatusFontIcon createForcedLabelMetadata(final Action action) {
|
||||
StatusFontIcon result = null;
|
||||
private StatusFontIcon createTypeLabelMetadata(final Action action) {
|
||||
if (ActionType.FORCED.equals(action.getActionType()) || ActionType.TIMEFORCED.equals(action.getActionType())) {
|
||||
result = new StatusFontIcon(FontAwesome.BOLT, STATUS_ICON_FORCED,
|
||||
return new StatusFontIcon(FontAwesome.BOLT, STATUS_ICON_FORCED,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_FORCED),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_FORCED_LABEL_ID);
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
return result;
|
||||
if (ActionType.SOFT.equals(action.getActionType())) {
|
||||
return new StatusFontIcon(FontAwesome.STEP_FORWARD, STATUS_ICON_SOFT,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_SOFT),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
if (ActionType.DOWNLOAD_ONLY.equals(action.getActionType())) {
|
||||
return new StatusFontIcon(FontAwesome.DOWNLOAD, STATUS_ICON_DOWNLOAD_ONLY,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_DOWNLOAD_ONLY),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private StatusFontIcon createTimeForcedLabelMetadata(final Action action) {
|
||||
@@ -408,9 +407,6 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
eventBus.publish(this, PinUnpinEvent.PIN_TARGET);
|
||||
}
|
||||
});
|
||||
if (!managementUIState.getDistributionTableFilters().getPinnedTarget().isPresent()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// service call to cancel the active action
|
||||
@@ -443,7 +439,7 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
@Override
|
||||
protected void setHiddenColumns() {
|
||||
getColumn(VIRT_PROP_FORCED).setHidable(false);
|
||||
getColumn(VIRT_PROP_TYPE).setHidable(false);
|
||||
getColumn(VIRT_PROP_TIMEFORCED).setHidable(false);
|
||||
getColumn(VIRT_PROP_ACTION_CANCEL).setHidable(false);
|
||||
getColumn(VIRT_PROP_ACTION_FORCE).setHidable(false);
|
||||
@@ -470,10 +466,8 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
getColumn(ProxyAction.PXY_ACTION_STATUS).setHeaderCaption(i18n.getMessage("header.status"));
|
||||
getColumn(ProxyAction.PXY_ACTION_MAINTENANCE_WINDOW)
|
||||
.setHeaderCaption(i18n.getMessage("header.maintenancewindow"));
|
||||
getColumn(VIRT_PROP_FORCED).setHeaderCaption(String.valueOf(forceClientRefreshToggle));
|
||||
forceClientRefreshToggle = !forceClientRefreshToggle;
|
||||
|
||||
newHeaderRow.join(VIRT_PROP_FORCED, VIRT_PROP_TIMEFORCED).setText(i18n.getMessage("label.action.forced"));
|
||||
newHeaderRow.join(VIRT_PROP_TYPE, VIRT_PROP_TIMEFORCED).setText(i18n.getMessage("label.action.type"));
|
||||
newHeaderRow.join(VIRT_PROP_ACTION_CANCEL, VIRT_PROP_ACTION_FORCE, VIRT_PROP_ACTION_FORCE_QUIT)
|
||||
.setText(i18n.getMessage("header.action"));
|
||||
}
|
||||
@@ -485,7 +479,7 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
setColumnsSize(100.0, 130.0, ProxyAction.PXY_ACTION_LAST_MODIFIED_AT);
|
||||
setColumnsSize(53.0, 55.0, ProxyAction.PXY_ACTION_STATUS);
|
||||
setColumnsSize(150.0, 200.0, ProxyAction.PXY_ACTION_MAINTENANCE_WINDOW);
|
||||
setColumnsSize(FIXED_PIX_MIN, FIXED_PIX_MIN, VIRT_PROP_FORCED, VIRT_PROP_TIMEFORCED, VIRT_PROP_ACTION_CANCEL,
|
||||
setColumnsSize(FIXED_PIX_MIN, FIXED_PIX_MIN, VIRT_PROP_TYPE, VIRT_PROP_TIMEFORCED, VIRT_PROP_ACTION_CANCEL,
|
||||
VIRT_PROP_ACTION_FORCE, VIRT_PROP_ACTION_FORCE_QUIT);
|
||||
}
|
||||
|
||||
@@ -569,7 +563,7 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
protected GeneratedPropertyContainer addGeneratedContainerProperties() {
|
||||
final GeneratedPropertyContainer decoratedContainer = getDecoratedContainer();
|
||||
|
||||
decoratedContainer.addGeneratedProperty(VIRT_PROP_FORCED, new GenericPropertyValueGenerator());
|
||||
decoratedContainer.addGeneratedProperty(VIRT_PROP_TYPE, new GenericPropertyValueGenerator());
|
||||
decoratedContainer.addGeneratedProperty(VIRT_PROP_TIMEFORCED, new GenericPropertyValueGenerator());
|
||||
decoratedContainer.addGeneratedProperty(VIRT_PROP_ACTION_CANCEL, new GenericPropertyValueGenerator());
|
||||
decoratedContainer.addGeneratedProperty(VIRT_PROP_ACTION_FORCE, new GenericPropertyValueGenerator());
|
||||
@@ -622,7 +616,7 @@ public class ActionHistoryGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
setColumnsSize(107.0, 500.0, ProxyAction.PXY_ACTION_DS_NAME_VERSION);
|
||||
setColumnsSize(100.0, 150.0, ProxyAction.PXY_ACTION_LAST_MODIFIED_AT);
|
||||
setColumnsSize(53.0, 55.0, ProxyAction.PXY_ACTION_STATUS);
|
||||
setColumnsSize(FIXED_PIX_MIN, FIXED_PIX_MAX, VIRT_PROP_FORCED, VIRT_PROP_TIMEFORCED,
|
||||
setColumnsSize(FIXED_PIX_MIN, FIXED_PIX_MAX, VIRT_PROP_TYPE, VIRT_PROP_TIMEFORCED,
|
||||
VIRT_PROP_ACTION_CANCEL, VIRT_PROP_ACTION_FORCE, VIRT_PROP_ACTION_FORCE_QUIT);
|
||||
setColumnsSize(FIXED_PIX_MIN, 500.0, ProxyAction.PXY_ACTION_ROLLOUT_NAME);
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public class ActionStatusGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
getColumn(ProxyActionStatus.PXY_AS_STATUS).setRenderer(new HtmlLabelRenderer(),
|
||||
new HtmlStatusLabelConverter(this::createStatusLabelMetadata));
|
||||
getColumn(ProxyActionStatus.PXY_AS_CREATED_AT).setConverter(new LongToFormattedDateStringConverter());
|
||||
|
||||
@@ -146,7 +146,7 @@ public class ActionStatusMsgGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
// no specific column renderers
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.management.dstable;
|
||||
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.createAssignmentTab;
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.isMaintenanceWindowValid;
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.saveAllAssignments;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -18,27 +22,21 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.eclipse.hawkbit.im.authentication.SpPermission;
|
||||
import org.eclipse.hawkbit.repository.DeploymentManagement;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.MaintenanceScheduleHelper;
|
||||
import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.repository.TargetTagManagement;
|
||||
import org.eclipse.hawkbit.repository.event.remote.entity.DistributionSetUpdatedEvent;
|
||||
import org.eclipse.hawkbit.repository.exception.InvalidMaintenanceScheduleException;
|
||||
import org.eclipse.hawkbit.repository.model.Action.ActionType;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.RepositoryModelConstants;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.repository.model.TargetWithActionType;
|
||||
import org.eclipse.hawkbit.ui.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
|
||||
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.ConfirmationTab;
|
||||
import org.eclipse.hawkbit.ui.common.entity.DistributionSetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.entity.TargetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable;
|
||||
@@ -49,8 +47,6 @@ import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.RefreshDistributionTableByFilterEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.SaveActionWindowEvent;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.AbstractActionTypeOptionGroupLayout.ActionTypeOption;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.ActionTypeOptionGroupAssignmentLayout;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.MaintenanceWindowLayout;
|
||||
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
|
||||
@@ -66,8 +62,6 @@ import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
|
||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
|
||||
import org.eclipse.hawkbit.ui.view.filter.OnlyEventsFromDeploymentViewFilter;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
@@ -86,13 +80,9 @@ import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
|
||||
import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.Button.ClickEvent;
|
||||
import com.vaadin.ui.CheckBox;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Link;
|
||||
import com.vaadin.ui.Table;
|
||||
import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
|
||||
/**
|
||||
* Distribution set table which is shown on the Deployment View.
|
||||
@@ -101,8 +91,6 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(DistributionTable.class);
|
||||
|
||||
private final SpPermissionChecker permissionChecker;
|
||||
|
||||
private final ManagementUIState managementUIState;
|
||||
@@ -470,12 +458,19 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
|
||||
confirmDialog = new ConfirmationDialog(getI18n().getMessage(CAPTION_ENTITY_ASSIGN_ACTION_CONFIRMBOX),
|
||||
confirmQuestion, getI18n().getMessage(UIMessageIdProvider.BUTTON_OK),
|
||||
getI18n().getMessage(UIMessageIdProvider.BUTTON_CANCEL), ok -> {
|
||||
if (ok && isMaintenanceWindowValid()) {
|
||||
saveAllAssignments();
|
||||
if (ok && isMaintenanceWindowValid(maintenanceWindowLayout, getNotification())) {
|
||||
saveAllAssignments(managementUIState, actionTypeOptionGroupLayout, maintenanceWindowLayout,
|
||||
deploymentManagement, getNotification(), getEventBus(), getI18n(), this);
|
||||
} else {
|
||||
managementUIState.getAssignedList().clear();
|
||||
}
|
||||
}, createAssignmentTab(), UIComponentIdProvider.DIST_SET_TO_TARGET_ASSIGNMENT_CONFIRM_ID);
|
||||
}, createAssignmentTab(actionTypeOptionGroupLayout, maintenanceWindowLayout, saveButtonToggle(),
|
||||
getI18n(), uiProperties),
|
||||
UIComponentIdProvider.DIST_SET_TO_TARGET_ASSIGNMENT_CONFIRM_ID);
|
||||
}
|
||||
|
||||
private Consumer<Boolean> saveButtonToggle() {
|
||||
return isEnabled -> confirmDialog.getOkButton().setEnabled(isEnabled);
|
||||
}
|
||||
|
||||
private String createConfirmationQuestionForAssignment(final String distributionNameToAssign,
|
||||
@@ -489,145 +484,6 @@ public class DistributionTable extends AbstractNamedVersionTable<DistributionSet
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isMaintenanceWindowValid() {
|
||||
if (maintenanceWindowLayout.isEnabled()) {
|
||||
try {
|
||||
MaintenanceScheduleHelper.validateMaintenanceSchedule(maintenanceWindowLayout.getMaintenanceSchedule(),
|
||||
maintenanceWindowLayout.getMaintenanceDuration(),
|
||||
maintenanceWindowLayout.getMaintenanceTimeZone());
|
||||
} catch (final InvalidMaintenanceScheduleException e) {
|
||||
LOG.error("Maintenance window is not valid", e);
|
||||
getNotification().displayValidationError(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void saveAllAssignments() {
|
||||
final Set<TargetIdName> itemIds = managementUIState.getAssignedList().keySet();
|
||||
Long distId;
|
||||
List<TargetIdName> targetIdSetList;
|
||||
List<TargetIdName> tempIdList;
|
||||
final ActionType actionType = ((ActionTypeOption) actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.getValue()).getActionType();
|
||||
final long forcedTimeStamp = (((ActionTypeOption) actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.getValue()) == ActionTypeOption.AUTO_FORCED)
|
||||
? actionTypeOptionGroupLayout.getForcedTimeDateField().getValue().getTime()
|
||||
: RepositoryModelConstants.NO_FORCE_TIME;
|
||||
|
||||
final Map<Long, List<TargetIdName>> saveAssignedList = Maps.newHashMapWithExpectedSize(itemIds.size());
|
||||
|
||||
for (final TargetIdName itemId : itemIds) {
|
||||
final DistributionSetIdName distitem = managementUIState.getAssignedList().get(itemId);
|
||||
distId = distitem.getId();
|
||||
|
||||
if (saveAssignedList.containsKey(distId)) {
|
||||
targetIdSetList = saveAssignedList.get(distId);
|
||||
} else {
|
||||
targetIdSetList = new ArrayList<>();
|
||||
}
|
||||
targetIdSetList.add(itemId);
|
||||
saveAssignedList.put(distId, targetIdSetList);
|
||||
}
|
||||
|
||||
final String maintenanceSchedule = maintenanceWindowLayout.getMaintenanceSchedule();
|
||||
final String maintenanceDuration = maintenanceWindowLayout.getMaintenanceDuration();
|
||||
final String maintenanceTimeZone = maintenanceWindowLayout.getMaintenanceTimeZone();
|
||||
|
||||
for (final Map.Entry<Long, List<TargetIdName>> mapEntry : saveAssignedList.entrySet()) {
|
||||
tempIdList = saveAssignedList.get(mapEntry.getKey());
|
||||
final DistributionSetAssignmentResult distributionSetAssignmentResult = deploymentManagement
|
||||
.assignDistributionSet(mapEntry.getKey(),
|
||||
tempIdList.stream().map(t -> maintenanceWindowLayout.isEnabled()
|
||||
? new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp,
|
||||
maintenanceSchedule, maintenanceDuration, maintenanceTimeZone)
|
||||
: new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp))
|
||||
.collect(Collectors.toList()));
|
||||
|
||||
if (distributionSetAssignmentResult.getAssigned() > 0) {
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.assignment",
|
||||
distributionSetAssignmentResult.getAssigned()));
|
||||
}
|
||||
if (distributionSetAssignmentResult.getAlreadyAssigned() > 0) {
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.alreadyAssigned",
|
||||
distributionSetAssignmentResult.getAlreadyAssigned()));
|
||||
}
|
||||
}
|
||||
resfreshPinnedDetails(saveAssignedList);
|
||||
|
||||
managementUIState.getAssignedList().clear();
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.ds.assign.success"));
|
||||
getEventBus().publish(this, SaveActionWindowEvent.SAVED_ASSIGNMENTS);
|
||||
}
|
||||
|
||||
private void resfreshPinnedDetails(final Map<Long, List<TargetIdName>> saveAssignedList) {
|
||||
final Optional<Long> pinnedDist = managementUIState.getTargetTableFilters().getPinnedDistId();
|
||||
final Optional<TargetIdName> pinnedTarget = managementUIState.getDistributionTableFilters().getPinnedTarget();
|
||||
|
||||
if (pinnedDist.isPresent()) {
|
||||
if (saveAssignedList.keySet().contains(pinnedDist.get())) {
|
||||
getEventBus().publish(this, PinUnpinEvent.PIN_DISTRIBUTION);
|
||||
}
|
||||
} else if (pinnedTarget.isPresent()) {
|
||||
final Set<TargetIdName> assignedTargetIds = managementUIState.getAssignedList().keySet();
|
||||
if (assignedTargetIds.contains(pinnedTarget.get())) {
|
||||
getEventBus().publish(this, PinUnpinEvent.PIN_TARGET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ConfirmationTab createAssignmentTab() {
|
||||
final ConfirmationTab assignmentTab = new ConfirmationTab();
|
||||
actionTypeOptionGroupLayout.selectDefaultOption();
|
||||
assignmentTab.addComponent(actionTypeOptionGroupLayout);
|
||||
assignmentTab.addComponent(enableMaintenanceWindowLayout());
|
||||
initMaintenanceWindow();
|
||||
assignmentTab.addComponent(maintenanceWindowLayout);
|
||||
return assignmentTab;
|
||||
}
|
||||
|
||||
private HorizontalLayout enableMaintenanceWindowLayout() {
|
||||
final HorizontalLayout layout = new HorizontalLayout();
|
||||
layout.addComponent(enableMaintenanceWindowControl());
|
||||
layout.addComponent(maintenanceWindowHelpLinkControl());
|
||||
return layout;
|
||||
}
|
||||
|
||||
private CheckBox enableMaintenanceWindowControl() {
|
||||
final CheckBox enableMaintenanceWindow = new CheckBox(
|
||||
getI18n().getMessage("caption.maintenancewindow.enabled"));
|
||||
enableMaintenanceWindow.setId(UIComponentIdProvider.MAINTENANCE_WINDOW_ENABLED_ID);
|
||||
enableMaintenanceWindow.addStyleName(ValoTheme.CHECKBOX_SMALL);
|
||||
enableMaintenanceWindow.addStyleName("dist-window-maintenance-window-enable");
|
||||
enableMaintenanceWindow.addValueChangeListener(event -> {
|
||||
final Boolean isMaintenanceWindowEnabled = enableMaintenanceWindow.getValue();
|
||||
maintenanceWindowLayout.setVisible(isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.setEnabled(isMaintenanceWindowEnabled);
|
||||
enableSaveButton(!isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.clearAllControls();
|
||||
});
|
||||
return enableMaintenanceWindow;
|
||||
}
|
||||
|
||||
private Link maintenanceWindowHelpLinkControl() {
|
||||
final String maintenanceWindowHelpUrl = uiProperties.getLinks().getDocumentation().getMaintenanceWindowView();
|
||||
return SPUIComponentProvider.getHelpLink(getI18n(), maintenanceWindowHelpUrl);
|
||||
}
|
||||
|
||||
private void initMaintenanceWindow() {
|
||||
maintenanceWindowLayout.setVisible(false);
|
||||
maintenanceWindowLayout.setEnabled(false);
|
||||
maintenanceWindowLayout.getScheduleControl()
|
||||
.addTextChangeListener(event -> enableSaveButton(maintenanceWindowLayout.onScheduleChange(event)));
|
||||
maintenanceWindowLayout.getDurationControl()
|
||||
.addTextChangeListener(event -> enableSaveButton(maintenanceWindowLayout.onDurationChange(event)));
|
||||
}
|
||||
|
||||
private void enableSaveButton(final boolean enabled) {
|
||||
confirmDialog.getOkButton().setEnabled(enabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> hasMissingPermissionsForDrop() {
|
||||
return permissionChecker.hasUpdateTargetPermission() ? Collections.emptyList()
|
||||
|
||||
@@ -78,9 +78,25 @@ public abstract class AbstractActionTypeOptionGroupLayout extends HorizontalLayo
|
||||
softLabel.setCaption(i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_SOFT));
|
||||
softLabel.setDescription(i18n.getMessage(UIMessageIdProvider.TOOLTIP_SOFT_ITEM));
|
||||
softLabel.setStyleName("padding-right-style");
|
||||
softLabel.setIcon(FontAwesome.STEP_FORWARD);
|
||||
addComponent(softLabel);
|
||||
}
|
||||
|
||||
protected void addDownloadOnlyItemWithLabel() {
|
||||
final FlexibleOptionGroupItemComponent downloadOnlyItem = actionTypeOptionGroup
|
||||
.getItemComponent(ActionTypeOption.DOWNLOAD_ONLY);
|
||||
downloadOnlyItem.setId(UIComponentIdProvider.ACTION_DETAILS_DOWNLOAD_ONLY_ID);
|
||||
downloadOnlyItem.setStyleName(STYLE_DIST_WINDOW_ACTIONTYPE);
|
||||
addComponent(downloadOnlyItem);
|
||||
final Label downloadOnlyLabel = new Label();
|
||||
downloadOnlyLabel.setSizeFull();
|
||||
downloadOnlyLabel.setCaption(i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_DOWNLOAD_ONLY));
|
||||
downloadOnlyLabel.setDescription(i18n.getMessage(UIMessageIdProvider.TOOLTIP_DOWNLOAD_ONLY_ITEM));
|
||||
downloadOnlyLabel.setStyleName("padding-right-style");
|
||||
downloadOnlyLabel.setIcon(FontAwesome.DOWNLOAD);
|
||||
addComponent(downloadOnlyLabel);
|
||||
}
|
||||
|
||||
/**
|
||||
* To Set Default option for save.
|
||||
*/
|
||||
@@ -93,7 +109,8 @@ public abstract class AbstractActionTypeOptionGroupLayout extends HorizontalLayo
|
||||
*
|
||||
*/
|
||||
public enum ActionTypeOption {
|
||||
FORCED(ActionType.FORCED), SOFT(ActionType.SOFT), AUTO_FORCED(ActionType.TIMEFORCED);
|
||||
FORCED(ActionType.FORCED), SOFT(ActionType.SOFT), AUTO_FORCED(ActionType.TIMEFORCED),
|
||||
DOWNLOAD_ONLY(ActionType.DOWNLOAD_ONLY);
|
||||
|
||||
private final ActionType actionType;
|
||||
|
||||
|
||||
@@ -70,13 +70,17 @@ public class ActionTypeOptionGroupAssignmentLayout extends AbstractActionTypeOpt
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.SOFT);
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.FORCED);
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.AUTO_FORCED);
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.DOWNLOAD_ONLY);
|
||||
selectDefaultOption();
|
||||
|
||||
addForcedItemWithLabel();
|
||||
addSoftItemWithLabel();
|
||||
addAutoForceItemWithLabelAndDateField();
|
||||
addDownloadOnlyItemWithLabel();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void addAutoForceItemWithLabelAndDateField() {
|
||||
final FlexibleOptionGroupItemComponent autoForceItem = actionTypeOptionGroup
|
||||
.getItemComponent(ActionTypeOption.AUTO_FORCED);
|
||||
|
||||
@@ -32,9 +32,11 @@ public class ActionTypeOptionGroupAutoAssignmentLayout extends AbstractActionTyp
|
||||
actionTypeOptionGroup = new FlexibleOptionGroup();
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.SOFT);
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.FORCED);
|
||||
actionTypeOptionGroup.addItem(ActionTypeOption.DOWNLOAD_ONLY);
|
||||
selectDefaultOption();
|
||||
|
||||
addForcedItemWithLabel();
|
||||
addSoftItemWithLabel();
|
||||
addDownloadOnlyItemWithLabel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.management.targettable;
|
||||
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.createAssignmentTab;
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.isMaintenanceWindowValid;
|
||||
import static org.eclipse.hawkbit.ui.management.TargetAssignmentOperations.saveAllAssignments;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -19,6 +23,7 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -26,32 +31,24 @@ import org.eclipse.hawkbit.im.authentication.SpPermission;
|
||||
import org.eclipse.hawkbit.repository.DeploymentManagement;
|
||||
import org.eclipse.hawkbit.repository.DistributionSetManagement;
|
||||
import org.eclipse.hawkbit.repository.FilterParams;
|
||||
import org.eclipse.hawkbit.repository.MaintenanceScheduleHelper;
|
||||
import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.repository.TargetTagManagement;
|
||||
import org.eclipse.hawkbit.repository.event.remote.entity.RemoteEntityEvent;
|
||||
import org.eclipse.hawkbit.repository.exception.InvalidMaintenanceScheduleException;
|
||||
import org.eclipse.hawkbit.repository.model.Action.ActionType;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||
import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.RepositoryModelConstants;
|
||||
import org.eclipse.hawkbit.repository.model.Tag;
|
||||
import org.eclipse.hawkbit.repository.model.Target;
|
||||
import org.eclipse.hawkbit.repository.model.TargetTag;
|
||||
import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult;
|
||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||
import org.eclipse.hawkbit.repository.model.TargetWithActionType;
|
||||
import org.eclipse.hawkbit.ui.SpPermissionChecker;
|
||||
import org.eclipse.hawkbit.ui.UiProperties;
|
||||
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
|
||||
import org.eclipse.hawkbit.ui.common.ManagementEntityState;
|
||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.ConfirmationTab;
|
||||
import org.eclipse.hawkbit.ui.common.entity.DistributionSetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.entity.TargetIdName;
|
||||
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
|
||||
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
|
||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||
import org.eclipse.hawkbit.ui.dd.criteria.ManagementViewClientCriterion;
|
||||
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
|
||||
@@ -60,7 +57,6 @@ import org.eclipse.hawkbit.ui.management.event.TargetAddUpdateWindowEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.TargetFilterEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
|
||||
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.AbstractActionTypeOptionGroupLayout.ActionTypeOption;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.ActionTypeOptionGroupAssignmentLayout;
|
||||
import org.eclipse.hawkbit.ui.management.miscs.MaintenanceWindowLayout;
|
||||
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
|
||||
@@ -99,11 +95,8 @@ import com.vaadin.server.FontAwesome;
|
||||
import com.vaadin.shared.ui.label.ContentMode;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.Button.ClickEvent;
|
||||
import com.vaadin.ui.CheckBox;
|
||||
import com.vaadin.ui.DragAndDropWrapper;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.Link;
|
||||
import com.vaadin.ui.Table;
|
||||
import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
@@ -379,8 +372,7 @@ public class TargetTable extends AbstractTable<Target> {
|
||||
if (
|
||||
|
||||
isFilteredByTags()) {
|
||||
final List<String> list = new ArrayList<>();
|
||||
list.addAll(managementUIState.getTargetTableFilters().getClickedTargetTags());
|
||||
final List<String> list = new ArrayList<>(managementUIState.getTargetTableFilters().getClickedTargetTags());
|
||||
queryConfig.put(SPUIDefinitions.FILTER_BY_TAG, list.toArray(new String[list.size()]));
|
||||
}
|
||||
if (isFilteredByStatus()) {
|
||||
@@ -524,7 +516,7 @@ public class TargetTable extends AbstractTable<Target> {
|
||||
}
|
||||
|
||||
private void tagAssignment(final DragAndDropEvent event) {
|
||||
final List<Long> targetList = getDraggedTargetList(event).stream().collect(Collectors.toList());
|
||||
final List<Long> targetList = new ArrayList<>(getDraggedTargetList(event));
|
||||
|
||||
final String targTagName = HawkbitCommonUtil.removePrefix(event.getTransferable().getSourceComponent().getId(),
|
||||
SPUIDefinitions.TARGET_TAG_ID_PREFIXS);
|
||||
@@ -858,95 +850,6 @@ public class TargetTable extends AbstractTable<Target> {
|
||||
return !managementUIState.getTargetTableFilters().getClickedTargetTags().isEmpty();
|
||||
}
|
||||
|
||||
// Code for assignment start
|
||||
private void saveAllAssignments() {
|
||||
final Set<TargetIdName> itemIds = managementUIState.getAssignedList().keySet();
|
||||
Long distId;
|
||||
List<TargetIdName> targetIdSetList;
|
||||
List<TargetIdName> tempIdList;
|
||||
final ActionType actionType = ((ActionTypeOption) actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.getValue()).getActionType();
|
||||
final long forcedTimeStamp = (((ActionTypeOption) actionTypeOptionGroupLayout.getActionTypeOptionGroup()
|
||||
.getValue()) == ActionTypeOption.AUTO_FORCED)
|
||||
? actionTypeOptionGroupLayout.getForcedTimeDateField().getValue().getTime()
|
||||
: RepositoryModelConstants.NO_FORCE_TIME;
|
||||
|
||||
final Map<Long, List<TargetIdName>> saveAssignedList = Maps.newHashMapWithExpectedSize(itemIds.size());
|
||||
|
||||
for (final TargetIdName itemId : itemIds) {
|
||||
final DistributionSetIdName distitem = managementUIState.getAssignedList().get(itemId);
|
||||
distId = distitem.getId();
|
||||
|
||||
if (saveAssignedList.containsKey(distId)) {
|
||||
targetIdSetList = saveAssignedList.get(distId);
|
||||
} else {
|
||||
targetIdSetList = new ArrayList<>();
|
||||
}
|
||||
targetIdSetList.add(itemId);
|
||||
saveAssignedList.put(distId, targetIdSetList);
|
||||
}
|
||||
|
||||
final String maintenanceSchedule = maintenanceWindowLayout.getMaintenanceSchedule();
|
||||
final String maintenanceDuration = maintenanceWindowLayout.getMaintenanceDuration();
|
||||
final String maintenanceTimeZone = maintenanceWindowLayout.getMaintenanceTimeZone();
|
||||
|
||||
for (final Map.Entry<Long, List<TargetIdName>> mapEntry : saveAssignedList.entrySet()) {
|
||||
tempIdList = saveAssignedList.get(mapEntry.getKey());
|
||||
final DistributionSetAssignmentResult distributionSetAssignmentResult = deploymentManagement
|
||||
.assignDistributionSet(mapEntry.getKey(),
|
||||
tempIdList.stream().map(t -> maintenanceWindowLayout.isEnabled()
|
||||
? new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp,
|
||||
maintenanceSchedule, maintenanceDuration, maintenanceTimeZone)
|
||||
: new TargetWithActionType(t.getControllerId(), actionType, forcedTimeStamp))
|
||||
.collect(Collectors.toList()));
|
||||
|
||||
if (distributionSetAssignmentResult.getAssigned() > 0) {
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.assignment",
|
||||
distributionSetAssignmentResult.getAssigned()));
|
||||
}
|
||||
if (distributionSetAssignmentResult.getAlreadyAssigned() > 0) {
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.alreadyAssigned",
|
||||
distributionSetAssignmentResult.getAlreadyAssigned()));
|
||||
}
|
||||
}
|
||||
resfreshPinnedDetails(saveAssignedList);
|
||||
|
||||
managementUIState.getAssignedList().clear();
|
||||
getNotification().displaySuccess(getI18n().getMessage("message.target.ds.assign.success"));
|
||||
getEventBus().publish(this, SaveActionWindowEvent.SAVED_ASSIGNMENTS);
|
||||
}
|
||||
|
||||
private void resfreshPinnedDetails(final Map<Long, List<TargetIdName>> saveAssignedList) {
|
||||
final Optional<Long> pinnedDist = managementUIState.getTargetTableFilters().getPinnedDistId();
|
||||
final Optional<TargetIdName> pinnedTarget = managementUIState.getDistributionTableFilters().getPinnedTarget();
|
||||
|
||||
if (pinnedDist.isPresent()) {
|
||||
if (saveAssignedList.keySet().contains(pinnedDist.get())) {
|
||||
getEventBus().publish(this, PinUnpinEvent.PIN_DISTRIBUTION);
|
||||
}
|
||||
} else if (pinnedTarget.isPresent()) {
|
||||
final Set<TargetIdName> assignedTargetIds = managementUIState.getAssignedList().keySet();
|
||||
if (assignedTargetIds.contains(pinnedTarget.get())) {
|
||||
getEventBus().publish(this, PinUnpinEvent.PIN_TARGET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isMaintenanceWindowValid() {
|
||||
if (maintenanceWindowLayout.isEnabled()) {
|
||||
try {
|
||||
MaintenanceScheduleHelper.validateMaintenanceSchedule(maintenanceWindowLayout.getMaintenanceSchedule(),
|
||||
maintenanceWindowLayout.getMaintenanceDuration(),
|
||||
maintenanceWindowLayout.getMaintenanceTimeZone());
|
||||
} catch (final InvalidMaintenanceScheduleException e) {
|
||||
LOG.error("Maintenance window is not valid", e);
|
||||
getNotification().displayValidationError(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void assignDsToTarget(final DragAndDropEvent event) {
|
||||
final TableTransferable transferable = (TableTransferable) event.getTransferable();
|
||||
final AbstractTable<?> source = (AbstractTable<?>) transferable.getSourceComponent();
|
||||
@@ -988,65 +891,21 @@ public class TargetTable extends AbstractTable<Target> {
|
||||
getI18n().getMessage(MESSAGE_CONFIRM_ASSIGN_ENTITY, distributionNameToAssign, "target", targetName),
|
||||
getI18n().getMessage(UIMessageIdProvider.BUTTON_OK),
|
||||
getI18n().getMessage(UIMessageIdProvider.BUTTON_CANCEL), ok -> {
|
||||
if (ok && isMaintenanceWindowValid()) {
|
||||
saveAllAssignments();
|
||||
if (ok && isMaintenanceWindowValid(maintenanceWindowLayout, getNotification())) {
|
||||
saveAllAssignments(managementUIState, actionTypeOptionGroupLayout, maintenanceWindowLayout,
|
||||
deploymentManagement, getNotification(), getEventBus(), getI18n(), this);
|
||||
} else {
|
||||
managementUIState.getAssignedList().clear();
|
||||
}
|
||||
}, createAssignmentTab(), UIComponentIdProvider.DIST_SET_TO_TARGET_ASSIGNMENT_CONFIRM_ID);
|
||||
}, createAssignmentTab(actionTypeOptionGroupLayout, maintenanceWindowLayout, saveButtonToggle(),
|
||||
getI18n(), uiProperties),
|
||||
UIComponentIdProvider.DIST_SET_TO_TARGET_ASSIGNMENT_CONFIRM_ID);
|
||||
UI.getCurrent().addWindow(confirmDialog.getWindow());
|
||||
confirmDialog.getWindow().bringToFront();
|
||||
}
|
||||
|
||||
private ConfirmationTab createAssignmentTab() {
|
||||
final ConfirmationTab assignmentTab = new ConfirmationTab();
|
||||
actionTypeOptionGroupLayout.selectDefaultOption();
|
||||
assignmentTab.addComponent(actionTypeOptionGroupLayout);
|
||||
assignmentTab.addComponent(enableMaintenanceWindowLayout());
|
||||
initMaintenanceWindow();
|
||||
assignmentTab.addComponent(maintenanceWindowLayout);
|
||||
return assignmentTab;
|
||||
}
|
||||
|
||||
private HorizontalLayout enableMaintenanceWindowLayout() {
|
||||
final HorizontalLayout layout = new HorizontalLayout();
|
||||
layout.addComponent(enableMaintenanceWindowControl());
|
||||
layout.addComponent(maintenanceWindowHelpLinkControl());
|
||||
return layout;
|
||||
}
|
||||
|
||||
private CheckBox enableMaintenanceWindowControl() {
|
||||
final CheckBox enableMaintenanceWindow = new CheckBox(
|
||||
getI18n().getMessage("caption.maintenancewindow.enabled"));
|
||||
enableMaintenanceWindow.setId(UIComponentIdProvider.MAINTENANCE_WINDOW_ENABLED_ID);
|
||||
enableMaintenanceWindow.addStyleName(ValoTheme.CHECKBOX_SMALL);
|
||||
enableMaintenanceWindow.addStyleName("dist-window-maintenance-window-enable");
|
||||
enableMaintenanceWindow.addValueChangeListener(event -> {
|
||||
final Boolean isMaintenanceWindowEnabled = enableMaintenanceWindow.getValue();
|
||||
maintenanceWindowLayout.setVisible(isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.setEnabled(isMaintenanceWindowEnabled);
|
||||
enableSaveButton(!isMaintenanceWindowEnabled);
|
||||
maintenanceWindowLayout.clearAllControls();
|
||||
});
|
||||
return enableMaintenanceWindow;
|
||||
}
|
||||
|
||||
private Link maintenanceWindowHelpLinkControl() {
|
||||
final String maintenanceWindowHelpUrl = uiProperties.getLinks().getDocumentation().getMaintenanceWindowView();
|
||||
return SPUIComponentProvider.getHelpLink(getI18n(), maintenanceWindowHelpUrl);
|
||||
}
|
||||
|
||||
private void initMaintenanceWindow() {
|
||||
maintenanceWindowLayout.setVisible(false);
|
||||
maintenanceWindowLayout.setEnabled(false);
|
||||
maintenanceWindowLayout.getScheduleControl()
|
||||
.addTextChangeListener(event -> enableSaveButton(maintenanceWindowLayout.onScheduleChange(event)));
|
||||
maintenanceWindowLayout.getDurationControl()
|
||||
.addTextChangeListener(event -> enableSaveButton(maintenanceWindowLayout.onDurationChange(event)));
|
||||
}
|
||||
|
||||
private void enableSaveButton(final boolean enabled) {
|
||||
confirmDialog.getOkButton().setEnabled(enabled);
|
||||
private Consumer<Boolean> saveButtonToggle() {
|
||||
return isEnabled -> confirmDialog.getOkButton().setEnabled(isEnabled);
|
||||
}
|
||||
|
||||
private void addNewTargetToAssignmentList(final TargetIdName createTargetIdName,
|
||||
|
||||
@@ -36,10 +36,6 @@ public class TargetTableLayout extends AbstractTableLayout<TargetTable> {
|
||||
|
||||
private final transient EventBus.UIEventBus eventBus;
|
||||
|
||||
private final TargetDetails targetDetails;
|
||||
|
||||
private final TargetTableHeader targetTableHeader;
|
||||
|
||||
public TargetTableLayout(final UIEventBus eventBus, final TargetTable targetTable,
|
||||
final TargetManagement targetManagement, final EntityFactory entityFactory, final VaadinMessageSource i18n,
|
||||
final UINotification uiNotification, final ManagementUIState managementUIState,
|
||||
@@ -50,10 +46,10 @@ public class TargetTableLayout extends AbstractTableLayout<TargetTable> {
|
||||
final TargetMetadataPopupLayout targetMetadataPopupLayout = new TargetMetadataPopupLayout(i18n, uiNotification,
|
||||
eventBus, targetManagement, entityFactory, permissionChecker);
|
||||
this.eventBus = eventBus;
|
||||
this.targetDetails = new TargetDetails(i18n, eventBus, permissionChecker, managementUIState, uiNotification,
|
||||
TargetDetails targetDetails = new TargetDetails(i18n, eventBus, permissionChecker, managementUIState, uiNotification,
|
||||
tagManagement, targetManagement, targetMetadataPopupLayout, deploymentManagement, entityFactory,
|
||||
targetTable);
|
||||
this.targetTableHeader = new TargetTableHeader(i18n, permissionChecker, eventBus, uiNotification,
|
||||
TargetTableHeader targetTableHeader = new TargetTableHeader(i18n, permissionChecker, eventBus, uiNotification,
|
||||
managementUIState, managementViewClientCriterion, targetManagement, deploymentManagement, uiProperties,
|
||||
entityFactory, uiNotification, tagManagement, distributionSetManagement, uiExecutor, targetTable);
|
||||
|
||||
|
||||
@@ -392,6 +392,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout {
|
||||
private CommonDialogWindow createWindow() {
|
||||
return new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW)
|
||||
.caption(i18n.getMessage("caption.create.new", i18n.getMessage("caption.rollout"))).content(this)
|
||||
.id(UIComponentIdProvider.ROLLOUT_POPUP_ID)
|
||||
.layout(this).i18n(i18n).helpLink(uiProperties.getLinks().getDocumentation().getRolloutView())
|
||||
.saveDialogCloseListener(new SaveOnDialogCloseListener()).buildCommonDialogWindow();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.Action.ActionType;
|
||||
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
|
||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
|
||||
@@ -45,6 +46,15 @@ public class ProxyRollout {
|
||||
private TotalTargetCountStatus totalTargetCountStatus;
|
||||
private String approvalDecidedBy;
|
||||
private String approvalRemark;
|
||||
private ActionType actionType;
|
||||
|
||||
public ActionType getActionType() {
|
||||
return actionType;
|
||||
}
|
||||
|
||||
public void setActionType(final ActionType actionType) {
|
||||
this.actionType = actionType;
|
||||
}
|
||||
|
||||
public RolloutRendererData getRolloutRendererData() {
|
||||
return rolloutRendererData;
|
||||
|
||||
@@ -118,6 +118,7 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
|
||||
proxyRollout.setForcedTime(rollout.getForcedTime());
|
||||
proxyRollout.setId(rollout.getId());
|
||||
proxyRollout.setStatus(rollout.getStatus());
|
||||
proxyRollout.setActionType(rollout.getActionType());
|
||||
proxyRollout.setRolloutRendererData(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString()));
|
||||
|
||||
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
|
||||
import org.eclipse.hawkbit.repository.TargetManagement;
|
||||
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
|
||||
import org.eclipse.hawkbit.repository.model.Action.ActionType;
|
||||
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
|
||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||
@@ -38,6 +39,7 @@ 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.AbstractGridButtonConverter;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.AbstractHtmlLabelConverter;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.GridButtonRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||
import org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer;
|
||||
@@ -87,6 +89,10 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
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 static final String STATUS_ICON_DOWNLOAD_ONLY = "statusIconDownloadOnly";
|
||||
private static final String STATUS_ICON_SOFT = "statusIconSoft";
|
||||
private static final String STATUS_ICON_FORCED = "statusIconForced";
|
||||
private static final String PROP_TYPE = "actionType";
|
||||
|
||||
private final transient RolloutManagement rolloutManagement;
|
||||
|
||||
@@ -100,6 +106,8 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
private final RolloutUIState rolloutUIState;
|
||||
|
||||
private final AlignCellStyleGenerator alignGenerator;
|
||||
|
||||
private static final List<RolloutStatus> 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,
|
||||
@@ -109,7 +117,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING, RolloutStatus.PAUSED, RolloutStatus.READY,
|
||||
RolloutStatus.RUNNING, RolloutStatus.STARTING, RolloutStatus.STOPPED);
|
||||
|
||||
private static final List<RolloutStatus> PAUSE_BUTTON_ENABLED = Arrays.asList(RolloutStatus.RUNNING);
|
||||
private static final List<RolloutStatus> PAUSE_BUTTON_ENABLED = Collections.singletonList(RolloutStatus.RUNNING);
|
||||
|
||||
private static final List<RolloutStatus> RUN_BUTTON_ENABLED = Arrays.asList(RolloutStatus.READY,
|
||||
RolloutStatus.PAUSED);
|
||||
@@ -119,11 +127,13 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
private static final Map<RolloutStatus, StatusFontIcon> statusIconMap = new EnumMap<>(RolloutStatus.class);
|
||||
|
||||
private static final List<Object> HIDDEN_COLUMNS = Arrays.asList(SPUILabelDefinitions.VAR_CREATED_DATE,
|
||||
private static final List<Object> HIDDEN_COLUMNS = Arrays.asList(PROP_TYPE, SPUILabelDefinitions.VAR_CREATED_DATE,
|
||||
SPUILabelDefinitions.VAR_CREATED_USER, SPUILabelDefinitions.VAR_MODIFIED_DATE,
|
||||
SPUILabelDefinitions.VAR_MODIFIED_BY, SPUILabelDefinitions.VAR_APPROVAL_DECIDED_BY,
|
||||
SPUILabelDefinitions.VAR_APPROVAL_REMARK, SPUILabelDefinitions.VAR_DESC);
|
||||
|
||||
private static final String[] centerAlignedColumns = new String[] { PROP_TYPE };
|
||||
|
||||
static {
|
||||
statusIconMap.put(RolloutStatus.FINISHED,
|
||||
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||
@@ -163,6 +173,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
rolloutGroupManagement, quotaManagement);
|
||||
this.uiNotification = uiNotification;
|
||||
this.rolloutUIState = rolloutUIState;
|
||||
alignGenerator = new AlignCellStyleGenerator(null, centerAlignedColumns, null);
|
||||
|
||||
setGeneratedPropertySupport(new RolloutGeneratedPropertySupport());
|
||||
init();
|
||||
@@ -183,7 +194,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
refreshContainer();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,6 +242,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
private void updateItem(final Rollout rollout, final Item item) {
|
||||
final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());
|
||||
item.getItemProperty(PROP_TYPE).setValue(rollout.getActionType());
|
||||
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setValue(totalTargetCountStatus);
|
||||
final Long groupCount = Long
|
||||
.valueOf((Integer) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).getValue());
|
||||
@@ -270,6 +282,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_APPROVAL_DECIDED_BY, String.class, null,
|
||||
false, false);
|
||||
rolloutGridContainer.addContainerProperty(PROP_TYPE, ActionType.class, null, false, false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_APPROVAL_REMARK, String.class, null, false,
|
||||
false);
|
||||
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
|
||||
@@ -307,6 +320,9 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMinimumWidth(40);
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMaximumWidth(60);
|
||||
|
||||
getColumn(PROP_TYPE).setMinimumWidth(45);
|
||||
getColumn(PROP_TYPE).setMaximumWidth(45);
|
||||
|
||||
getColumn(VIRT_PROP_RUN).setMinimumWidth(25);
|
||||
getColumn(VIRT_PROP_RUN).setMaximumWidth(25);
|
||||
|
||||
@@ -335,6 +351,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
.setHeaderCaption(i18n.getMessage("header.distributionset"));
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.getMessage("header.numberofgroups"));
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.getMessage("header.total.targets"));
|
||||
getColumn(PROP_TYPE).setHeaderCaption(i18n.getMessage("header.type"));
|
||||
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.getMessage("header.createdDate"));
|
||||
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.getMessage("header.createdBy"));
|
||||
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.getMessage("header.modifiedDate"));
|
||||
@@ -374,13 +391,14 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
final List<String> 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_APPROVE, VIRT_PROP_RUN, VIRT_PROP_PAUSE,
|
||||
SPUILabelDefinitions.VAR_TOTAL_TARGETS, PROP_TYPE, VIRT_PROP_APPROVE, 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_APPROVAL_DECIDED_BY,
|
||||
SPUILabelDefinitions.VAR_APPROVAL_REMARK, SPUILabelDefinitions.VAR_DESC);
|
||||
|
||||
setColumns(columnsToShowInOrder.toArray());
|
||||
setCellStyleGenerator(alignGenerator);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -403,7 +421,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setRenderer(new HtmlRenderer(),
|
||||
new TotalTargetGroupsConverter());
|
||||
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
|
||||
@@ -411,6 +429,9 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter());
|
||||
|
||||
getColumn(PROP_TYPE).setRenderer(new HtmlLabelRenderer(),
|
||||
new RolloutTypeConverter(this::createTypeLabelAdapter));
|
||||
|
||||
final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class);
|
||||
customObjectRenderer.addClickListener(this::onClickOfRolloutName);
|
||||
getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer);
|
||||
@@ -465,7 +486,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
|
||||
@Override
|
||||
public LazyQueryContainer getRawContainer() {
|
||||
return (LazyQueryContainer) (getDecoratedContainer()).getWrappedContainer();
|
||||
return (LazyQueryContainer) getDecoratedContainer().getWrappedContainer();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -550,7 +571,6 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
if (RolloutStatus.PAUSED.equals(rolloutStatus)) {
|
||||
rolloutManagement.resumeRollout(rolloutId);
|
||||
uiNotification.displaySuccess(i18n.getMessage("message.rollout.resumed", rolloutName));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -608,7 +628,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
final Long runningActions = statusTotalCount.get(Status.RUNNING);
|
||||
String rolloutDetailsMessage = "";
|
||||
if ((scheduledActions > 0) || (runningActions > 0)) {
|
||||
if (scheduledActions > 0 || runningActions > 0) {
|
||||
rolloutDetailsMessage = i18n.getMessage("message.delete.rollout.details", runningActions, scheduledActions);
|
||||
}
|
||||
|
||||
@@ -716,6 +736,51 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Converter to convert {@link RolloutStatus} to string.
|
||||
*
|
||||
*/
|
||||
|
||||
class RolloutTypeConverter extends AbstractHtmlLabelConverter<ActionType> {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
RolloutTypeConverter(final LabelAdapter<ActionType> adapter) {
|
||||
addAdapter(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<ActionType> getModelType() {
|
||||
return ActionType.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private StatusFontIcon createTypeLabelAdapter(final ActionType actionType) {
|
||||
if (ActionType.FORCED.equals(actionType)) {
|
||||
return new StatusFontIcon(FontAwesome.BOLT, STATUS_ICON_FORCED,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_FORCED),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
if (ActionType.TIMEFORCED.equals(actionType)) {
|
||||
return new StatusFontIcon(FontAwesome.HISTORY, STATUS_ICON_FORCED,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_TIME_FORCED),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
if (ActionType.SOFT.equals(actionType)) {
|
||||
return new StatusFontIcon(FontAwesome.STEP_FORWARD, STATUS_ICON_SOFT,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_SOFT),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
if (ActionType.DOWNLOAD_ONLY.equals(actionType)) {
|
||||
return new StatusFontIcon(FontAwesome.DOWNLOAD, STATUS_ICON_DOWNLOAD_ONLY,
|
||||
i18n.getMessage(UIMessageIdProvider.CAPTION_ACTION_DOWNLOAD_ONLY),
|
||||
UIComponentIdProvider.ACTION_HISTORY_TABLE_TYPE_LABEL_ID);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converter to convert {@link TotalTargetCountStatus} to formatted string
|
||||
* with status and count details.
|
||||
@@ -782,7 +847,7 @@ public class RolloutListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
}
|
||||
|
||||
private final void hideColumnsDueToInsufficientPermissions() {
|
||||
private void hideColumnsDueToInsufficientPermissions() {
|
||||
|
||||
final List<Object> modifiableColumnsList = getColumns().stream().map(Column::getPropertyId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
@@ -233,7 +233,7 @@ public class RolloutGroupListGrid extends AbstractGrid<LazyQueryContainer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(),
|
||||
new RolloutGroupStatusConverter());
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import java.util.EnumMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.hawkbit.repository.model.Action;
|
||||
import org.eclipse.hawkbit.repository.model.Action.Status;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
||||
@@ -173,7 +174,7 @@ public class RolloutGroupTargetsListGrid extends AbstractGrid<LazyQueryContainer
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addColumnRenderes() {
|
||||
protected void addColumnRenderers() {
|
||||
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new StatusConverter());
|
||||
}
|
||||
|
||||
@@ -238,11 +239,20 @@ public class RolloutGroupTargetsListGrid extends AbstractGrid<LazyQueryContainer
|
||||
}
|
||||
|
||||
private String processActionStatus(final Status status) {
|
||||
final StatusFontIcon statusFontIcon = statusIconMap.get(status);
|
||||
final StatusFontIcon statusFontIcon = mapActionStatusToPresentation(status);
|
||||
final String codePoint = HawkbitCommonUtil.getCodePoint(statusFontIcon);
|
||||
return HawkbitCommonUtil.getStatusLabelDetailsInString(codePoint, statusFontIcon.getStyle(), null);
|
||||
}
|
||||
|
||||
private StatusFontIcon mapActionStatusToPresentation(final Status status) {
|
||||
final boolean isFinishedDownloadOnlyAssignment = Status.DOWNLOADED.equals(status)
|
||||
&& rolloutUIState.getRolloutGroup()
|
||||
.map(group -> Action.ActionType.DOWNLOAD_ONLY.equals(group.getRollout().getActionType()))
|
||||
.orElse(false);
|
||||
|
||||
return isFinishedDownloadOnlyAssignment ? statusIconMap.get(Status.FINISHED) : statusIconMap.get(status);
|
||||
}
|
||||
|
||||
private String getStatus() {
|
||||
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().orElse(null);
|
||||
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
|
||||
|
||||
@@ -177,6 +177,10 @@ public final class UIComponentIdProvider {
|
||||
* Action history table cancel Id.
|
||||
*/
|
||||
public static final String ACTION_DETAILS_SOFT_ID = "action.details.soft.group";
|
||||
/**
|
||||
* Download Only Action Id.
|
||||
*/
|
||||
public static final String ACTION_DETAILS_DOWNLOAD_ONLY_ID = "action.details.downloadonly.group";
|
||||
/**
|
||||
* Start type of rollout manual radio button
|
||||
*/
|
||||
@@ -256,7 +260,7 @@ public final class UIComponentIdProvider {
|
||||
/**
|
||||
* Action history table forced label Id.
|
||||
*/
|
||||
public static final String ACTION_HISTORY_TABLE_FORCED_LABEL_ID = "action.history.table.forcedId";
|
||||
public static final String ACTION_HISTORY_TABLE_TYPE_LABEL_ID = "action.history.table.typeId";
|
||||
|
||||
/**
|
||||
* Action history table time-forced label Id.
|
||||
@@ -1145,6 +1149,11 @@ public final class UIComponentIdProvider {
|
||||
*/
|
||||
public static final String METADATA_POPUP_ID = "metadata.popup.id";
|
||||
|
||||
/**
|
||||
* Rollout popup id.
|
||||
*/
|
||||
public static final String ROLLOUT_POPUP_ID = "add.update.rollout.popup";
|
||||
|
||||
/**
|
||||
* DistributionSet table details tab id in Distributions .
|
||||
*/
|
||||
|
||||
@@ -31,6 +31,8 @@ public final class UIMessageIdProvider {
|
||||
|
||||
public static final String CAPTION_ACTION_SOFT = "label.action.soft";
|
||||
|
||||
public static final String CAPTION_ACTION_DOWNLOAD_ONLY = "label.action.downloadonly";
|
||||
|
||||
public static final String CAPTION_ACTION_TIME_FORCED = "label.action.time.forced";
|
||||
|
||||
public static final String CAPTION_ACTION_MESSAGES = "caption.action.messages";
|
||||
@@ -129,6 +131,8 @@ public final class UIMessageIdProvider {
|
||||
|
||||
public static final String TOOLTIP_SOFT_ITEM = "tooltip.soft.item";
|
||||
|
||||
public static final String TOOLTIP_DOWNLOAD_ONLY_ITEM = "tooltip.downloadonly.item";
|
||||
|
||||
public static final String TOOLTIP_FORCED_ITEM = "tooltip.forced.item";
|
||||
|
||||
public static final String TOOLTIP_TARGET_PIN = "tooltip.target.pin";
|
||||
|
||||
@@ -165,7 +165,9 @@ label.active = Active
|
||||
label.action.id = Action Id
|
||||
label.no.tag = NO TAG
|
||||
label.action.forced = Forced
|
||||
label.action.type = Type
|
||||
label.action.soft = Soft
|
||||
label.action.downloadonly = Download Only
|
||||
label.action.time.forced = Time Forced
|
||||
label.dist.details.type = Type :
|
||||
label.dist.details.name = Name :
|
||||
@@ -218,6 +220,7 @@ label.cancelled = Cancelled
|
||||
label.cancelling = Canceling
|
||||
label.retrieved = Retrieved
|
||||
label.download = Downloading
|
||||
label.downloaded = Downloaded
|
||||
label.unknown = Unknown
|
||||
label.target.id = Controller Id :
|
||||
label.target.ip = Controller IP :
|
||||
@@ -283,6 +286,7 @@ tooltip.status.overdue = Overdue
|
||||
tooltip.delete.module = Select and delete Software Module
|
||||
tooltip.forced.item=Device is supposed to install the update immediately
|
||||
tooltip.soft.item=Device can execute the update at any time, e.g. with user approval or according to its regular update time plan
|
||||
tooltip.downloadonly.item=Device is supposed to only download the update and not install it
|
||||
tooltip.timeforced.item=Soft update which turns into a forced update after a specific time
|
||||
tooltip.timeforced.forced.in=Auto forcing in {0}
|
||||
tooltip.timeforced.forced.since=Auto forced since {0}
|
||||
@@ -409,6 +413,7 @@ message.forcequit.action = Force Quit..
|
||||
message.forcequit.action.success = Action has been force quit successfully !
|
||||
message.forcequit.action.failed = Force Quitting the action is not possible !
|
||||
message.forcequit.action.confirm = Attention!\nForce quit should only be used when the assignment action is not working properly.\nForce quitting an action has no effect on the connected target. It is just resetting \nthe data stored on the SP update server. \nAre you absolutely sure you want to force quit this action?
|
||||
message.downloadonly.action = DownloadOnly
|
||||
message.distribution.no.update = distribution {0} set is already assigned to targets and cannot be changed
|
||||
message.action.not.allowed = Action not allowed
|
||||
message.action.did.not.work = Action did not work. Please try again.
|
||||
@@ -570,6 +575,7 @@ header.name = Name
|
||||
header.vendor = Vendor
|
||||
header.version = Version
|
||||
header.description = Description
|
||||
header.type = Type
|
||||
header.createdBy = Created By
|
||||
header.createdDate = Created Date
|
||||
header.modifiedBy = Modified By
|
||||
|
||||
Reference in New Issue
Block a user