Merge pull request #71 from bsinno/Rollout_migrate_table_to_grid_final
Thx for the contribution. Note: @asharani-murugesh is part of @michahirsch and my organisation.
This commit is contained in:
@@ -58,6 +58,24 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<index>true</index>
|
||||||
|
<manifest>
|
||||||
|
<addClasspath>true</addClasspath>
|
||||||
|
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
||||||
|
</manifest>
|
||||||
|
<manifestEntries>
|
||||||
|
<Implementation-Title>CustomRenderers</Implementation-Title>
|
||||||
|
<Vaadin-Package-Version>1</Vaadin-Package-Version>
|
||||||
|
<Vaadin-Widgetsets>org.eclipse.hawkbit.ui.customrenderers.CustomRendererWidgetSet</Vaadin-Widgetsets>
|
||||||
|
</manifestEntries>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
<pluginManagement>
|
<pluginManagement>
|
||||||
<plugins>
|
<plugins>
|
||||||
@@ -153,8 +171,11 @@
|
|||||||
<groupId>com.vaadin</groupId>
|
<groupId>com.vaadin</groupId>
|
||||||
<artifactId>vaadin-server</artifactId>
|
<artifactId>vaadin-server</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
<dependency>
|
<groupId>com.vaadin</groupId>
|
||||||
|
<artifactId>vaadin-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
<groupId>com.vaadin</groupId>
|
<groupId>com.vaadin</groupId>
|
||||||
<artifactId>vaadin-push</artifactId>
|
<artifactId>vaadin-push</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|||||||
@@ -17,14 +17,28 @@
|
|||||||
<!-- Inherit DefaultWidgetSet -->
|
<!-- Inherit DefaultWidgetSet -->
|
||||||
<inherits name="com.vaadin.DefaultWidgetSet" />
|
<inherits name="com.vaadin.DefaultWidgetSet" />
|
||||||
|
|
||||||
|
<inherits
|
||||||
|
name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
|
||||||
|
|
||||||
|
|
||||||
|
<inherits
|
||||||
|
name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
|
||||||
|
|
||||||
|
<inherits
|
||||||
|
name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
|
||||||
|
|
||||||
|
<inherits
|
||||||
|
name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
|
||||||
|
|
||||||
|
<inherits name="org.eclipse.hawkbit.ui.customrenderers.CustomRendererWidgetSet" />
|
||||||
|
|
||||||
<inherits name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
|
<inherits name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
|
||||||
|
|
||||||
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
|
|
||||||
|
|
||||||
|
|
||||||
<inherits name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
|
<inherits name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
|
|
||||||
</module>
|
</module>
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
||||||
|
*
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*/
|
||||||
|
package org.eclipse.hawkbit.ui.common.grid;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||||
|
|
||||||
|
import com.vaadin.data.Container;
|
||||||
|
import com.vaadin.data.Container.Indexed;
|
||||||
|
import com.vaadin.shared.ui.grid.HeightMode;
|
||||||
|
import com.vaadin.ui.Grid;
|
||||||
|
import com.vaadin.ui.Label;
|
||||||
|
import com.vaadin.ui.themes.ValoTheme;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract table class.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class AbstractGrid extends Grid {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 4856562746502217630L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the components.
|
||||||
|
*/
|
||||||
|
protected void init() {
|
||||||
|
setSizeFull();
|
||||||
|
setImmediate(true);
|
||||||
|
setId(getGridId());
|
||||||
|
setSelectionMode(SelectionMode.NONE);
|
||||||
|
setColumnReorderingAllowed(true);
|
||||||
|
addNewContainerDS();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addNewContainerDS() {
|
||||||
|
final Container container = createContainer();
|
||||||
|
setContainerDataSource((Indexed) container);
|
||||||
|
addContainerProperties();
|
||||||
|
setColumnExpandRatio();
|
||||||
|
setColumnProperties();
|
||||||
|
setColumnHeaderNames();
|
||||||
|
addColumnRenderes();
|
||||||
|
|
||||||
|
CellDescriptionGenerator cellDescriptionGenerator = getDescriptionGenerator();
|
||||||
|
if (getDescriptionGenerator() != null) {
|
||||||
|
setCellDescriptionGenerator(cellDescriptionGenerator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow column hiding
|
||||||
|
for (Column c : getColumns()) {
|
||||||
|
c.setHidable(true);
|
||||||
|
}
|
||||||
|
setHiddenColumns();
|
||||||
|
int size = 0;
|
||||||
|
if (container != null) {
|
||||||
|
size = container.size();
|
||||||
|
}
|
||||||
|
if (size == 0) {
|
||||||
|
setData(SPUIDefinitions.NO_DATA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Container createContainer();
|
||||||
|
|
||||||
|
protected abstract void addContainerProperties();
|
||||||
|
|
||||||
|
protected abstract void setColumnExpandRatio();
|
||||||
|
|
||||||
|
protected abstract void setColumnHeaderNames();
|
||||||
|
|
||||||
|
protected abstract String getGridId();
|
||||||
|
|
||||||
|
protected abstract void setColumnProperties();
|
||||||
|
|
||||||
|
protected abstract void addColumnRenderes();
|
||||||
|
|
||||||
|
protected abstract void setHiddenColumns();
|
||||||
|
|
||||||
|
protected abstract CellDescriptionGenerator getDescriptionGenerator();
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.common.grid;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
import org.eclipse.hawkbit.ui.components.SPUIButton;
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||||
@@ -26,10 +26,10 @@ import com.vaadin.ui.VerticalLayout;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Abstract table header.
|
* Abstract grid header.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSimpleTableHeader extends VerticalLayout {
|
public abstract class AbstractGridHeader extends VerticalLayout {
|
||||||
|
|
||||||
private static final long serialVersionUID = -24429876573255519L;
|
private static final long serialVersionUID = -24429876573255519L;
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.common.grid;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
||||||
|
|
||||||
@@ -17,22 +17,23 @@ import com.vaadin.ui.VerticalLayout;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Abstract table layout class which builds layout with table
|
* Abstract grid layout class which builds layout with grid
|
||||||
* {@link AbstractSimpleTable} and table header
|
* {@link AbstractGrid} and table header
|
||||||
* {@link AbstractSimpleTableHeader}.
|
* {@link AbstractGridHeader}.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSimpleTableLayout extends VerticalLayout {
|
public abstract class AbstractGridLayout extends VerticalLayout {
|
||||||
|
|
||||||
private static final long serialVersionUID = 8611248179949245460L;
|
private static final long serialVersionUID = 8611248179949245460L;
|
||||||
|
|
||||||
private AbstractSimpleTableHeader tableHeader;
|
private AbstractGridHeader tableHeader;
|
||||||
|
|
||||||
private AbstractSimpleTable table;
|
private AbstractGrid grid;
|
||||||
|
|
||||||
protected void init(final AbstractSimpleTableHeader tableHeader, final AbstractSimpleTable table) {
|
|
||||||
|
protected void init(final AbstractGridHeader tableHeader,final AbstractGrid grid) {
|
||||||
this.tableHeader = tableHeader;
|
this.tableHeader = tableHeader;
|
||||||
this.table = table;
|
this.grid = grid;
|
||||||
buildLayout();
|
buildLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,9 +51,9 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
|
|||||||
tableHeaderLayout.addComponent(tableHeader);
|
tableHeaderLayout.addComponent(tableHeader);
|
||||||
|
|
||||||
tableHeaderLayout.setComponentAlignment(tableHeader, Alignment.TOP_CENTER);
|
tableHeaderLayout.setComponentAlignment(tableHeader, Alignment.TOP_CENTER);
|
||||||
tableHeaderLayout.addComponent(table);
|
tableHeaderLayout.addComponent(grid);
|
||||||
tableHeaderLayout.setComponentAlignment(table, Alignment.TOP_CENTER);
|
tableHeaderLayout.setComponentAlignment(grid, Alignment.TOP_CENTER);
|
||||||
tableHeaderLayout.setExpandRatio(table, 1.0f);
|
tableHeaderLayout.setExpandRatio(grid, 1.0f);
|
||||||
|
|
||||||
|
|
||||||
addComponent(tableHeaderLayout);
|
addComponent(tableHeaderLayout);
|
||||||
@@ -66,10 +67,6 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private HorizontalLayout createCountMessageComponent() {
|
private HorizontalLayout createCountMessageComponent() {
|
||||||
final HorizontalLayout rolloutGroupTargetsCountLayout = new HorizontalLayout();
|
final HorizontalLayout rolloutGroupTargetsCountLayout = new HorizontalLayout();
|
||||||
final Label countMessageLabel = getCountMessageLabel();
|
final Label countMessageLabel = getCountMessageLabel();
|
||||||
@@ -84,9 +81,14 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
|
|||||||
/**
|
/**
|
||||||
* Only in rollout group targets view count message is displayed.
|
* Only in rollout group targets view count message is displayed.
|
||||||
*
|
*
|
||||||
* @return
|
* @return true if count message has to be displayed
|
||||||
*/
|
*/
|
||||||
protected abstract boolean hasCountMessage();
|
protected abstract boolean hasCountMessage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the count message label.
|
||||||
|
*
|
||||||
|
* @return count message
|
||||||
|
*/
|
||||||
protected abstract Label getCountMessageLabel();
|
protected abstract Label getCountMessageLabel();
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.5.1/distro-source/core/src/gwt-module.dtd">
|
||||||
|
<module>
|
||||||
|
<!-- Inherit DefaultWidgetSet -->
|
||||||
|
<inherits name="com.vaadin.DefaultWidgetSet"/>
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
|
||||||
|
|
||||||
|
<inherits name="org.eclipse.hawkbit.ui.AppWidgetSet" />
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
|
||||||
|
|
||||||
|
<inherits name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
|
||||||
|
|
||||||
|
</module>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
|
||||||
|
|
||||||
|
import com.vaadin.client.connectors.ButtonRendererConnector;
|
||||||
|
import com.vaadin.shared.ui.Connect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A connector for {@link HtmlButtonRenderer}.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer.class)
|
||||||
|
public class HtmlButtonRendererConnector extends ButtonRendererConnector {
|
||||||
|
private static final long serialVersionUID = 7987417436367399331L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer getRenderer() {
|
||||||
|
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer) super.getRenderer();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||||
|
|
||||||
|
import com.vaadin.client.connectors.AbstractRendererConnector;
|
||||||
|
import com.vaadin.shared.ui.Connect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* A connector for {@link HtmlLabelRenderer}.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer.class)
|
||||||
|
public class HtmlLabelRendererConnector extends AbstractRendererConnector<String> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 7697966991925490786L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlLabelRenderer getRenderer() {
|
||||||
|
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlLabelRenderer) super.getRenderer();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||||
|
|
||||||
|
import com.vaadin.client.connectors.ButtonRendererConnector;
|
||||||
|
import com.vaadin.shared.ui.Connect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* A connector for {@link LinkRenderer}.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer.class)
|
||||||
|
public class LinkRendererConnector extends ButtonRendererConnector {
|
||||||
|
private static final long serialVersionUID = 7987417436367399331L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer getRenderer() {
|
||||||
|
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer) super.getRenderer();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client.renderers;
|
||||||
|
|
||||||
|
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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HtmlButtonRenderer extends ButtonRenderer {
|
||||||
|
@Override
|
||||||
|
public void render(RendererCellReference cell, String text, Button button) {
|
||||||
|
if (text != null) {
|
||||||
|
button.setHTML(text);
|
||||||
|
}
|
||||||
|
applystyles(button);
|
||||||
|
// this is to allow the button to disappear, if the text is null
|
||||||
|
button.setVisible(text != null);
|
||||||
|
button.getElement().setId("rollout.action.button.id");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applystyles(Button button) {
|
||||||
|
button.setStyleName(VButton.CLASSNAME);
|
||||||
|
button.addStyleName(getStyle("tiny"));
|
||||||
|
button.addStyleName(getStyle("borderless"));
|
||||||
|
button.addStyleName(getStyle("icon-only"));
|
||||||
|
button.addStyleName(getStyle("button-no-border"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getStyle(final String style) {
|
||||||
|
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client.renderers;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.vaadin.client.renderers.WidgetRenderer;
|
||||||
|
import com.vaadin.client.ui.VLabel;
|
||||||
|
import com.vaadin.client.widget.grid.RendererCellReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Renders label with provided value and style.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HtmlLabelRenderer extends WidgetRenderer<String, VLabel> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VLabel createWidget() {
|
||||||
|
return GWT.create(VLabel.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(RendererCellReference cell, String input, VLabel label) {
|
||||||
|
Map<String, String> map = formatInput(input);
|
||||||
|
String value = map.containsKey("value") ? map.get("value") : null;
|
||||||
|
String style = map.containsKey("style") ? map.get("style") : null;
|
||||||
|
String id = map.containsKey("id") ? map.get("id") : null;
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
label.setHTML("<span>&#x" + Integer.toHexString(Integer.parseInt(value)) + ";</span>");
|
||||||
|
} else {
|
||||||
|
label.setHTML("<span></span>");
|
||||||
|
}
|
||||||
|
applyStyle(label, style);
|
||||||
|
label.getElement().setId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyStyle(VLabel label, String style) {
|
||||||
|
label.setStyleName(VLabel.CLASSNAME);
|
||||||
|
label.addStyleName(getStyle("small"));
|
||||||
|
label.addStyleName(getStyle("font-icon"));
|
||||||
|
if (style != null) {
|
||||||
|
label.addStyleName(getStyle(style));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStyle(final String style) {
|
||||||
|
return new StringBuilder(style).append(" ").append(VLabel.CLASSNAME).append("-").append(style).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> formatInput(String input) {
|
||||||
|
Map<String, String> details = new HashMap<>();
|
||||||
|
String[] tempData = input.split(",");
|
||||||
|
for (String statusWithCount : tempData) {
|
||||||
|
String[] statusWithCountList = statusWithCount.split(":");
|
||||||
|
details.put(statusWithCountList[0], statusWithCountList[1]);
|
||||||
|
}
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.client.renderers;
|
||||||
|
|
||||||
|
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 link with provided text.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LinkRenderer extends ButtonRenderer {
|
||||||
|
@Override
|
||||||
|
public void render(RendererCellReference cell, String text, Button button) {
|
||||||
|
button.setText(text);
|
||||||
|
applystyle(button);
|
||||||
|
// this is to allow the button to disappear, if the text is null
|
||||||
|
button.setVisible(text != null);
|
||||||
|
button.getElement().setId(new StringBuilder("link").append(".").append(text).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applystyle(Button button) {
|
||||||
|
button.setStyleName(VButton.CLASSNAME);
|
||||||
|
button.addStyleName(getStyle("borderless"));
|
||||||
|
button.addStyleName(getStyle("small"));
|
||||||
|
button.addStyleName(getStyle("on-focus-no-border"));
|
||||||
|
button.addStyleName(getStyle("link"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStyle(final String style) {
|
||||||
|
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.renderers;
|
||||||
|
|
||||||
|
import com.vaadin.ui.renderers.ButtonRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Renders button with provided HTML content. Used to display button with icons.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HtmlButtonRenderer extends ButtonRenderer {
|
||||||
|
private static final long serialVersionUID = -1242995370043404892L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intialize button renderer.
|
||||||
|
*/
|
||||||
|
public HtmlButtonRenderer() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intialize button renderer with {@link RendererClickListener}
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
* RendererClickListener
|
||||||
|
*/
|
||||||
|
public HtmlButtonRenderer(RendererClickListener listener) {
|
||||||
|
super(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.renderers;
|
||||||
|
|
||||||
|
import com.vaadin.ui.Grid.AbstractRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Renders label with provided value and style.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HtmlLabelRenderer extends AbstractRenderer<String> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -7675588068526774915L;
|
||||||
|
/**
|
||||||
|
* Creates a new text renderer
|
||||||
|
*/
|
||||||
|
public HtmlLabelRenderer() {
|
||||||
|
super(String.class, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* 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.customrenderers.renderers;
|
||||||
|
|
||||||
|
import com.vaadin.ui.renderers.ButtonRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Renders link with provided text.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LinkRenderer extends ButtonRenderer {
|
||||||
|
private static final long serialVersionUID = -1242995370043404892L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intialise link renderer.
|
||||||
|
*/
|
||||||
|
public LinkRenderer() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intialise link renderer with {@link RendererClickListener}
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
* RendererClickListener
|
||||||
|
*/
|
||||||
|
public LinkRenderer(RendererClickListener listener) {
|
||||||
|
super(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -527,7 +527,7 @@ public class ActionHistoryTable extends TreeTable implements Handler {
|
|||||||
} else if (Action.Status.SCHEDULED == status) {
|
} else if (Action.Status.SCHEDULED == status) {
|
||||||
label.setStyleName(statusIconPending);
|
label.setStyleName(statusIconPending);
|
||||||
label.setDescription(i18n.get("label.scheduled"));
|
label.setDescription(i18n.get("label.scheduled"));
|
||||||
label.setValue(FontAwesome.BULLSEYE.getHtml());
|
label.setValue(FontAwesome.HOURGLASS_1.getHtml());
|
||||||
} else {
|
} else {
|
||||||
label.setDescription("");
|
label.setDescription("");
|
||||||
label.setValue("");
|
label.setValue("");
|
||||||
@@ -578,7 +578,7 @@ public class ActionHistoryTable extends TreeTable implements Handler {
|
|||||||
label.setContentMode(ContentMode.HTML);
|
label.setContentMode(ContentMode.HTML);
|
||||||
if (SPUIDefinitions.SCHEDULED.equals(activeValue)) {
|
if (SPUIDefinitions.SCHEDULED.equals(activeValue)) {
|
||||||
label.setDescription("Scheduled");
|
label.setDescription("Scheduled");
|
||||||
label.setValue(FontAwesome.BULLSEYE.getHtml());
|
label.setValue(FontAwesome.HOURGLASS_1.getHtml());
|
||||||
} else if (SPUIDefinitions.ACTIVE.equals(activeValue)) {
|
} else if (SPUIDefinitions.ACTIVE.equals(activeValue)) {
|
||||||
label.setDescription("Active");
|
label.setDescription("Active");
|
||||||
label.setStyleName("statusIconActive");
|
label.setStyleName("statusIconActive");
|
||||||
|
|||||||
@@ -1,116 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
|
||||||
*
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*/
|
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
|
||||||
|
|
||||||
import com.vaadin.data.Container;
|
|
||||||
import com.vaadin.ui.Table;
|
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract table class.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public abstract class AbstractSimpleTable extends Table {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 4856562746502217630L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the components.
|
|
||||||
*/
|
|
||||||
protected void init() {
|
|
||||||
addStyleName("sp-table rollout-table");
|
|
||||||
setSizeFull();
|
|
||||||
setImmediate(true);
|
|
||||||
setHeight(100.0f, Unit.PERCENTAGE);
|
|
||||||
addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
|
|
||||||
addStyleName(ValoTheme.TABLE_SMALL);
|
|
||||||
setSortEnabled(false);
|
|
||||||
setId(getTableId());
|
|
||||||
addCustomGeneratedColumns();
|
|
||||||
addNewContainerDS();
|
|
||||||
setColumnProperties();
|
|
||||||
addValueChangeListener(event -> onValueChange());
|
|
||||||
setPageLength(SPUIDefinitions.PAGE_SIZE);
|
|
||||||
setSelectable(false);
|
|
||||||
setColumnCollapsingAllowed(true);
|
|
||||||
setCollapsiblecolumns();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setColumnProperties() {
|
|
||||||
final List<TableColumn> columnList = getTableVisibleColumns();
|
|
||||||
final List<Object> columnIds = new ArrayList<>();
|
|
||||||
for (final TableColumn column : columnList) {
|
|
||||||
setColumnHeader(column.getColumnPropertyId(), column.getColumnHeader());
|
|
||||||
setColumnExpandRatio(column.getColumnPropertyId(), column.getExpandRatio());
|
|
||||||
columnIds.add(column.getColumnPropertyId());
|
|
||||||
}
|
|
||||||
setVisibleColumns(columnIds.toArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addNewContainerDS() {
|
|
||||||
final Container container = createContainer();
|
|
||||||
addContainerProperties(container);
|
|
||||||
setContainerDataSource(container);
|
|
||||||
int size = 0;
|
|
||||||
if (container != null) {
|
|
||||||
size = container.size();
|
|
||||||
}
|
|
||||||
if (size == 0) {
|
|
||||||
setData(SPUIDefinitions.NO_DATA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on table state (max/min) columns to be shown are returned.
|
|
||||||
*
|
|
||||||
* @return List<TableColumn> list of visible columns
|
|
||||||
*/
|
|
||||||
protected abstract List<TableColumn> getTableVisibleColumns();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create container of the data to be displayed by the table.
|
|
||||||
*/
|
|
||||||
protected abstract Container createContainer();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add container properties to the container passed in the reference.
|
|
||||||
*
|
|
||||||
* @param container
|
|
||||||
* reference of {@link Container}
|
|
||||||
*/
|
|
||||||
protected abstract void addContainerProperties(Container container);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Id of the table.
|
|
||||||
*
|
|
||||||
* @return Id.
|
|
||||||
*/
|
|
||||||
protected abstract String getTableId();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* On select of row.
|
|
||||||
*/
|
|
||||||
protected abstract void onValueChange();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add any generated columns if required.
|
|
||||||
*/
|
|
||||||
protected abstract void addCustomGeneratedColumns();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set list of columns collapsible.
|
|
||||||
*/
|
|
||||||
protected abstract void setCollapsiblecolumns();
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
/**
|
||||||
|
* 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.rollout;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
|
||||||
|
import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Distribution bar helper to render distribution bar in grid.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class DistributionBarHelper {
|
||||||
|
private static final int PARENT_SIZE_IN_PCT = 100;
|
||||||
|
private static final double MINIMUM_PART_SIZE = 10;
|
||||||
|
private static final String DISTRIBUTION_BAR_PART_MAIN_STYLE = GwtDistributionBar.CLASSNAME + "-part";
|
||||||
|
private static final String DISTRIBUTION_BAR_PART_CLASSNAME_PREFIX = GwtDistributionBar.CLASSNAME + "-part-";
|
||||||
|
private static final String DISTRIBUTION_BAR_PART_VALUE_CLASSNAME = GwtDistributionBar.CLASSNAME + "-value";
|
||||||
|
private static final String UNINITIALIZED_VALUE_CLASSNAME = GwtDistributionBar.CLASSNAME + "-uninitizalized";
|
||||||
|
|
||||||
|
private DistributionBarHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string with details of status and count .
|
||||||
|
*
|
||||||
|
* @param statusTotalCountMap
|
||||||
|
* map with status and count
|
||||||
|
*
|
||||||
|
* @return string of format "status1:count,status2:count"
|
||||||
|
*/
|
||||||
|
public static String getDistributionBarAsHTMLString(Map<Status, Long> statusTotalCountMap) {
|
||||||
|
StringBuilder htmlString = new StringBuilder();
|
||||||
|
Map<Status, Long> statusMapWithNonZeroValues = getStatusMapWithNonZeroValues(statusTotalCountMap);
|
||||||
|
Long totalValue = getTotalSizes(statusTotalCountMap);
|
||||||
|
if (statusMapWithNonZeroValues.size() <= 0) {
|
||||||
|
return getUnintialisedBar();
|
||||||
|
}
|
||||||
|
int partIndex = 1;
|
||||||
|
htmlString.append(getParentDivStart());
|
||||||
|
for (Map.Entry<Status, Long> entry : statusMapWithNonZeroValues.entrySet()) {
|
||||||
|
if (entry.getValue() > 0) {
|
||||||
|
htmlString.append(getPart(partIndex, entry.getKey(), entry.getValue(), totalValue,
|
||||||
|
statusMapWithNonZeroValues.size()));
|
||||||
|
partIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
htmlString.append(getParentDivEnd());
|
||||||
|
return htmlString.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the map with status having non zero values.
|
||||||
|
*
|
||||||
|
* @param statusTotalCountMap
|
||||||
|
* map with status and count
|
||||||
|
* @return map with non zero values
|
||||||
|
*/
|
||||||
|
public static Map<Status, Long> getStatusMapWithNonZeroValues(Map<Status, Long> statusTotalCountMap) {
|
||||||
|
return statusTotalCountMap.entrySet().stream().filter(p -> p.getValue() > 0)
|
||||||
|
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns tool tip for progress bar.
|
||||||
|
*
|
||||||
|
* @param statusCountMap
|
||||||
|
* map with status and count details
|
||||||
|
* @return tool tip
|
||||||
|
*/
|
||||||
|
public static String getTooltip(Map<Status, Long> statusCountMap) {
|
||||||
|
Map<Status, Long> nonZeroStatusCountMap = DistributionBarHelper.getStatusMapWithNonZeroValues(statusCountMap);
|
||||||
|
StringBuilder tooltip = new StringBuilder();
|
||||||
|
for (Entry<Status, Long> entry : nonZeroStatusCountMap.entrySet()) {
|
||||||
|
tooltip.append(entry.getKey().toString().toLowerCase()).append(" : ").append(entry.getValue())
|
||||||
|
.append("<br>");
|
||||||
|
}
|
||||||
|
return tooltip.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPartStyle(int partIndex, int noOfParts, String customStyle) {
|
||||||
|
StringBuilder mainStyle = new StringBuilder();
|
||||||
|
StringBuilder styleName = new StringBuilder(GwtDistributionBar.CLASSNAME);
|
||||||
|
if (noOfParts == 1) {
|
||||||
|
styleName.append("-only");
|
||||||
|
} else if (partIndex == 1) {
|
||||||
|
styleName.append("-left");
|
||||||
|
} else if (partIndex == noOfParts) {
|
||||||
|
styleName.append("-right");
|
||||||
|
} else {
|
||||||
|
styleName.append("-middle");
|
||||||
|
}
|
||||||
|
mainStyle.append(styleName).append(" ");
|
||||||
|
mainStyle.append(DISTRIBUTION_BAR_PART_MAIN_STYLE).append(" ");
|
||||||
|
mainStyle.append(DISTRIBUTION_BAR_PART_CLASSNAME_PREFIX + partIndex);
|
||||||
|
if (customStyle != null) {
|
||||||
|
mainStyle.append(" ").append("status-bar-part-" + customStyle);
|
||||||
|
}
|
||||||
|
return mainStyle.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPartWidth(Long value, Long totalValue, int noOfParts) {
|
||||||
|
final double minTotalSize = MINIMUM_PART_SIZE * noOfParts;
|
||||||
|
final double availableSize = PARENT_SIZE_IN_PCT - minTotalSize;
|
||||||
|
double val = MINIMUM_PART_SIZE + (double) value / totalValue * availableSize;
|
||||||
|
return String.format("%.3f", val) + "%";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPart(int partIndex, Status status, Long value, Long totalValue, int noOfParts) {
|
||||||
|
String partValue = status.toString().toLowerCase();
|
||||||
|
return "<div class=\"" + getPartStyle(partIndex, noOfParts, partValue) + "\" style=\"width: "
|
||||||
|
+ getPartWidth(value, totalValue, noOfParts) + ";\"><span class=\""
|
||||||
|
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">" + value + "</span></div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getUnintialisedBar() {
|
||||||
|
return "<div class=\"" + UNINITIALIZED_VALUE_CLASSNAME + "\" style=\"width: 100%;\"><span class=\""
|
||||||
|
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">uninitialized</span></div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Long getTotalSizes(Map<Status, Long> statusTotalCountMap) {
|
||||||
|
Long total = 0L;
|
||||||
|
for (Long value : statusTotalCountMap.values()) {
|
||||||
|
total = total + value;
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getParentDivStart() {
|
||||||
|
return "<div class=\"" + GwtDistributionBar.CLASSNAME
|
||||||
|
+ "\" style=\"width: 100%; height: 100%;\" id=\"rollout.status.progress.bar.id\">";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getParentDivEnd() {
|
||||||
|
return "</div>";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,361 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
|
||||||
*
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*/
|
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import javax.annotation.PreDestroy;
|
|
||||||
|
|
||||||
import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent;
|
|
||||||
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
|
||||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
|
||||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
|
||||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
|
||||||
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.alump.distributionbar.DistributionBar;
|
|
||||||
import org.vaadin.spring.events.EventBus;
|
|
||||||
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.Property;
|
|
||||||
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.Label;
|
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rollout Group Table in List view.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@SpringComponent
|
|
||||||
@ViewScope
|
|
||||||
public class RolloutGroupListTable extends AbstractSimpleTable {
|
|
||||||
|
|
||||||
private static final String IS_ACTION_RECIEVED = "isActionRecieved";
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1182656768844867443L;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private I18N i18n;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient EventBus.SessionEventBus eventBus;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutGroupManagement rolloutGroupManagement;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutManagement rolloutManagement;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutUIState rolloutUIState;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient SpPermissionChecker permissionChecker;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@PostConstruct
|
|
||||||
protected void init() {
|
|
||||||
super.init();
|
|
||||||
eventBus.subscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreDestroy
|
|
||||||
void destroy() {
|
|
||||||
eventBus.unsubscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
|
||||||
void onEvent(final RolloutEvent event) {
|
|
||||||
if (event == RolloutEvent.SHOW_ROLLOUT_GROUPS) {
|
|
||||||
((LazyQueryContainer) getContainerDataSource()).refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Handles the RolloutGroupChangeEvent to refresh the item in the table.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param rolloutGroupChangeEvent
|
|
||||||
* the event which contains the rollout group which has been
|
|
||||||
* change
|
|
||||||
*/
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
|
||||||
public void onEvent(final RolloutGroupChangeEvent rolloutGroupChangeEvent) {
|
|
||||||
final List<Object> visibleItemIds = (List<Object>) getVisibleItemIds();
|
|
||||||
if (visibleItemIds.contains(rolloutGroupChangeEvent.getRolloutGroupId())) {
|
|
||||||
final RolloutGroup rolloutGroup = rolloutGroupManagement
|
|
||||||
.findRolloutGroupWithDetailedStatus(rolloutGroupChangeEvent.getRolloutGroupId());
|
|
||||||
final TotalTargetCountStatus totalTargetCountStatus = rolloutGroup.getTotalTargetCountStatus();
|
|
||||||
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
|
|
||||||
final Item item = rolloutContainer.getItem(rolloutGroup.getId());
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR)
|
|
||||||
.setValue(totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
|
|
||||||
item.getItemProperty(IS_ACTION_RECIEVED)
|
|
||||||
.setValue(!(Boolean) item.getItemProperty(IS_ACTION_RECIEVED).getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<TableColumn> getTableVisibleColumns() {
|
|
||||||
final List<TableColumn> columnList = new ArrayList<>();
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_NAME, i18n.get("header.name"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_STATUS, i18n.get("header.status"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.DETAIL_STATUS, i18n.get("header.detail.status"), 0.42f));
|
|
||||||
columnList
|
|
||||||
.add(new TableColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS, i18n.get("header.total.targets"), 0.08f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE,
|
|
||||||
i18n.get("header.rolloutgroup.installed.percentage"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD,
|
|
||||||
i18n.get("header.rolloutgroup.threshold.error"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_THRESHOLD,
|
|
||||||
i18n.get("header.rolloutgroup.threshold"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.15f));
|
|
||||||
return columnList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Container createContainer() {
|
|
||||||
final BeanQueryFactory<RolloutGroupBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutGroupBeanQuery.class);
|
|
||||||
return new LazyQueryContainer(
|
|
||||||
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addContainerProperties(final Container container) {
|
|
||||||
final LazyQueryContainer rolloutTableContainer = (LazyQueryContainer) container;
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_ID, String.class, null, false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE, String.class,
|
|
||||||
null, false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class, null,
|
|
||||||
false, false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null, false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR, Long.class, 0L, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(IS_ACTION_RECIEVED, Boolean.class, false, false, false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTableId() {
|
|
||||||
return SPUIComponetIdProvider.ROLLOUT_GROUP_LIST_TABLE_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onValueChange() {
|
|
||||||
/**
|
|
||||||
* No implementation required.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addCustomGeneratedColumns() {
|
|
||||||
addGeneratedColumn(SPUIDefinitions.ROLLOUT_GROUP_NAME,
|
|
||||||
(source, itemId, columnId) -> getRolloutNameLink(itemId));
|
|
||||||
addGeneratedColumn(SPUIDefinitions.ROLLOUT_GROUP_STATUS, (source, itemId, columnId) -> getStatusLabel(itemId));
|
|
||||||
addGeneratedColumn(SPUIDefinitions.DETAIL_STATUS, (source, itemId, columnId) -> getProgressBar(itemId));
|
|
||||||
setColumnAlignment(SPUIDefinitions.ROLLOUT_GROUP_STATUS, Align.CENTER);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private Label getStatusLabel(final Object itemId) {
|
|
||||||
final Label statusLabel = new Label();
|
|
||||||
statusLabel.setHeightUndefined();
|
|
||||||
statusLabel.setContentMode(ContentMode.HTML);
|
|
||||||
setStatusIcon(itemId, statusLabel);
|
|
||||||
statusLabel.setDescription(getDescription(itemId));
|
|
||||||
statusLabel.setSizeUndefined();
|
|
||||||
addPropertyChangeListener(itemId, statusLabel);
|
|
||||||
return statusLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addPropertyChangeListener(final Object itemId, final Label statusLabel) {
|
|
||||||
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
|
|
||||||
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
|
|
||||||
notifier.addValueChangeListener(new ValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
|
|
||||||
setStatusIcon(itemId, statusLabel);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getDescription(final Object itemId) {
|
|
||||||
final Item item = getItem(itemId);
|
|
||||||
if (item != null) {
|
|
||||||
final RolloutGroupStatus rolloutGroupStatus = (RolloutGroupStatus) item
|
|
||||||
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
|
|
||||||
return rolloutGroupStatus.toString().toLowerCase();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setStatusIcon(final Object itemId, final Label statusLabel) {
|
|
||||||
final Item item = getItem(itemId);
|
|
||||||
if (item != null) {
|
|
||||||
final RolloutGroupStatus rolloutGroupStatus = (RolloutGroupStatus) item
|
|
||||||
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
|
|
||||||
setRolloutStatusIcon(rolloutGroupStatus, statusLabel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRolloutStatusIcon(final RolloutGroupStatus rolloutGroupStatus, final Label statusLabel) {
|
|
||||||
switch (rolloutGroupStatus) {
|
|
||||||
case FINISHED:
|
|
||||||
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconGreen");
|
|
||||||
break;
|
|
||||||
case SCHEDULED:
|
|
||||||
statusLabel.setValue(FontAwesome.BULLSEYE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconBlue");
|
|
||||||
break;
|
|
||||||
case RUNNING:
|
|
||||||
statusLabel.setValue(FontAwesome.ADJUST.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconYellow");
|
|
||||||
break;
|
|
||||||
case READY:
|
|
||||||
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconLightBlue");
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconRed");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Component getRolloutNameLink(final Object itemId) {
|
|
||||||
final Item row = getItem(itemId);
|
|
||||||
final String rolloutGroupName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
if (permissionChecker.hasRolloutTargetsReadPermission()) {
|
|
||||||
final Button rolloutGroupNameLink = SPUIComponentProvider.getButton(getDetailLinkId(rolloutGroupName),
|
|
||||||
rolloutGroupName, SPUILabelDefinitions.SHOW_ROLLOUT_GROUP_DETAILS, null, false, null,
|
|
||||||
SPUIButtonStyleSmallNoBorder.class);
|
|
||||||
rolloutGroupNameLink.setData(rolloutGroupName);
|
|
||||||
rolloutGroupNameLink.addStyleName(ValoTheme.LINK_SMALL + " " + "on-focus-no-border link");
|
|
||||||
rolloutGroupNameLink.addClickListener(event -> showRolloutGroups(itemId));
|
|
||||||
return rolloutGroupNameLink;
|
|
||||||
} else {
|
|
||||||
final Label rolloutGroupNameLabel = new Label();
|
|
||||||
rolloutGroupNameLabel.setHeightUndefined();
|
|
||||||
rolloutGroupNameLabel.addStyleName(ValoTheme.LABEL_SMALL);
|
|
||||||
rolloutGroupNameLabel.setValue(rolloutGroupName);
|
|
||||||
return rolloutGroupNameLabel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showRolloutGroups(final Object itemId) {
|
|
||||||
rolloutUIState.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) itemId));
|
|
||||||
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DistributionBar getProgressBar(final Object itemId) {
|
|
||||||
final DistributionBar bar = new DistributionBar(2);
|
|
||||||
bar.setSizeFull();
|
|
||||||
bar.setZeroSizedVisible(false);
|
|
||||||
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
|
|
||||||
addPropertyChangeListenerOnActionRecieved(itemId, bar);
|
|
||||||
return bar;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addPropertyChangeListenerOnActionRecieved(final Object itemId, final DistributionBar bar) {
|
|
||||||
final Property status = getContainerProperty(itemId, IS_ACTION_RECIEVED);
|
|
||||||
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
|
|
||||||
notifier.addValueChangeListener(new ValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
|
|
||||||
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getDetailLinkId(final String rolloutGroupName) {
|
|
||||||
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_GROUP_NAME_LINK_ID).append('.').append(rolloutGroupName)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setCollapsiblecolumns() {
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_DATE, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_DATE, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_USER, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_BY, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
|
||||||
*
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*/
|
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import javax.annotation.PreDestroy;
|
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.model.Action.Status;
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
|
||||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
|
||||||
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.spring.events.EventBus;
|
|
||||||
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.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.Label;
|
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rollout Group Targets Table in List view.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@SpringComponent
|
|
||||||
@ViewScope
|
|
||||||
public class RolloutGroupTargetsListTable extends AbstractSimpleTable {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 7984314603271801746L;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private I18N i18n;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient EventBus.SessionEventBus eventBus;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutUIState rolloutUIState;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@PostConstruct
|
|
||||||
protected void init() {
|
|
||||||
super.init();
|
|
||||||
eventBus.subscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreDestroy
|
|
||||||
void destroy() {
|
|
||||||
eventBus.unsubscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
|
||||||
void onEvent(final RolloutEvent event) {
|
|
||||||
if (event == RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS) {
|
|
||||||
((LazyQueryContainer) getContainerDataSource()).refresh();
|
|
||||||
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS_COUNT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<TableColumn> getTableVisibleColumns() {
|
|
||||||
final List<TableColumn> columnList = new ArrayList<>();
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.15f));
|
|
||||||
columnList
|
|
||||||
.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.15f));
|
|
||||||
columnList.add(
|
|
||||||
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.15f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.15f));
|
|
||||||
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_TARGET_STATUS, i18n.get("header.status"), 0.1f));
|
|
||||||
|
|
||||||
return columnList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Container createContainer() {
|
|
||||||
final BeanQueryFactory<RolloutGroupTargetsBeanQuery> rolloutgrouBeanQueryFactory = new BeanQueryFactory<>(
|
|
||||||
RolloutGroupTargetsBeanQuery.class);
|
|
||||||
return new LazyQueryContainer(
|
|
||||||
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID),
|
|
||||||
rolloutgrouBeanQueryFactory);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addContainerProperties(final Container container) {
|
|
||||||
final LazyQueryContainer rolloutGroupTargetTableContainer = (LazyQueryContainer) container;
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CONT_ID, String.class, "", false,
|
|
||||||
false);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false,
|
|
||||||
true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, Status.class,
|
|
||||||
Status.RETRIEVED, false, false);
|
|
||||||
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TARGET_STATUS,
|
|
||||||
TargetUpdateStatus.class, TargetUpdateStatus.UNKNOWN, false, false);
|
|
||||||
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.ASSIGNED_DISTRIBUTION_NAME_VER,
|
|
||||||
String.class, "", false, true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_BY, String.class, null,
|
|
||||||
false, true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, String.class,
|
|
||||||
null, false, true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null,
|
|
||||||
false, true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class,
|
|
||||||
null, false, true);
|
|
||||||
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, "", false,
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTableId() {
|
|
||||||
|
|
||||||
return SPUIComponetIdProvider.ROLLOUT_GROUP_TARGETS_LIST_TABLE_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onValueChange() {
|
|
||||||
// No implementation required.
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addCustomGeneratedColumns() {
|
|
||||||
addGeneratedColumn(SPUILabelDefinitions.VAR_TARGET_STATUS,
|
|
||||||
(source, itemId, columnId) -> getStatusLabel(itemId));
|
|
||||||
setColumnAlignment(SPUILabelDefinitions.VAR_TARGET_STATUS, Align.CENTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setCollapsiblecolumns() {
|
|
||||||
// No implementation required.
|
|
||||||
}
|
|
||||||
|
|
||||||
private Label getStatusLabel(final Object itemId) {
|
|
||||||
final Label statusLabel = new Label();
|
|
||||||
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
|
|
||||||
statusLabel.setHeightUndefined();
|
|
||||||
statusLabel.setContentMode(ContentMode.HTML);
|
|
||||||
setStatusIcon(itemId, statusLabel);
|
|
||||||
statusLabel.setSizeUndefined();
|
|
||||||
return statusLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setStatusIcon(final Object itemId, final Label statusLabel) {
|
|
||||||
final Item item = getItem(itemId);
|
|
||||||
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
|
|
||||||
? rolloutUIState.getRolloutGroup().get() : null;
|
|
||||||
if (item != null) {
|
|
||||||
final Status status = (Status) item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
|
|
||||||
if (status == null) {
|
|
||||||
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
|
|
||||||
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconLightBlue");
|
|
||||||
statusLabel.setDescription(RolloutGroupStatus.READY.toString().toLowerCase());
|
|
||||||
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
|
|
||||||
statusLabel.setValue(FontAwesome.MINUS_CIRCLE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconBlue");
|
|
||||||
|
|
||||||
final String dsNameVersion = (String) item
|
|
||||||
.getItemProperty(SPUILabelDefinitions.ASSIGNED_DISTRIBUTION_NAME_VER).getValue();
|
|
||||||
statusLabel
|
|
||||||
.setDescription(i18n.get("message.dist.already.assigned", new Object[] { dsNameVersion }));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setRolloutStatusIcon(status, statusLabel);
|
|
||||||
statusLabel.setDescription(status.toString().toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRolloutStatusIcon(final Status targetUpdateStatus, final Label statusLabel) {
|
|
||||||
switch (targetUpdateStatus) {
|
|
||||||
case ERROR:
|
|
||||||
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconRed");
|
|
||||||
break;
|
|
||||||
case SCHEDULED:
|
|
||||||
statusLabel.setValue(FontAwesome.BULLSEYE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconBlue");
|
|
||||||
break;
|
|
||||||
case FINISHED:
|
|
||||||
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconGreen");
|
|
||||||
break;
|
|
||||||
case RUNNING:
|
|
||||||
case RETRIEVED:
|
|
||||||
case WARNING:
|
|
||||||
case DOWNLOAD:
|
|
||||||
statusLabel.setValue(FontAwesome.ADJUST.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconYellow");
|
|
||||||
break;
|
|
||||||
case CANCELED:
|
|
||||||
statusLabel.setValue(FontAwesome.TIMES_CIRCLE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconGreen");
|
|
||||||
break;
|
|
||||||
case CANCELING:
|
|
||||||
statusLabel.setValue(FontAwesome.TIMES_CIRCLE.getHtml());
|
|
||||||
statusLabel.addStyleName("statusIconPending");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,552 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
|
|
||||||
*
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*/
|
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
|
||||||
import javax.annotation.PreDestroy;
|
|
||||||
|
|
||||||
import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent;
|
|
||||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
|
||||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
|
||||||
import org.eclipse.hawkbit.repository.model.Rollout;
|
|
||||||
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
|
|
||||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.I18N;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.TableColumn;
|
|
||||||
import org.eclipse.hawkbit.ui.utils.UINotification;
|
|
||||||
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.alump.distributionbar.DistributionBar;
|
|
||||||
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.EventBus;
|
|
||||||
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.Property;
|
|
||||||
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.Button.ClickEvent;
|
|
||||||
import com.vaadin.ui.Label;
|
|
||||||
import com.vaadin.ui.UI;
|
|
||||||
import com.vaadin.ui.Window;
|
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Rollout table in list view.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@SpringComponent
|
|
||||||
@ViewScope
|
|
||||||
public class RolloutListTable extends AbstractSimpleTable {
|
|
||||||
|
|
||||||
private static final String IS_ACTION_RECIEVED = "isActionRecieved";
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 8141874975649180139L;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private I18N i18n;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient EventBus.SessionEventBus eventBus;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutManagement rolloutManagement;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AddUpdateRolloutWindowLayout addUpdateRolloutWindow;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UINotification uiNotification;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient RolloutUIState rolloutUIState;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private transient SpPermissionChecker permissionChecker;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@PostConstruct
|
|
||||||
protected void init() {
|
|
||||||
super.init();
|
|
||||||
eventBus.subscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreDestroy
|
|
||||||
void destroy() {
|
|
||||||
eventBus.unsubscribe(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
|
||||||
void onEvent(final RolloutEvent event) {
|
|
||||||
if (event == RolloutEvent.FILTER_BY_TEXT || event == RolloutEvent.CREATE_ROLLOUT
|
|
||||||
|| event == RolloutEvent.UPDATE_ROLLOUT || event == RolloutEvent.SHOW_ROLLOUTS) {
|
|
||||||
refreshTable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the RolloutChangeEvent to refresh the item in the table.
|
|
||||||
*
|
|
||||||
* @param rolloutChangeEvent
|
|
||||||
* the event which contains the rollout which has been changed
|
|
||||||
*/
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
|
||||||
public void onEvent(final RolloutChangeEvent rolloutChangeEvent) {
|
|
||||||
final List<Object> visibleItemIds = (List<Object>) getVisibleItemIds();
|
|
||||||
if (visibleItemIds.contains(rolloutChangeEvent.getRolloutId())) {
|
|
||||||
final Rollout rollout = rolloutManagement.findRolloutWithDetailedStatus(rolloutChangeEvent.getRolloutId());
|
|
||||||
final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();
|
|
||||||
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
|
|
||||||
final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId());
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());
|
|
||||||
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED).setValue(
|
|
||||||
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
|
|
||||||
item.getItemProperty(IS_ACTION_RECIEVED).setValue(
|
|
||||||
!(Boolean) item.getItemProperty(IS_ACTION_RECIEVED).getValue());
|
|
||||||
|
|
||||||
final Long groupCount = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).getValue();
|
|
||||||
if (null != rollout.getRolloutGroups() && groupCount != rollout.getRolloutGroups().size()) {
|
|
||||||
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setValue(
|
|
||||||
Long.valueOf(rollout.getRolloutGroups().size()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<TableColumn> getTableVisibleColumns() {
|
|
||||||
final List<TableColumn> columnList = new ArrayList<>();
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_NAME, i18n.get("header.name"), 0.225f));
|
|
||||||
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, i18n.get("header.distributionset"),
|
|
||||||
0.225f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_STATUS, i18n.get("header.status"), 0.07f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.DETAIL_STATUS, i18n.get("header.detail.status"), 0.58f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, i18n.get("header.numberofgroups"),
|
|
||||||
0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS, i18n.get("header.total.targets"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_ACTION, i18n.get("upload.action"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1f));
|
|
||||||
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.1f));
|
|
||||||
return columnList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Container createContainer() {
|
|
||||||
final BeanQueryFactory<RolloutBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutBeanQuery.class);
|
|
||||||
return new LazyQueryContainer(new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE,
|
|
||||||
SPUILabelDefinitions.VAR_ID), rolloutQf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addContainerProperties(final Container container) {
|
|
||||||
final LazyQueryContainer rolloutTableContainer = (LazyQueryContainer) container;
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_ID, String.class, null, false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, String.class, null,
|
|
||||||
false, false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TARGETFILTERQUERY, String.class, null,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR, Long.class, 0L, false,
|
|
||||||
false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED, Long.class, 0L,
|
|
||||||
false, false);
|
|
||||||
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
|
|
||||||
false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTableId() {
|
|
||||||
return SPUIComponetIdProvider.ROLLOUT_LIST_TABLE_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onValueChange() {
|
|
||||||
/**
|
|
||||||
* No implementation required.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void addCustomGeneratedColumns() {
|
|
||||||
addGeneratedColumn(SPUIDefinitions.ROLLOUT_NAME, (source, itemId, columnId) -> getRolloutNameLink(itemId));
|
|
||||||
addGeneratedColumn(SPUIDefinitions.ROLLOUT_STATUS, (source, itemId, columnId) -> getStatusLabel(itemId));
|
|
||||||
addGeneratedColumn(SPUIDefinitions.DETAIL_STATUS, (source, itemId, columnId) -> getProgressBar(itemId));
|
|
||||||
addGeneratedColumn(SPUIDefinitions.ROLLOUT_ACTION, (source, itemId, columnId) -> getActionButton(itemId));
|
|
||||||
|
|
||||||
setColumnAlignment(SPUIDefinitions.ROLLOUT_STATUS, Align.CENTER);
|
|
||||||
setColumnAlignment(SPUIDefinitions.DETAIL_STATUS, Align.CENTER);
|
|
||||||
setColumnAlignment(SPUIDefinitions.ROLLOUT_ACTION, Align.CENTER);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void setCollapsiblecolumns() {
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_DATE, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_DATE, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_USER, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_BY, true);
|
|
||||||
setColumnCollapsed(SPUILabelDefinitions.VAR_DESC, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Button getActionButton(final Object itemId) {
|
|
||||||
final Item row = getItem(itemId);
|
|
||||||
final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
final Button actionButton = SPUIComponentProvider.getButton(getActionButtonId(rolloutName), "",
|
|
||||||
SPUILabelDefinitions.ACTION, ValoTheme.BUTTON_TINY + " ", true, FontAwesome.CIRCLE_O,
|
|
||||||
SPUIButtonStyleSmallNoBorder.class);
|
|
||||||
actionButton.setData(itemId);
|
|
||||||
actionButton.setHtmlContentAllowed(true);
|
|
||||||
actionButton.addClickListener(event -> onAction(event));
|
|
||||||
addStatusPropertyChangeListener(itemId, actionButton);
|
|
||||||
|
|
||||||
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
|
|
||||||
.getValue();
|
|
||||||
enableDisableActions(rolloutStatus, actionButton);
|
|
||||||
return actionButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void enableDisableActions(final RolloutStatus rolloutStatus, final Button actionButton) {
|
|
||||||
final RolloutStatus[] statusList = new RolloutStatus[] { RolloutStatus.FINISHED, RolloutStatus.STARTING,
|
|
||||||
RolloutStatus.CREATING, RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING };
|
|
||||||
if (Arrays.asList(statusList).contains(rolloutStatus)) {
|
|
||||||
actionButton.setEnabled(false);
|
|
||||||
} else {
|
|
||||||
actionButton.setEnabled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addStatusPropertyChangeListener(final Object itemId, final Button actionButton) {
|
|
||||||
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
|
|
||||||
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
|
|
||||||
notifier.addValueChangeListener(new ValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
|
|
||||||
final Item row = getItem(itemId);
|
|
||||||
final RolloutStatus rolloutStatus = (RolloutStatus) row
|
|
||||||
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
|
|
||||||
enableDisableActions(rolloutStatus, actionButton);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private ContextMenu createContextMenu(final Long rolloutId) {
|
|
||||||
final Item row = getItem(rolloutId);
|
|
||||||
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
|
|
||||||
.getValue();
|
|
||||||
final ContextMenu context = new ContextMenu();
|
|
||||||
context.addItemClickListener(event -> menuItemClicked(event));
|
|
||||||
if (rolloutStatus == RolloutStatus.READY) {
|
|
||||||
final ContextMenuItem startItem = context.addItem("Start");
|
|
||||||
startItem.setData(new ContextMenuData(rolloutId, ACTION.START));
|
|
||||||
} else if (rolloutStatus == RolloutStatus.RUNNING) {
|
|
||||||
final ContextMenuItem pauseItem = context.addItem("Pause");
|
|
||||||
pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));
|
|
||||||
} else if (rolloutStatus == RolloutStatus.PAUSED) {
|
|
||||||
final ContextMenuItem resumeItem = context.addItem("Resume");
|
|
||||||
resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME));
|
|
||||||
} else if (rolloutStatus == RolloutStatus.STARTING || rolloutStatus == RolloutStatus.CREATING) {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
if (permissionChecker.hasRolloutUpdatePermission()) {
|
|
||||||
final ContextMenuItem cancelItem = context.addItem("Update");
|
|
||||||
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void menuItemClicked(final ContextMenuItemClickEvent event) {
|
|
||||||
final ContextMenuItem item = (ContextMenuItem) event.getSource();
|
|
||||||
final ContextMenuData contextMenuData = (ContextMenuData) item.getData();
|
|
||||||
final Item row = getItem(contextMenuData.getRolloutId());
|
|
||||||
final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
|
|
||||||
if (contextMenuData.getAction() == ACTION.PAUSE) {
|
|
||||||
rolloutManagement.pauseRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId()));
|
|
||||||
uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName));
|
|
||||||
} else if (contextMenuData.getAction() == ACTION.RESUME) {
|
|
||||||
rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId()));
|
|
||||||
uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName));
|
|
||||||
} else if (contextMenuData.getAction() == ACTION.START) {
|
|
||||||
rolloutManagement.startRolloutAsync(rolloutManagement.findRolloutByName(rolloutName));
|
|
||||||
uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName));
|
|
||||||
} else if (contextMenuData.getAction() == ACTION.UPDATE) {
|
|
||||||
addUpdateRolloutWindow.populateData(contextMenuData.getRolloutId());
|
|
||||||
final Window addTargetWindow = addUpdateRolloutWindow.getWindow();
|
|
||||||
addTargetWindow.setCaption(i18n.get("caption.update.rollout"));
|
|
||||||
UI.getCurrent().addWindow(addTargetWindow);
|
|
||||||
addTargetWindow.setVisible(Boolean.TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onAction(final ClickEvent event) {
|
|
||||||
final ContextMenu contextMenu = createContextMenu((Long) event.getButton().getData());
|
|
||||||
contextMenu.setAsContextMenuOf(event.getButton());
|
|
||||||
contextMenu.open(event.getClientX(), event.getClientY());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Button getRolloutNameLink(final Object itemId) {
|
|
||||||
final Item row = getItem(itemId);
|
|
||||||
final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
final Button updateIcon = SPUIComponentProvider.getButton(getDetailLinkId(rolloutName), rolloutName,
|
|
||||||
SPUILabelDefinitions.SHOW_ROLLOUT_GROUP_DETAILS, null, false, null, SPUIButtonStyleSmallNoBorder.class);
|
|
||||||
updateIcon.setData(rolloutName);
|
|
||||||
updateIcon.addStyleName(ValoTheme.LINK_SMALL + " " + "on-focus-no-border link");
|
|
||||||
updateIcon.addClickListener(event -> showRolloutGroups(itemId));
|
|
||||||
return updateIcon;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showRolloutGroups(final Object itemId) {
|
|
||||||
rolloutUIState.setRolloutId((long) itemId);
|
|
||||||
final String rolloutName = (String) getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
rolloutUIState.setRolloutName(rolloutName);
|
|
||||||
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getActionButtonId(final String rollOutName) {
|
|
||||||
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_ACTION_BUTTON_ID).append('.').append(rollOutName)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getDetailLinkId(final String rollOutName) {
|
|
||||||
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_NAME_LINK_ID).append('.').append(rollOutName)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private DistributionBar getProgressBar(final Object itemId) {
|
|
||||||
final DistributionBar bar = new DistributionBar(2);
|
|
||||||
bar.setId(SPUIComponetIdProvider.ROLLOUT_PROGRESS_BAR);
|
|
||||||
bar.setSizeFull();
|
|
||||||
bar.setZeroSizedVisible(false);
|
|
||||||
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
|
|
||||||
addPropertyChangeListenerOnActionRecieved(itemId, bar);
|
|
||||||
return bar;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addPropertyChangeListenerOnActionRecieved(final Object itemId, final DistributionBar bar) {
|
|
||||||
final Property status = getContainerProperty(itemId, IS_ACTION_RECIEVED);
|
|
||||||
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
|
|
||||||
notifier.addValueChangeListener(new ValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
|
|
||||||
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private Label getStatusLabel(final Object itemId) {
|
|
||||||
final Label statusLabel = new Label();
|
|
||||||
statusLabel.setHeightUndefined();
|
|
||||||
statusLabel.setContentMode(ContentMode.HTML);
|
|
||||||
statusLabel.setId(getRolloutStatusId(itemId));
|
|
||||||
setStatusIcon(itemId, statusLabel);
|
|
||||||
statusLabel.setSizeUndefined();
|
|
||||||
addPropertyChangeListener(itemId, statusLabel);
|
|
||||||
return statusLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addPropertyChangeListener(final Object itemId, final Label statusLabel) {
|
|
||||||
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
|
|
||||||
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
|
|
||||||
notifier.addValueChangeListener(new ValueChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
|
|
||||||
setStatusIcon(itemId, statusLabel);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRolloutStatusId(final Object itemId) {
|
|
||||||
final String rolloutName = (String) getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
|
||||||
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID).append(".").append(rolloutName)
|
|
||||||
.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setStatusIcon(final Object itemId, final Label statusLabel) {
|
|
||||||
final Item item = getItem(itemId);
|
|
||||||
if (item != null) {
|
|
||||||
final RolloutStatus rolloutStatus = (RolloutStatus) item.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
|
|
||||||
.getValue();
|
|
||||||
setRolloutStatusIcon(rolloutStatus, statusLabel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setRolloutStatusIcon(final RolloutStatus rolloutStatus, final Label statusLabel) {
|
|
||||||
statusLabel.setDescription(rolloutStatus.toString().toLowerCase());
|
|
||||||
switch (rolloutStatus) {
|
|
||||||
case FINISHED:
|
|
||||||
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconGreen");
|
|
||||||
break;
|
|
||||||
case PAUSED:
|
|
||||||
statusLabel.setValue(FontAwesome.PAUSE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconBlue");
|
|
||||||
break;
|
|
||||||
case RUNNING:
|
|
||||||
statusLabel.setValue(null);
|
|
||||||
statusLabel.setStyleName("yellowSpinner");
|
|
||||||
break;
|
|
||||||
case READY:
|
|
||||||
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconLightBlue");
|
|
||||||
break;
|
|
||||||
case STOPPED:
|
|
||||||
statusLabel.setValue(FontAwesome.STOP.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconRed");
|
|
||||||
break;
|
|
||||||
case CREATING:
|
|
||||||
statusLabel.setValue(null);
|
|
||||||
statusLabel.setStyleName("greySpinner");
|
|
||||||
break;
|
|
||||||
case STARTING:
|
|
||||||
statusLabel.setValue(null);
|
|
||||||
statusLabel.setStyleName("blueSpinner");
|
|
||||||
break;
|
|
||||||
case ERROR_CREATING:
|
|
||||||
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconRed");
|
|
||||||
statusLabel.setDescription(i18n.get("message.error.creating.rollout"));
|
|
||||||
break;
|
|
||||||
case ERROR_STARTING:
|
|
||||||
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
|
|
||||||
statusLabel.setStyleName("statusIconRed");
|
|
||||||
statusLabel.setDescription(i18n.get("message.error.starting.rollout"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshTable() {
|
|
||||||
final LazyQueryContainer container = (LazyQueryContainer) getContainerDataSource();
|
|
||||||
container.refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ACTION {
|
|
||||||
PAUSE, RESUME, START, UPDATE
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents data of context menu item.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static class ContextMenuData {
|
|
||||||
|
|
||||||
private Long rolloutId;
|
|
||||||
|
|
||||||
private ACTION action;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set rollout if and action.
|
|
||||||
*
|
|
||||||
* @param rolloutId
|
|
||||||
* id of rollout
|
|
||||||
* @param action
|
|
||||||
* user action {@link ACTION}
|
|
||||||
*/
|
|
||||||
public ContextMenuData(final Long rolloutId, final ACTION action) {
|
|
||||||
this.action = action;
|
|
||||||
this.rolloutId = rolloutId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the rolloutId
|
|
||||||
*/
|
|
||||||
public Long getRolloutId() {
|
|
||||||
return rolloutId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param rolloutId
|
|
||||||
* the rolloutId to set
|
|
||||||
*/
|
|
||||||
public void setRolloutId(final Long rolloutId) {
|
|
||||||
this.rolloutId = rolloutId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the action
|
|
||||||
*/
|
|
||||||
public ACTION getAction() {
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param action
|
|
||||||
* the action to set
|
|
||||||
*/
|
|
||||||
public void setAction(final ACTION action) {
|
|
||||||
this.action = action;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -13,6 +13,9 @@ import javax.annotation.PreDestroy;
|
|||||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||||
import org.eclipse.hawkbit.ui.HawkbitUI;
|
import org.eclipse.hawkbit.ui.HawkbitUI;
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.rollout.RolloutListView;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.rolloutgroup.RolloutGroupsListView;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets.RolloutGroupTargetsListView;
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.vaadin.spring.events.EventBus;
|
import org.vaadin.spring.events.EventBus;
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* 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.rollout;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
|
|
||||||
|
import com.google.gwt.i18n.client.AutoDirectionHandler.Target;
|
||||||
|
import com.vaadin.server.FontAwesome;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Helper class which holds the details of font icon to be displayed for
|
||||||
|
* {@link Rollout}/ {@link RolloutGroup} / Rollout {@link Target}
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class StatusFontIcon {
|
||||||
|
final FontAwesome fontIcon;
|
||||||
|
final String style;
|
||||||
|
|
||||||
|
public StatusFontIcon(FontAwesome fontIcon, String style) {
|
||||||
|
super();
|
||||||
|
this.fontIcon = fontIcon;
|
||||||
|
this.style = style;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FontAwesome getFontIcon() {
|
||||||
|
return fontIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStyle() {
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -650,7 +650,8 @@ public class AddUpdateRolloutWindowLayout extends CustomComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Container createDsComboContainer() {
|
private Container createDsComboContainer() {
|
||||||
final BeanQueryFactory<DistBeanQuery> distributionQF = new BeanQueryFactory<>(DistBeanQuery.class);
|
final BeanQueryFactory<DistributionBeanQuery> distributionQF = new BeanQueryFactory<>(
|
||||||
|
DistributionBeanQuery.class);
|
||||||
return new LazyQueryContainer(
|
return new LazyQueryContainer(
|
||||||
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_DIST_ID_NAME),
|
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_DIST_ID_NAME),
|
||||||
distributionQF);
|
distributionQF);
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
@@ -34,7 +34,7 @@ import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
|||||||
* Bean query for distribution set combo.
|
* Bean query for distribution set combo.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class DistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5176481314404662215L;
|
private static final long serialVersionUID = 5176481314404662215L;
|
||||||
private Sort sort = new Sort(Direction.ASC, "name", "version");
|
private Sort sort = new Sort(Direction.ASC, "name", "version");
|
||||||
@@ -53,7 +53,7 @@ public class DistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
|
|||||||
* @param sortStates
|
* @param sortStates
|
||||||
* as Sort status
|
* as Sort status
|
||||||
*/
|
*/
|
||||||
public DistBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
public DistributionBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
|
||||||
final Object[] sortPropertyIds, final boolean[] sortStates) {
|
final Object[] sortPropertyIds, final boolean[] sortStates) {
|
||||||
super(definition, queryConfig, sortPropertyIds, sortStates);
|
super(definition, queryConfig, sortPropertyIds, sortStates);
|
||||||
|
|
||||||
@@ -6,10 +6,12 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.model.Rollout;
|
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||||
|
|
||||||
|
import com.vaadin.server.FontAwesome;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Proxy rollout with suctome properties.
|
* Proxy rollout with suctome properties.
|
||||||
*
|
*
|
||||||
@@ -26,18 +28,6 @@ public class ProxyRollout extends Rollout {
|
|||||||
|
|
||||||
private Long numberOfGroups;
|
private Long numberOfGroups;
|
||||||
|
|
||||||
private Long runningTargetsCount;
|
|
||||||
|
|
||||||
private Long scheduledTargetsCount;
|
|
||||||
|
|
||||||
private Long cancelledTargetsCount;
|
|
||||||
|
|
||||||
private Long errorTargetsCount;
|
|
||||||
|
|
||||||
private Long finishedTargetsCount;
|
|
||||||
|
|
||||||
private Long notStartedTargetsCount;
|
|
||||||
|
|
||||||
private Boolean isActionRecieved = Boolean.FALSE;
|
private Boolean isActionRecieved = Boolean.FALSE;
|
||||||
|
|
||||||
private String totalTargetsCount;
|
private String totalTargetsCount;
|
||||||
@@ -102,81 +92,6 @@ public class ProxyRollout extends Rollout {
|
|||||||
this.modifiedDate = modifiedDate;
|
this.modifiedDate = modifiedDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the runningTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getRunningTargetsCount() {
|
|
||||||
return runningTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param runningTargetsCount
|
|
||||||
* the runningTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setRunningTargetsCount(final Long runningTargetsCount) {
|
|
||||||
this.runningTargetsCount = runningTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the scheduledTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getScheduledTargetsCount() {
|
|
||||||
return scheduledTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param scheduledTargetsCount
|
|
||||||
* the scheduledTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setScheduledTargetsCount(final Long scheduledTargetsCount) {
|
|
||||||
this.scheduledTargetsCount = scheduledTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the cancelledTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getCancelledTargetsCount() {
|
|
||||||
return cancelledTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param cancelledTargetsCount
|
|
||||||
* the cancelledTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setCancelledTargetsCount(final Long cancelledTargetsCount) {
|
|
||||||
this.cancelledTargetsCount = cancelledTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the errorTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getErrorTargetsCount() {
|
|
||||||
return errorTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param errorTargetsCount
|
|
||||||
* the errorTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setErrorTargetsCount(final Long errorTargetsCount) {
|
|
||||||
this.errorTargetsCount = errorTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the finishedTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getFinishedTargetsCount() {
|
|
||||||
return finishedTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param finishedTargetsCount
|
|
||||||
* the finishedTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setFinishedTargetsCount(final Long finishedTargetsCount) {
|
|
||||||
this.finishedTargetsCount = finishedTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the isActionRecieved
|
* @return the isActionRecieved
|
||||||
*/
|
*/
|
||||||
@@ -192,21 +107,6 @@ public class ProxyRollout extends Rollout {
|
|||||||
this.isActionRecieved = isActionRecieved;
|
this.isActionRecieved = isActionRecieved;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the notStartedTargetsCount
|
|
||||||
*/
|
|
||||||
public Long getNotStartedTargetsCount() {
|
|
||||||
return notStartedTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param notStartedTargetsCount
|
|
||||||
* the notStartedTargetsCount to set
|
|
||||||
*/
|
|
||||||
public void setNotStartedTargetsCount(final Long notStartedTargetsCount) {
|
|
||||||
this.notStartedTargetsCount = notStartedTargetsCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the totalTargetsCount
|
* @return the totalTargetsCount
|
||||||
*/
|
*/
|
||||||
@@ -221,4 +121,10 @@ public class ProxyRollout extends Rollout {
|
|||||||
public void setTotalTargetsCount(final String totalTargetsCount) {
|
public void setTotalTargetsCount(final String totalTargetsCount) {
|
||||||
this.totalTargetsCount = totalTargetsCount;
|
this.totalTargetsCount = totalTargetsCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getAction() {
|
||||||
|
return FontAwesome.CIRCLE_O.getHtml();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -132,23 +132,10 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
|
|||||||
proxyRollout.setStatus(rollout.getStatus());
|
proxyRollout.setStatus(rollout.getStatus());
|
||||||
|
|
||||||
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
|
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
|
||||||
|
proxyRollout.setTotalTargetCountStatus(totalTargetCountActionStatus);
|
||||||
proxyRollout.setRunningTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
|
|
||||||
proxyRollout.setErrorTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
|
|
||||||
proxyRollout.setCancelledTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
|
|
||||||
proxyRollout.setFinishedTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
|
|
||||||
proxyRollout.setScheduledTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
|
|
||||||
proxyRollout.setNotStartedTargetsCount(totalTargetCountActionStatus
|
|
||||||
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
|
|
||||||
proxyRolloutList.add(proxyRollout);
|
|
||||||
|
|
||||||
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
|
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
|
||||||
|
|
||||||
|
proxyRolloutList.add(proxyRollout);
|
||||||
}
|
}
|
||||||
return proxyRolloutList;
|
return proxyRolloutList;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,595 @@
|
|||||||
|
/**
|
||||||
|
* 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.rollout.rollout;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent;
|
||||||
|
import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||||
|
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||||
|
import org.eclipse.hawkbit.repository.model.Rollout;
|
||||||
|
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
|
||||||
|
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.UINotification;
|
||||||
|
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.EventBus;
|
||||||
|
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;
|
||||||
|
import com.vaadin.ui.UI;
|
||||||
|
import com.vaadin.ui.Window;
|
||||||
|
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
|
||||||
|
import com.vaadin.ui.renderers.HtmlRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Rollout list grid component.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SpringComponent
|
||||||
|
@ViewScope
|
||||||
|
public class RolloutListGrid extends AbstractGrid {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 4060904914954370524L;
|
||||||
|
|
||||||
|
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";
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private I18N i18n;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient EventBus.SessionEventBus eventBus;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient RolloutManagement rolloutManagement;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AddUpdateRolloutWindowLayout addUpdateRolloutWindow;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UINotification uiNotification;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient RolloutUIState rolloutUIState;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient SpPermissionChecker permissionChecker;
|
||||||
|
|
||||||
|
private transient Map<RolloutStatus, StatusFontIcon> statusIconMap = new EnumMap<>(RolloutStatus.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@PostConstruct
|
||||||
|
protected void init() {
|
||||||
|
super.init();
|
||||||
|
eventBus.subscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
void destroy() {
|
||||||
|
eventBus.unsubscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
|
void onEvent(final RolloutEvent event) {
|
||||||
|
switch (event) {
|
||||||
|
case FILTER_BY_TEXT:
|
||||||
|
case CREATE_ROLLOUT:
|
||||||
|
case UPDATE_ROLLOUT:
|
||||||
|
case SHOW_ROLLOUTS:
|
||||||
|
refreshGrid();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the RolloutChangeEvent to refresh the item in the grid.
|
||||||
|
*
|
||||||
|
* @param rolloutChangeEvent
|
||||||
|
* the event which contains the rollout which has been changed
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
|
public void onEvent(final RolloutChangeEvent rolloutChangeEvent) {
|
||||||
|
if (!rolloutUIState.isShowRollOuts()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Rollout rollout = rolloutManagement.findRolloutWithDetailedStatus(rolloutChangeEvent.getRolloutId());
|
||||||
|
final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();
|
||||||
|
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
|
||||||
|
final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId());
|
||||||
|
if (item == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());
|
||||||
|
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setValue(totalTargetCountStatus);
|
||||||
|
final Long groupCount = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).getValue();
|
||||||
|
if (rollout.getRolloutGroups() != null && groupCount != rollout.getRolloutGroups().size()) {
|
||||||
|
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)
|
||||||
|
.setValue(Long.valueOf(rollout.getRolloutGroups().size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Container createContainer() {
|
||||||
|
final BeanQueryFactory<RolloutBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutBeanQuery.class);
|
||||||
|
return new LazyQueryContainer(
|
||||||
|
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addContainerProperties() {
|
||||||
|
final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource();
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
|
||||||
|
false);
|
||||||
|
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
|
||||||
|
false);
|
||||||
|
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
|
||||||
|
false);
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnExpandRatio() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(150);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(150);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(75);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
|
||||||
|
|
||||||
|
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(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280);
|
||||||
|
|
||||||
|
setFrozenColumnCount(getColumns().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnHeaderNames() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
|
||||||
|
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"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
|
||||||
|
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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getGridId() {
|
||||||
|
return SPUIComponetIdProvider.ROLLOUT_LIST_GRID_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnProperties() {
|
||||||
|
List<Object> columnList = new ArrayList<>();
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_NAME);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_STATUS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
|
||||||
|
columnList.add(SPUILabelDefinitions.ACTION);
|
||||||
|
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_DESC);
|
||||||
|
setColumnOrder(columnList.toArray());
|
||||||
|
alignColumns();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setHiddenColumns() {
|
||||||
|
List<Object> columnsToBeHidden = new ArrayList<>();
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);
|
||||||
|
for (Object propertyId : columnsToBeHidden) {
|
||||||
|
getColumn(propertyId).setHidden(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected CellDescriptionGenerator getDescriptionGenerator() {
|
||||||
|
return cell -> getDescription(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addColumnRenderes() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
|
||||||
|
new TotalTargetCountStatusConverter());
|
||||||
|
|
||||||
|
createRolloutStatusToFontMap();
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter());
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createRolloutStatusToFontMap() {
|
||||||
|
statusIconMap.put(RolloutStatus.FINISHED,
|
||||||
|
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||||
|
statusIconMap.put(RolloutStatus.PAUSED,
|
||||||
|
new StatusFontIcon(FontAwesome.PAUSE, SPUIStyleDefinitions.STATUS_ICON_BLUE));
|
||||||
|
statusIconMap.put(RolloutStatus.RUNNING, new StatusFontIcon(null, SPUIStyleDefinitions.STATUS_SPINNER_YELLOW));
|
||||||
|
statusIconMap.put(RolloutStatus.READY,
|
||||||
|
new StatusFontIcon(FontAwesome.DOT_CIRCLE_O, SPUIStyleDefinitions.STATUS_ICON_LIGHT_BLUE));
|
||||||
|
statusIconMap.put(RolloutStatus.STOPPED,
|
||||||
|
new StatusFontIcon(FontAwesome.STOP, SPUIStyleDefinitions.STATUS_ICON_RED));
|
||||||
|
statusIconMap.put(RolloutStatus.CREATING, new StatusFontIcon(null, SPUIStyleDefinitions.STATUS_SPINNER_GREY));
|
||||||
|
statusIconMap.put(RolloutStatus.STARTING, new StatusFontIcon(null, SPUIStyleDefinitions.STATUS_SPINNER_BLUE));
|
||||||
|
statusIconMap.put(RolloutStatus.ERROR_CREATING,
|
||||||
|
new StatusFontIcon(FontAwesome.EXCLAMATION_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_RED));
|
||||||
|
statusIconMap.put(RolloutStatus.ERROR_STARTING,
|
||||||
|
new StatusFontIcon(FontAwesome.EXCLAMATION_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_RED));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void alignColumns() {
|
||||||
|
setCellStyleGenerator(new CellStyleGenerator() {
|
||||||
|
private static final long serialVersionUID = 5573570647129792429L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStyle(final CellReference cellReference) {
|
||||||
|
String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS, SPUILabelDefinitions.ACTION };
|
||||||
|
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
|
||||||
|
return "centeralign";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onClickOfRolloutName(RendererClickEvent event) {
|
||||||
|
rolloutUIState.setRolloutId((long) event.getItemId());
|
||||||
|
final String rolloutName = (String) getContainerDataSource().getItem(event.getItemId())
|
||||||
|
.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
||||||
|
rolloutUIState.setRolloutName(rolloutName);
|
||||||
|
String ds = (String) getContainerDataSource().getItem(event.getItemId())
|
||||||
|
.getItemProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).getValue();
|
||||||
|
rolloutUIState.setRolloutDistributionSet(ds);
|
||||||
|
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onClickOfActionBtn(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(event -> menuItemClicked(event));
|
||||||
|
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()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final ContextMenuItem cancelItem = context.addItem(UPDATE_OPTION);
|
||||||
|
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String convertRolloutStatusToString(final RolloutStatus value) {
|
||||||
|
StatusFontIcon statusFontIcon = statusIconMap.get(value);
|
||||||
|
if (statusFontIcon == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String codePoint = statusFontIcon.getFontIcon() != null
|
||||||
|
? Integer.toString(statusFontIcon.getFontIcon().getCodepoint()) : null;
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(codePoint, statusFontIcon.getStyle(),
|
||||||
|
SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
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());
|
||||||
|
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:
|
||||||
|
rolloutManagement.startRolloutAsync(rolloutManagement.findRolloutByName(rolloutName));
|
||||||
|
uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName));
|
||||||
|
break;
|
||||||
|
case UPDATE:
|
||||||
|
onUpdate(contextMenuData);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onUpdate(final ContextMenuData contextMenuData) {
|
||||||
|
addUpdateRolloutWindow.populateData(contextMenuData.getRolloutId());
|
||||||
|
final Window addTargetWindow = addUpdateRolloutWindow.getWindow();
|
||||||
|
addTargetWindow.setCaption(i18n.get("caption.update.rollout"));
|
||||||
|
UI.getCurrent().addWindow(addTargetWindow);
|
||||||
|
addTargetWindow.setVisible(Boolean.TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshGrid() {
|
||||||
|
((LazyQueryContainer) getContainerDataSource()).refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class FontIconGenerator extends PropertyValueGenerator<String> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 2544026030795375748L;
|
||||||
|
private final FontAwesome fontIcon;
|
||||||
|
|
||||||
|
public FontIconGenerator(FontAwesome icon) {
|
||||||
|
this.fontIcon = icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue(Item item, Object itemId, Object propertyId) {
|
||||||
|
return fontIcon.getHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(CellReference cell) {
|
||||||
|
if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
|
||||||
|
return cell.getProperty().getValue().toString().toLowerCase();
|
||||||
|
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
|
||||||
|
return SPUILabelDefinitions.ACTION.toLowerCase();
|
||||||
|
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
|
||||||
|
return cell.getProperty().getValue().toString();
|
||||||
|
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
|
||||||
|
return DistributionBarHelper
|
||||||
|
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ACTION {
|
||||||
|
PAUSE, RESUME, START, UPDATE
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents data of context menu item.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static class ContextMenuData {
|
||||||
|
|
||||||
|
private Long rolloutId;
|
||||||
|
|
||||||
|
private ACTION action;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set rollout if and action.
|
||||||
|
*
|
||||||
|
* @param rolloutId
|
||||||
|
* id of rollout
|
||||||
|
* @param action
|
||||||
|
* user action {@link ACTION}
|
||||||
|
*/
|
||||||
|
public ContextMenuData(final Long rolloutId, final ACTION action) {
|
||||||
|
this.action = action;
|
||||||
|
this.rolloutId = rolloutId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the rolloutId
|
||||||
|
*/
|
||||||
|
public Long getRolloutId() {
|
||||||
|
return rolloutId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param rolloutId
|
||||||
|
* the rolloutId to set
|
||||||
|
*/
|
||||||
|
public void setRolloutId(final Long rolloutId) {
|
||||||
|
this.rolloutId = rolloutId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the action
|
||||||
|
*/
|
||||||
|
public ACTION getAction() {
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param action
|
||||||
|
* the action to set
|
||||||
|
*/
|
||||||
|
public void setAction(final ACTION action) {
|
||||||
|
this.action = action;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Converter to convert {@link RolloutStatus} to string.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class RolloutStatusConverter implements Converter<String, RolloutStatus> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -1217685750825632678L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RolloutStatus convertToModel(final String value, final Class<? extends RolloutStatus> targetType,
|
||||||
|
final Locale locale) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToPresentation(final RolloutStatus value, final Class<? extends String> targetType,
|
||||||
|
final Locale locale) {
|
||||||
|
return convertRolloutStatusToString(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<RolloutStatus> getModelType() {
|
||||||
|
return RolloutStatus.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getPresentationType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converter to convert {@link TotalTargetCountStatus} to formatted string
|
||||||
|
* with status and count details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class TotalTargetCountStatusConverter implements Converter<String, TotalTargetCountStatus> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -5794528427855153924L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TotalTargetCountStatus convertToModel(String value, Class<? extends TotalTargetCountStatus> targetType,
|
||||||
|
Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToPresentation(TotalTargetCountStatus value, Class<? extends String> targetType,
|
||||||
|
Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||||
|
return DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<TotalTargetCountStatus> getModelType() {
|
||||||
|
return TotalTargetCountStatus.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getPresentationType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -6,11 +6,12 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
@@ -35,7 +36,7 @@ import com.vaadin.ui.Window;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutListHeader extends AbstractSimpleTableHeader {
|
public class RolloutListHeader extends AbstractGridHeader {
|
||||||
private static final long serialVersionUID = 2365400733081333174L;
|
private static final long serialVersionUID = 2365400733081333174L;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -6,10 +6,11 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rollout;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.vaadin.spring.annotation.SpringComponent;
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
@@ -23,7 +24,7 @@ import com.vaadin.ui.Label;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutListView extends AbstractSimpleTableLayout {
|
public class RolloutListView extends AbstractGridLayout {
|
||||||
|
|
||||||
private static final long serialVersionUID = -2703552177439393208L;
|
private static final long serialVersionUID = -2703552177439393208L;
|
||||||
|
|
||||||
@@ -31,21 +32,18 @@ public class RolloutListView extends AbstractSimpleTableLayout {
|
|||||||
private RolloutListHeader rolloutListHeader;
|
private RolloutListHeader rolloutListHeader;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RolloutListTable rolloutListTable;
|
private RolloutListGrid rolloutListGrid;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
void init() {
|
void init() {
|
||||||
super.init(rolloutListHeader, rolloutListTable);
|
super.init(rolloutListHeader, rolloutListGrid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean hasCountMessage() {
|
protected boolean hasCountMessage() {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Label getCountMessageLabel() {
|
protected Label getCountMessageLabel() {
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -15,7 +15,6 @@ import java.util.Map;
|
|||||||
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
||||||
import org.eclipse.hawkbit.repository.RolloutManagement;
|
import org.eclipse.hawkbit.repository.RolloutManagement;
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
|
||||||
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||||
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
|
||||||
@@ -29,7 +28,8 @@ import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery;
|
|||||||
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author gah6kor
|
* Simple implementation of generics bean query which dynamically loads a batch
|
||||||
|
* of {@link ProxyRolloutGroup} beans.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup> {
|
public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup> {
|
||||||
@@ -122,22 +122,8 @@ public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup>
|
|||||||
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
|
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
|
||||||
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
|
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
|
||||||
|
|
||||||
final TotalTargetCountStatus totalTargetCountActionStatus = rolloutGroup.getTotalTargetCountStatus();
|
|
||||||
|
|
||||||
proxyRolloutGroup.setRunningTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
|
|
||||||
proxyRolloutGroup.setErrorTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
|
|
||||||
proxyRolloutGroup.setCancelledTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
|
|
||||||
proxyRolloutGroup.setFinishedTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
|
|
||||||
proxyRolloutGroup.setScheduledTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
|
|
||||||
proxyRolloutGroup.setNotStartedTargetsCount(
|
|
||||||
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
|
|
||||||
|
|
||||||
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
|
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
|
||||||
|
proxyRolloutGroup.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
|
||||||
|
|
||||||
proxyRolloutGroupsList.add(proxyRolloutGroup);
|
proxyRolloutGroupsList.add(proxyRolloutGroup);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,396 @@
|
|||||||
|
/**
|
||||||
|
* 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.rollout.rolloutgroup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent;
|
||||||
|
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
|
||||||
|
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
||||||
|
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||||
|
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.spring.events.EventBus;
|
||||||
|
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.converter.Converter;
|
||||||
|
import com.vaadin.server.FontAwesome;
|
||||||
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
|
import com.vaadin.spring.annotation.ViewScope;
|
||||||
|
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
|
||||||
|
import com.vaadin.ui.renderers.HtmlRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Rollout group list grid component.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SpringComponent
|
||||||
|
@ViewScope
|
||||||
|
public class RolloutGroupListGrid extends AbstractGrid {
|
||||||
|
private static final long serialVersionUID = 4060904914954370524L;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private I18N i18n;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient EventBus.SessionEventBus eventBus;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient RolloutGroupManagement rolloutGroupManagement;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient RolloutUIState rolloutUIState;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient SpPermissionChecker permissionChecker;
|
||||||
|
|
||||||
|
private transient Map<RolloutGroupStatus, StatusFontIcon> statusIconMap = new EnumMap<>(RolloutGroupStatus.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@PostConstruct
|
||||||
|
protected void init() {
|
||||||
|
super.init();
|
||||||
|
eventBus.subscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
void destroy() {
|
||||||
|
eventBus.unsubscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
|
void onEvent(final RolloutEvent event) {
|
||||||
|
if (RolloutEvent.SHOW_ROLLOUT_GROUPS != event) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
((LazyQueryContainer) getContainerDataSource()).refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Handles the RolloutGroupChangeEvent to refresh the item in the grid.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param rolloutGroupChangeEvent
|
||||||
|
* the event which contains the rollout group which has been
|
||||||
|
* change
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
|
public void onEvent(final RolloutGroupChangeEvent rolloutGroupChangeEvent) {
|
||||||
|
if (!rolloutUIState.isShowRolloutGroups()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final RolloutGroup rolloutGroup = rolloutGroupManagement
|
||||||
|
.findRolloutGroupWithDetailedStatus(rolloutGroupChangeEvent.getRolloutGroupId());
|
||||||
|
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
|
||||||
|
final Item item = rolloutContainer.getItem(rolloutGroup.getId());
|
||||||
|
if (item == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
|
||||||
|
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
|
||||||
|
.setValue(rolloutGroup.getTotalTargetCountStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Container createContainer() {
|
||||||
|
final BeanQueryFactory<RolloutGroupBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutGroupBeanQuery.class);
|
||||||
|
return new LazyQueryContainer(
|
||||||
|
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addContainerProperties() {
|
||||||
|
final LazyQueryContainer rolloutGroupGridContainer = (LazyQueryContainer) getContainerDataSource();
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
|
||||||
|
false, false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE,
|
||||||
|
String.class, null, false, false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class,
|
||||||
|
null, false, false);
|
||||||
|
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null,
|
||||||
|
false, false);
|
||||||
|
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
|
||||||
|
false);
|
||||||
|
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null,
|
||||||
|
false, false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
|
||||||
|
false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
|
||||||
|
false);
|
||||||
|
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS,
|
||||||
|
TotalTargetCountStatus.class, null, false, false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnExpandRatio() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(200);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(75);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE).setMaximumWidth(100);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD).setMaximumWidth(100);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD).setMinimumWidth(40);
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD).setMaximumWidth(100);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280);
|
||||||
|
|
||||||
|
setFrozenColumnCount(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnHeaderNames() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
|
||||||
|
.setHeaderCaption(i18n.get("header.detail.status"));
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE)
|
||||||
|
.setHeaderCaption(i18n.get("header.rolloutgroup.installed.percentage"));
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD)
|
||||||
|
.setHeaderCaption(i18n.get("header.rolloutgroup.threshold.error"));
|
||||||
|
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD)
|
||||||
|
.setHeaderCaption(i18n.get("header.rolloutgroup.threshold"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getGridId() {
|
||||||
|
return SPUIComponetIdProvider.ROLLOUT_GROUP_LIST_GRID_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnProperties() {
|
||||||
|
List<Object> columnList = new ArrayList<>();
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_NAME);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_STATUS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
|
||||||
|
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE);
|
||||||
|
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD);
|
||||||
|
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_DESC);
|
||||||
|
setColumnOrder(columnList.toArray());
|
||||||
|
alignColumns();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addColumnRenderes() {
|
||||||
|
createRolloutGroupStatusToFontMap();
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(),
|
||||||
|
new RolloutGroupStatusConverter());
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
|
||||||
|
new TotalTargetCountStatusConverter());
|
||||||
|
if (permissionChecker.hasRolloutTargetsReadPermission()) {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME)
|
||||||
|
.setRenderer(new LinkRenderer(event -> onClickOfRolloutGroupName(event)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setHiddenColumns() {
|
||||||
|
List<Object> columnsToBeHidden = new ArrayList<>();
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
|
||||||
|
columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);
|
||||||
|
for (Object propertyId : columnsToBeHidden) {
|
||||||
|
getColumn(propertyId).setHidden(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected CellDescriptionGenerator getDescriptionGenerator() {
|
||||||
|
return cell -> getDescription(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onClickOfRolloutGroupName(RendererClickEvent event) {
|
||||||
|
rolloutUIState
|
||||||
|
.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) event.getItemId()));
|
||||||
|
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String convertRolloutGroupStatusToString(final RolloutGroupStatus value) {
|
||||||
|
StatusFontIcon statusFontIcon = statusIconMap.get(value);
|
||||||
|
if (statusFontIcon == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String codePoint = statusFontIcon.getFontIcon() != null
|
||||||
|
? Integer.toString(statusFontIcon.getFontIcon().getCodepoint()) : null;
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(codePoint, statusFontIcon.getStyle(),
|
||||||
|
SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createRolloutGroupStatusToFontMap() {
|
||||||
|
statusIconMap.put(RolloutGroupStatus.FINISHED,
|
||||||
|
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||||
|
statusIconMap.put(RolloutGroupStatus.SCHEDULED,
|
||||||
|
new StatusFontIcon(FontAwesome.HOURGLASS_1, SPUIStyleDefinitions.STATUS_ICON_PENDING));
|
||||||
|
statusIconMap.put(RolloutGroupStatus.RUNNING,
|
||||||
|
new StatusFontIcon(FontAwesome.ADJUST, SPUIStyleDefinitions.STATUS_ICON_YELLOW));
|
||||||
|
statusIconMap.put(RolloutGroupStatus.READY,
|
||||||
|
new StatusFontIcon(FontAwesome.DOT_CIRCLE_O, SPUIStyleDefinitions.STATUS_ICON_LIGHT_BLUE));
|
||||||
|
statusIconMap.put(RolloutGroupStatus.ERROR,
|
||||||
|
new StatusFontIcon(FontAwesome.EXCLAMATION_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_RED));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(CellReference cell) {
|
||||||
|
if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
|
||||||
|
return cell.getProperty().getValue().toString().toLowerCase();
|
||||||
|
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
|
||||||
|
return SPUILabelDefinitions.ACTION.toLowerCase();
|
||||||
|
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
|
||||||
|
return cell.getProperty().getValue().toString();
|
||||||
|
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
|
||||||
|
return DistributionBarHelper
|
||||||
|
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void alignColumns() {
|
||||||
|
setCellStyleGenerator(new CellStyleGenerator() {
|
||||||
|
private static final long serialVersionUID = 5573570647129792429L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStyle(final CellReference cellReference) {
|
||||||
|
String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS,
|
||||||
|
SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS };
|
||||||
|
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
|
||||||
|
return "centeralign";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Converts {@link TotalTargetCountStatus} into formatted string with status
|
||||||
|
* and count details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class TotalTargetCountStatusConverter implements Converter<String, TotalTargetCountStatus> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -9205943894818450807L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TotalTargetCountStatus convertToModel(String value, Class<? extends TotalTargetCountStatus> targetType,
|
||||||
|
Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToPresentation(TotalTargetCountStatus value, Class<? extends String> targetType,
|
||||||
|
Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
|
||||||
|
return DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<TotalTargetCountStatus> getModelType() {
|
||||||
|
return TotalTargetCountStatus.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getPresentationType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Converts {@link RolloutGroupStatus} to string.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class RolloutGroupStatusConverter implements Converter<String, RolloutGroupStatus> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 5448062736373292820L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RolloutGroupStatus convertToModel(final String value,
|
||||||
|
final Class<? extends RolloutGroupStatus> targetType, final Locale locale) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToPresentation(final RolloutGroupStatus value, final Class<? extends String> targetType,
|
||||||
|
final Locale locale) {
|
||||||
|
return convertRolloutGroupStatusToString(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<RolloutGroupStatus> getModelType() {
|
||||||
|
return RolloutGroupStatus.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getPresentationType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,11 +6,12 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
@@ -37,7 +38,7 @@ import com.vaadin.ui.themes.ValoTheme;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutGroupsListHeader extends AbstractSimpleTableHeader {
|
public class RolloutGroupsListHeader extends AbstractGridHeader {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5077741997839715209L;
|
private static final long serialVersionUID = 5077741997839715209L;
|
||||||
|
|
||||||
@@ -6,10 +6,11 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.vaadin.spring.annotation.SpringComponent;
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
@@ -22,7 +23,7 @@ import com.vaadin.ui.Label;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutGroupsListView extends AbstractSimpleTableLayout {
|
public class RolloutGroupsListView extends AbstractGridLayout {
|
||||||
|
|
||||||
private static final long serialVersionUID = 7252345838154270259L;
|
private static final long serialVersionUID = 7252345838154270259L;
|
||||||
|
|
||||||
@@ -30,22 +31,20 @@ public class RolloutGroupsListView extends AbstractSimpleTableLayout {
|
|||||||
private RolloutGroupsListHeader rolloutGroupListHeader;
|
private RolloutGroupsListHeader rolloutGroupListHeader;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RolloutGroupListTable rolloutGroupListTable;
|
private RolloutGroupListGrid rolloutListGrid;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
protected void init() {
|
protected void init() {
|
||||||
super.init(rolloutGroupListHeader, rolloutGroupListTable);
|
super.init(rolloutGroupListHeader, rolloutListGrid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean hasCountMessage() {
|
protected boolean hasCountMessage() {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Label getCountMessageLabel() {
|
protected Label getCountMessageLabel() {
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -31,8 +31,8 @@ import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery;
|
|||||||
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author gah6kor
|
* Simple implementation of generics bean query which dynamically loads a batch
|
||||||
*
|
* of {@link ProxyTarget} beans.
|
||||||
*/
|
*/
|
||||||
public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget> {
|
||||||
|
|
||||||
@@ -83,8 +83,9 @@ public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget>
|
|||||||
if (startIndex == 0 && firstPageTargetSets != null) {
|
if (startIndex == 0 && firstPageTargetSets != null) {
|
||||||
rolloutGroupTargetsList = firstPageTargetSets.getContent();
|
rolloutGroupTargetsList = firstPageTargetSets.getContent();
|
||||||
} else if (null != rolloutGroup) {
|
} else if (null != rolloutGroup) {
|
||||||
rolloutGroupTargetsList = getRolloutGroupManagement().findAllTargetsWithActionStatus(
|
rolloutGroupTargetsList = getRolloutGroupManagement()
|
||||||
new PageRequest(startIndex / count, count), rolloutGroup).getContent();
|
.findAllTargetsWithActionStatus(new PageRequest(startIndex / count, count), rolloutGroup)
|
||||||
|
.getContent();
|
||||||
}
|
}
|
||||||
return getProxyRolloutGroupTargetsList(rolloutGroupTargetsList);
|
return getProxyRolloutGroupTargetsList(rolloutGroupTargetsList);
|
||||||
}
|
}
|
||||||
@@ -113,8 +114,8 @@ public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget>
|
|||||||
prxyTarget.setTargetInfo(targ.getTargetInfo());
|
prxyTarget.setTargetInfo(targ.getTargetInfo());
|
||||||
prxyTarget.setId(targ.getId());
|
prxyTarget.setId(targ.getId());
|
||||||
if (targ.getAssignedDistributionSet() != null) {
|
if (targ.getAssignedDistributionSet() != null) {
|
||||||
prxyTarget.setAssignedDistNameVersion(HawkbitCommonUtil.getFormattedNameVersion(targ
|
prxyTarget.setAssignedDistNameVersion(HawkbitCommonUtil.getFormattedNameVersion(
|
||||||
.getAssignedDistributionSet().getName(), targ.getAssignedDistributionSet().getVersion()));
|
targ.getAssignedDistributionSet().getName(), targ.getAssignedDistributionSet().getVersion()));
|
||||||
}
|
}
|
||||||
proxyTargetBeans.add(prxyTarget);
|
proxyTargetBeans.add(prxyTarget);
|
||||||
|
|
||||||
@@ -133,8 +134,8 @@ public class RolloutGroupTargetsBeanQuery extends AbstractBeanQuery<ProxyTarget>
|
|||||||
public int size() {
|
public int size() {
|
||||||
long size = 0;
|
long size = 0;
|
||||||
if (null != rolloutGroup) {
|
if (null != rolloutGroup) {
|
||||||
firstPageTargetSets = getRolloutGroupManagement().findAllTargetsWithActionStatus(
|
firstPageTargetSets = getRolloutGroupManagement()
|
||||||
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), rolloutGroup);
|
.findAllTargetsWithActionStatus(new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort), rolloutGroup);
|
||||||
size = firstPageTargetSets.getTotalElements();
|
size = firstPageTargetSets.getTotalElements();
|
||||||
}
|
}
|
||||||
getRolloutUIState().setRolloutGroupTargetsTotalCount(size);
|
getRolloutUIState().setRolloutGroupTargetsTotalCount(size);
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
@@ -30,23 +30,19 @@ import com.vaadin.spring.annotation.ViewScope;
|
|||||||
import com.vaadin.ui.Label;
|
import com.vaadin.ui.Label;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* count message label for the targets of the rollout group.
|
* Count message label for the targets of the rollout group.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutGroupTargetsCountLabelMessage extends Label {
|
public class RolloutGroupTargetsCountLabelMessage extends Label {
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = -3876685878918411453L;
|
private static final long serialVersionUID = -3876685878918411453L;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private transient RolloutUIState rolloutUIState;
|
private transient RolloutUIState rolloutUIState;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private transient RolloutGroupTargetsListTable rolloutGroupTargetsListTable;
|
private transient RolloutGroupTargetsListGrid rolloutGroupTargetsListGrid;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private I18N i18n;
|
private I18N i18n;
|
||||||
@@ -93,7 +89,7 @@ public class RolloutGroupTargetsCountLabelMessage extends Label {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void displayRolloutGroupTargetMessage() {
|
private void displayRolloutGroupTargetMessage() {
|
||||||
long totalTargetTableEnteries = rolloutGroupTargetsListTable.size();
|
long totalTargetTableEnteries = rolloutGroupTargetsListGrid.getContainerDataSource().size();
|
||||||
if (rolloutUIState.getRolloutGroupTargetsTruncated() != null) {
|
if (rolloutUIState.getRolloutGroupTargetsTruncated() != null) {
|
||||||
// set the icon
|
// set the icon
|
||||||
setIcon(FontAwesome.INFO_CIRCLE);
|
setIcon(FontAwesome.INFO_CIRCLE);
|
||||||
@@ -113,7 +109,7 @@ public class RolloutGroupTargetsCountLabelMessage extends Label {
|
|||||||
message.append(SPUIDefinitions.MAX_TARGET_TABLE_ENTRIES);
|
message.append(SPUIDefinitions.MAX_TARGET_TABLE_ENTRIES);
|
||||||
} else {
|
} else {
|
||||||
message.append(i18n.get("label.filter.shown"));
|
message.append(i18n.get("label.filter.shown"));
|
||||||
message.append(rolloutGroupTargetsListTable.size());
|
message.append(rolloutGroupTargetsListGrid.getContainerDataSource().size());
|
||||||
}
|
}
|
||||||
message.append(HawkbitCommonUtil.SP_STRING_SPACE);
|
message.append(HawkbitCommonUtil.SP_STRING_SPACE);
|
||||||
setCaption(message.toString());
|
setCaption(message.toString());
|
||||||
@@ -0,0 +1,313 @@
|
|||||||
|
/**
|
||||||
|
* 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.rollout.rolloutgrouptargets;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.repository.model.Action.Status;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
|
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
|
||||||
|
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
|
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.I18N;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
||||||
|
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
|
||||||
|
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.spring.events.EventBus;
|
||||||
|
import org.vaadin.spring.events.EventScope;
|
||||||
|
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
|
||||||
|
|
||||||
|
import com.vaadin.data.Container;
|
||||||
|
import com.vaadin.data.util.converter.Converter;
|
||||||
|
import com.vaadin.server.FontAwesome;
|
||||||
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
|
import com.vaadin.spring.annotation.ViewScope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Grid component with targets of rollout group.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SpringComponent
|
||||||
|
@ViewScope
|
||||||
|
public class RolloutGroupTargetsListGrid extends AbstractGrid {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -2244756637458984597L;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private I18N i18n;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient EventBus.SessionEventBus eventBus;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private transient RolloutUIState rolloutUIState;
|
||||||
|
|
||||||
|
private transient Map<Status, StatusFontIcon> statusIconMap = new EnumMap<>(Status.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@PostConstruct
|
||||||
|
protected void init() {
|
||||||
|
super.init();
|
||||||
|
eventBus.subscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
void destroy() {
|
||||||
|
eventBus.unsubscribe(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
|
void onEvent(final RolloutEvent event) {
|
||||||
|
if (RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS != event) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
((LazyQueryContainer) getContainerDataSource()).refresh();
|
||||||
|
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS_COUNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Container createContainer() {
|
||||||
|
final BeanQueryFactory<RolloutGroupTargetsBeanQuery> rolloutgrouBeanQueryFactory = new BeanQueryFactory<>(
|
||||||
|
RolloutGroupTargetsBeanQuery.class);
|
||||||
|
return new LazyQueryContainer(
|
||||||
|
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID),
|
||||||
|
rolloutgrouBeanQueryFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addContainerProperties() {
|
||||||
|
final LazyQueryContainer rolloutGroupTargetGridContainer = (LazyQueryContainer) getContainerDataSource();
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false,
|
||||||
|
true);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, Status.class,
|
||||||
|
Status.RETRIEVED, false, false);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_BY, String.class, null,
|
||||||
|
false, true);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, String.class,
|
||||||
|
null, false, true);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null,
|
||||||
|
false, true);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class,
|
||||||
|
null, false, true);
|
||||||
|
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, "", false,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnExpandRatio() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(20);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(280);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(50);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(80);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setMaximumWidth(180);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setMinimumWidth(30);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setMaximumWidth(180);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setMinimumWidth(50);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setMaximumWidth(180);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setMinimumWidth(30);
|
||||||
|
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setMaximumWidth(180);
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setMinimumWidth(50);
|
||||||
|
|
||||||
|
setFrozenColumnCount(getColumns().size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnHeaderNames() {
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setHeaderCaption(i18n.get("header.createdBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getGridId() {
|
||||||
|
return SPUIComponetIdProvider.ROLLOUT_GROUP_TARGETS_LIST_GRID_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setColumnProperties() {
|
||||||
|
List<Object> columnList = new ArrayList<>();
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_NAME);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_CREATED_BY);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_STATUS);
|
||||||
|
columnList.add(SPUILabelDefinitions.VAR_DESC);
|
||||||
|
setColumnOrder(columnList.toArray());
|
||||||
|
alignColumns();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addColumnRenderes() {
|
||||||
|
createRolloutStatusToFontMap();
|
||||||
|
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new StatusConverter());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setHiddenColumns() {
|
||||||
|
// No hidden columns
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected CellDescriptionGenerator getDescriptionGenerator() {
|
||||||
|
return cell -> getDescription(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void alignColumns() {
|
||||||
|
setCellStyleGenerator(new CellStyleGenerator() {
|
||||||
|
private static final long serialVersionUID = 5573570647129792429L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStyle(final CellReference cellReference) {
|
||||||
|
if (SPUILabelDefinitions.VAR_STATUS.equals(cellReference.getPropertyId())) {
|
||||||
|
return "centeralign";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Converts {@link Status} into string with status icon details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private class StatusConverter implements Converter<String, Status> {
|
||||||
|
private static final long serialVersionUID = -7467206089699548808L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Status convertToModel(final String value, final Class<? extends Status> targetType,
|
||||||
|
final Locale locale) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String convertToPresentation(final Status status, final Class<? extends String> targetType,
|
||||||
|
final Locale locale) {
|
||||||
|
if (status == null) {
|
||||||
|
// Actions are not created for targets when
|
||||||
|
// rollout's status
|
||||||
|
// is READY and when duplicate assignment is done.
|
||||||
|
// In these cases display a appropriate status with
|
||||||
|
// description
|
||||||
|
return getStatus();
|
||||||
|
}
|
||||||
|
return processActionStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Status> getModelType() {
|
||||||
|
return Status.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<String> getPresentationType() {
|
||||||
|
return String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String processActionStatus(final Status status) {
|
||||||
|
StatusFontIcon statusFontIcon = statusIconMap.get(status);
|
||||||
|
if (statusFontIcon == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String codePoint = statusFontIcon.getFontIcon() != null
|
||||||
|
? Integer.toString(statusFontIcon.getFontIcon().getCodepoint()) : null;
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(codePoint, statusFontIcon.getStyle(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createRolloutStatusToFontMap() {
|
||||||
|
statusIconMap.put(Status.FINISHED,
|
||||||
|
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||||
|
statusIconMap.put(Status.SCHEDULED,
|
||||||
|
new StatusFontIcon(FontAwesome.HOURGLASS_1, SPUIStyleDefinitions.STATUS_ICON_PENDING));
|
||||||
|
statusIconMap.put(Status.RUNNING,
|
||||||
|
new StatusFontIcon(FontAwesome.ADJUST, SPUIStyleDefinitions.STATUS_ICON_YELLOW));
|
||||||
|
statusIconMap.put(Status.RETRIEVED,
|
||||||
|
new StatusFontIcon(FontAwesome.ADJUST, SPUIStyleDefinitions.STATUS_ICON_YELLOW));
|
||||||
|
statusIconMap.put(Status.WARNING,
|
||||||
|
new StatusFontIcon(FontAwesome.ADJUST, SPUIStyleDefinitions.STATUS_ICON_YELLOW));
|
||||||
|
statusIconMap.put(Status.DOWNLOAD,
|
||||||
|
new StatusFontIcon(FontAwesome.ADJUST, SPUIStyleDefinitions.STATUS_ICON_YELLOW));
|
||||||
|
statusIconMap.put(Status.CANCELING,
|
||||||
|
new StatusFontIcon(FontAwesome.TIMES_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_PENDING));
|
||||||
|
statusIconMap.put(Status.CANCELED,
|
||||||
|
new StatusFontIcon(FontAwesome.TIMES_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||||
|
statusIconMap.put(Status.ERROR,
|
||||||
|
new StatusFontIcon(FontAwesome.EXCLAMATION_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_RED));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStatus() {
|
||||||
|
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
|
||||||
|
? rolloutUIState.getRolloutGroup().get() : null;
|
||||||
|
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(
|
||||||
|
Integer.toString(FontAwesome.DOT_CIRCLE_O.getCodepoint()), "statusIconLightBlue", null);
|
||||||
|
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(
|
||||||
|
Integer.toString(FontAwesome.MINUS_CIRCLE.getCodepoint()), "statusIconBlue", null);
|
||||||
|
} else {
|
||||||
|
return HawkbitCommonUtil.getStatusLabelDetailsInString(
|
||||||
|
Integer.toString(FontAwesome.QUESTION_CIRCLE.getCodepoint()), "statusIconBlue", null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(CellReference cell) {
|
||||||
|
if (!SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (cell.getProperty().getValue() == null) {
|
||||||
|
// status could be null when there is no action.
|
||||||
|
return getDescriptionWhenNoAction();
|
||||||
|
}
|
||||||
|
return cell.getProperty().getValue().toString().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getDescriptionWhenNoAction() {
|
||||||
|
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
|
||||||
|
? rolloutUIState.getRolloutGroup().get() : null;
|
||||||
|
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
|
||||||
|
return RolloutGroupStatus.READY.toString().toLowerCase();
|
||||||
|
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
|
||||||
|
String ds = rolloutUIState.getRolloutDistributionSet().isPresent()
|
||||||
|
? rolloutUIState.getRolloutDistributionSet().get() : "";
|
||||||
|
return i18n.get("message.dist.already.assigned", new Object[] { ds });
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,12 +6,13 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
import org.eclipse.hawkbit.repository.model.RolloutGroup;
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
|
||||||
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
|
||||||
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
|
||||||
@@ -38,7 +39,7 @@ import com.vaadin.ui.themes.ValoTheme;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutGroupTargetsListHeader extends AbstractSimpleTableHeader {
|
public class RolloutGroupTargetsListHeader extends AbstractGridHeader {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5613986489156507581L;
|
private static final long serialVersionUID = 5613986489156507581L;
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -6,10 +6,11 @@
|
|||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.rollout;
|
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.vaadin.spring.annotation.SpringComponent;
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
@@ -21,7 +22,7 @@ import com.vaadin.ui.Label;
|
|||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
public class RolloutGroupTargetsListView extends AbstractSimpleTableLayout {
|
public class RolloutGroupTargetsListView extends AbstractGridLayout {
|
||||||
|
|
||||||
private static final long serialVersionUID = 26089134783467012L;
|
private static final long serialVersionUID = 26089134783467012L;
|
||||||
|
|
||||||
@@ -29,17 +30,17 @@ public class RolloutGroupTargetsListView extends AbstractSimpleTableLayout {
|
|||||||
private RolloutGroupTargetsListHeader rolloutGroupTargetsListHeader;
|
private RolloutGroupTargetsListHeader rolloutGroupTargetsListHeader;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RolloutGroupTargetsListTable rolloutGroupTargetsListTable;
|
private RolloutGroupTargetsCountLabelMessage rolloutGroupTargetsCountLabelMessage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RolloutGroupTargetsCountLabelMessage rolloutGroupTargetsCountLabelMessage;
|
private RolloutGroupTargetsListGrid rolloutListGrid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization of Rollout group component.
|
* Initialization of Rollout group component.
|
||||||
*/
|
*/
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
protected void init() {
|
protected void init() {
|
||||||
super.init(rolloutGroupTargetsListHeader, rolloutGroupTargetsListTable);
|
super.init(rolloutGroupTargetsListHeader, rolloutListGrid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,6 +44,8 @@ public class RolloutUIState implements Serializable {
|
|||||||
|
|
||||||
private long rolloutGroupTargetsTotalCount;
|
private long rolloutGroupTargetsTotalCount;
|
||||||
|
|
||||||
|
private String rolloutDistributionSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the searchText
|
* @return the searchText
|
||||||
*/
|
*/
|
||||||
@@ -178,4 +180,20 @@ public class RolloutUIState implements Serializable {
|
|||||||
public void setRolloutGroupTargetsTotalCount(final long rolloutGroupTargetsTotalCount) {
|
public void setRolloutGroupTargetsTotalCount(final long rolloutGroupTargetsTotalCount) {
|
||||||
this.rolloutGroupTargetsTotalCount = rolloutGroupTargetsTotalCount;
|
this.rolloutGroupTargetsTotalCount = rolloutGroupTargetsTotalCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return rolloutDistributionSet
|
||||||
|
*/
|
||||||
|
public Optional<String> getRolloutDistributionSet() {
|
||||||
|
return rolloutDistributionSet == null ? Optional.empty() : Optional.of(rolloutDistributionSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param rolloutDistributionSet
|
||||||
|
* the distribution set of the rollout
|
||||||
|
*/
|
||||||
|
public void setRolloutDistributionSet(String rolloutDistributionSet) {
|
||||||
|
this.rolloutDistributionSet = rolloutDistributionSet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,6 @@ public class TenantConfigurationDashboardView extends CustomComponent
|
|||||||
|
|
||||||
final Link linkToSystemConfigHelp = SPUIComponentProvider
|
final Link linkToSystemConfigHelp = SPUIComponentProvider
|
||||||
.getHelpLink(uiProperties.getLinks().getDocumentation().getSystemConfigurationView());
|
.getHelpLink(uiProperties.getLinks().getDocumentation().getSystemConfigurationView());
|
||||||
;
|
|
||||||
hlayout.addComponent(linkToSystemConfigHelp);
|
hlayout.addComponent(linkToSystemConfigHelp);
|
||||||
|
|
||||||
return hlayout;
|
return hlayout;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.util.HashMap;
|
|||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ import org.eclipse.hawkbit.repository.model.TargetInfo.PollStatus;
|
|||||||
import org.eclipse.hawkbit.repository.model.TargetTagAssigmentResult;
|
import org.eclipse.hawkbit.repository.model.TargetTagAssigmentResult;
|
||||||
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
|
||||||
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
|
||||||
|
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
|
||||||
import org.eclipse.hawkbit.ui.management.dstable.DistributionTable;
|
import org.eclipse.hawkbit.ui.management.dstable.DistributionTable;
|
||||||
import org.eclipse.hawkbit.ui.management.targettable.TargetTable;
|
import org.eclipse.hawkbit.ui.management.targettable.TargetTable;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -46,6 +48,7 @@ import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
|
|||||||
import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;
|
import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;
|
||||||
import org.vaadin.alump.distributionbar.DistributionBar;
|
import org.vaadin.alump.distributionbar.DistributionBar;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import com.vaadin.data.Container;
|
import com.vaadin.data.Container;
|
||||||
import com.vaadin.data.Item;
|
import com.vaadin.data.Item;
|
||||||
import com.vaadin.server.Sizeable.Unit;
|
import com.vaadin.server.Sizeable.Unit;
|
||||||
@@ -1348,4 +1351,47 @@ public final class HawkbitCommonUtil {
|
|||||||
private static Long getStatusCount(final String propertName, final Item item) {
|
private static Long getStatusCount(final String propertName, final Item item) {
|
||||||
return (Long) item.getItemProperty(propertName).getValue();
|
return (Long) item.getItemProperty(propertName).getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the formatted string of status and target count details.
|
||||||
|
*
|
||||||
|
* @param details
|
||||||
|
* details of status and count
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static String getFormattedString(Map<Status, Long> details) {
|
||||||
|
StringBuilder val = new StringBuilder();
|
||||||
|
if (details == null || details.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (Entry<Status, Long> entry : details.entrySet()) {
|
||||||
|
val.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
|
||||||
|
}
|
||||||
|
return val.substring(0, val.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a formatted string as needed by label custom render .This string
|
||||||
|
* holds the properties of a status label.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* label value
|
||||||
|
* @param style
|
||||||
|
* label style
|
||||||
|
* @param id
|
||||||
|
* label id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getStatusLabelDetailsInString(String value, String style, String id) {
|
||||||
|
StringBuilder val = new StringBuilder();
|
||||||
|
if (!Strings.isNullOrEmpty(value)) {
|
||||||
|
val.append("value:").append(value).append(",");
|
||||||
|
}
|
||||||
|
if (!Strings.isNullOrEmpty(style)) {
|
||||||
|
val.append("style:").append(style).append(",");
|
||||||
|
}
|
||||||
|
val.append("id:").append(id);
|
||||||
|
return val.toString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -738,19 +738,19 @@ public final class SPUIComponetIdProvider {
|
|||||||
public static final String ROLLOUT_ADD_ICON_ID = "rollout.add.button.id";
|
public static final String ROLLOUT_ADD_ICON_ID = "rollout.add.button.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout list table id.
|
* Rollout list grid id.
|
||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_LIST_TABLE_ID = "rollout.table.id";
|
public static final String ROLLOUT_LIST_GRID_ID = "rollout.grid.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout group list table id.
|
* Rollout group list grid id.
|
||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_GROUP_LIST_TABLE_ID = "rollout.group.table.id";
|
public static final String ROLLOUT_GROUP_LIST_GRID_ID = "rollout.group.grid.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout group list table id.
|
* Rollout group list grid id.
|
||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_GROUP_TARGETS_LIST_TABLE_ID = "rollout.group.targets.table.id";
|
public static final String ROLLOUT_GROUP_TARGETS_LIST_GRID_ID = "rollout.group.targets.grid.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout delete button id.
|
* Rollout delete button id.
|
||||||
@@ -828,6 +828,11 @@ public final class SPUIComponetIdProvider {
|
|||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_STATUS_LABEL_ID = "rollout.status.id";
|
public static final String ROLLOUT_STATUS_LABEL_ID = "rollout.status.id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollout group status label id.
|
||||||
|
*/
|
||||||
|
public static final String ROLLOUT_GROUP_STATUS_LABEL_ID = "rollout.group.status.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout % or count option group id.
|
* Rollout % or count option group id.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1001,20 +1001,6 @@ public final class SPUIDefinitions {
|
|||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_GROUP_STARTED_DATE = "Started date";
|
public static final String ROLLOUT_GROUP_STARTED_DATE = "Started date";
|
||||||
|
|
||||||
/**
|
|
||||||
* Rollout group started date column property.
|
|
||||||
*/
|
|
||||||
public static final String ROLLOUT_GROUP_ERROR_THRESHOLD = "errorConditionExp";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rollout group started date column property.
|
|
||||||
*/
|
|
||||||
public static final String ROLLOUT_GROUP_THRESHOLD = "successConditionExp";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rollout group installed percentage column property.
|
|
||||||
*/
|
|
||||||
public static final String ROLLOUT_GROUP_INSTALLED_PERCENTAGE = "finishedPercentage";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rollout group status column property.
|
* Rollout group status column property.
|
||||||
|
|||||||
@@ -540,6 +540,27 @@ public final class SPUILabelDefinitions {
|
|||||||
*/
|
*/
|
||||||
public static final String VAR_TOTAL_TARGETS = "totalTargetsCount";
|
public static final String VAR_TOTAL_TARGETS = "totalTargetsCount";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total target count status coulmn property name.
|
||||||
|
*/
|
||||||
|
public static final String VAR_TOTAL_TARGETS_COUNT_STATUS = "totalTargetCountStatus";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollout group started date column property.
|
||||||
|
*/
|
||||||
|
public static final String ROLLOUT_GROUP_ERROR_THRESHOLD = "errorConditionExp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollout group started date column property.
|
||||||
|
*/
|
||||||
|
public static final String ROLLOUT_GROUP_THRESHOLD = "successConditionExp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollout group installed percentage column property.
|
||||||
|
*/
|
||||||
|
public static final String ROLLOUT_GROUP_INSTALLED_PERCENTAGE = "finishedPercentage";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -249,6 +249,51 @@ public final class SPUIStyleDefinitions {
|
|||||||
*/
|
*/
|
||||||
public static final String TARGET_FILTER_SEARCH_PROGRESS_INDICATOR_STYLE = "target-filter-spinner";
|
public static final String TARGET_FILTER_SEARCH_PROGRESS_INDICATOR_STYLE = "target-filter-spinner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon style - red color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_RED = "statusIconRed";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon style - green color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_GREEN = "statusIconGreen";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon style - blue color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_BLUE = "statusIconBlue";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon spinner style - yellow color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_SPINNER_YELLOW = "yellowSpinner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon style - light blue color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_LIGHT_BLUE = "statusIconLightBlue";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon spinner style - grey color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_SPINNER_GREY = "greySpinner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon spinner style - blue color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_SPINNER_BLUE = "blueSpinner";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status icon style - yellow color.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_YELLOW = "statusIconYellow";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status pending icon.
|
||||||
|
*/
|
||||||
|
public static final String STATUS_ICON_PENDING = "statusIconPending";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -276,4 +276,10 @@
|
|||||||
.links {
|
.links {
|
||||||
padding-left: 22px;
|
padding-left: 22px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.font-icon{
|
||||||
|
font-family:FontAwesome;
|
||||||
|
font-style:normal;
|
||||||
|
font-weight:normal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,5 +56,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.v-grid-cell.centeralign {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-grid-cell {
|
||||||
|
font-size: $v-font-size--small !important;
|
||||||
|
height: 34px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-grid-row{
|
||||||
|
height: 34px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-grid-cell.frozen{
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-grid-cell.frozen + th{
|
||||||
|
border-left: $v-grid-border-size solid $widget-border-color ;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,15 +50,4 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.alump-dbar-tooltip {
|
|
||||||
background-color: rgba(27, 54, 73, 0.9);
|
|
||||||
border-radius: 3px;
|
|
||||||
color: white;
|
|
||||||
z-index: 100;
|
|
||||||
padding: 3px;
|
|
||||||
font-size: 10px;
|
|
||||||
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
|
|
||||||
-moz-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
|
|
||||||
-webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,13 @@ $v-selection-color: $app-selection-color;
|
|||||||
$v-app-background-color: $app-background-color;
|
$v-app-background-color: $app-background-color;
|
||||||
|
|
||||||
//Table header,body border colors are calculated based on this
|
//Table header,body border colors are calculated based on this
|
||||||
$v-table-border-color: $widget-border-color;
|
$v-table-border-color: $widget-border-color ;
|
||||||
|
|
||||||
|
$v-grid-border:$v-grid-border-size solid $widget-border-color ;
|
||||||
|
$v-grid-cell-vertical-border: 0px ;
|
||||||
|
$v-grid-cell-horizontal-border: 0px ;
|
||||||
|
$v-grid-cell-focused-border: 0px ;
|
||||||
|
$v-grid-cell-padding-horizontal:6px;
|
||||||
|
|
||||||
@import '../valo/valo';
|
@import '../valo/valo';
|
||||||
@import 'customstyles/table';
|
@import 'customstyles/table';
|
||||||
|
|||||||
5
pom.xml
5
pom.xml
@@ -382,6 +382,11 @@
|
|||||||
<artifactId>vaadin-push</artifactId>
|
<artifactId>vaadin-push</artifactId>
|
||||||
<version>${vaadin.version}</version>
|
<version>${vaadin.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.vaadin</groupId>
|
||||||
|
<artifactId>vaadin-client</artifactId>
|
||||||
|
<version>${vaadin.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.vaadin</groupId>
|
<groupId>com.vaadin</groupId>
|
||||||
<artifactId>vaadin-themes</artifactId>
|
<artifactId>vaadin-themes</artifactId>
|
||||||
|
|||||||
Reference in New Issue
Block a user