diff --git a/hawkbit-ui/pom.xml b/hawkbit-ui/pom.xml
index 0bd083e36..be55a24f3 100644
--- a/hawkbit-ui/pom.xml
+++ b/hawkbit-ui/pom.xml
@@ -78,6 +78,25 @@
true
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ true
+
+ true
+ true
+
+
+
+ CustomRenderers
+ 1
+ org.eclipse.hawkbit.ui.customrenderers.CustomRendererWidgetSet
+
+
+
+
@@ -173,8 +192,11 @@
com.vaadin
vaadin-server
-
-
+
+ com.vaadin
+ vaadin-client
+
+
com.vaadin
vaadin-push
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AppWidgetSet.gwt.xml b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AppWidgetSet.gwt.xml
index 020ce7a77..31a67cacb 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AppWidgetSet.gwt.xml
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AppWidgetSet.gwt.xml
@@ -1,14 +1,8 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/CustomRendererWidgetSet.gwt.xml b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/CustomRendererWidgetSet.gwt.xml
new file mode 100644
index 000000000..0697836a7
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/CustomRendererWidgetSet.gwt.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlButtonRendererConnector.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlButtonRendererConnector.java
new file mode 100644
index 000000000..c02939a9c
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlButtonRendererConnector.java
@@ -0,0 +1,14 @@
+package org.eclipse.hawkbit.ui.customrenderers.client;
+
+import com.vaadin.client.connectors.ButtonRendererConnector;
+import com.vaadin.shared.ui.Connect;
+
+@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();
+ }
+}
\ No newline at end of file
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlLabelRendererConnector.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlLabelRendererConnector.java
new file mode 100644
index 000000000..b36712e8f
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/HtmlLabelRendererConnector.java
@@ -0,0 +1,16 @@
+package org.eclipse.hawkbit.ui.customrenderers.client;
+
+import com.vaadin.client.connectors.AbstractRendererConnector;
+import com.vaadin.shared.ui.Connect;
+
+@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer.class)
+public class HtmlLabelRendererConnector extends AbstractRendererConnector {
+
+ 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();
+ }
+
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/LinkRendererConnector.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/LinkRendererConnector.java
new file mode 100644
index 000000000..dcd308d8d
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/LinkRendererConnector.java
@@ -0,0 +1,14 @@
+package org.eclipse.hawkbit.ui.customrenderers.client;
+
+import com.vaadin.client.connectors.ButtonRendererConnector;
+import com.vaadin.shared.ui.Connect;
+
+@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();
+ }
+}
\ No newline at end of file
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/StringDistributionBarRendererConnector.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/StringDistributionBarRendererConnector.java
new file mode 100644
index 000000000..bd1485312
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/StringDistributionBarRendererConnector.java
@@ -0,0 +1,18 @@
+package org.eclipse.hawkbit.ui.customrenderers.client;
+
+import com.vaadin.client.connectors.AbstractRendererConnector;
+import com.vaadin.shared.ui.Connect;
+
+@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.StringDistributionBarRenderer.class)
+public class StringDistributionBarRendererConnector extends AbstractRendererConnector {
+
+ private static final long serialVersionUID = 7697966991925490786L;
+
+ @Override
+ public org.eclipse.hawkbit.ui.customrenderers.client.renderers.StringDistributionBarRenderer getRenderer() {
+ org.eclipse.hawkbit.ui.customrenderers.client.renderers.StringDistributionBarRenderer renderer = (org.eclipse.hawkbit.ui.customrenderers.client.renderers.StringDistributionBarRenderer) super.getRenderer();
+ renderer.setUiWidgetClassName(StringDistributionBarRendererConnector.this.getConnection().getUIConnector().getWidget().getParent().getStyleName());
+ return renderer;
+ }
+
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java
new file mode 100644
index 000000000..b0019086b
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlButtonRenderer.java
@@ -0,0 +1,26 @@
+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.widget.grid.RendererCellReference;
+
+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.setStylePrimaryName("v-button");
+ button.setStyleName("tiny v-button-tiny");
+ button.addStyleName("borderless v-button-borderless");
+ button.addStyleName("icon-only v-button-icon-only");
+ button.addStyleName("button-no-border v-button-button-no-border");
+ }
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlLabelRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlLabelRenderer.java
new file mode 100644
index 000000000..5ff1b1814
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/HtmlLabelRenderer.java
@@ -0,0 +1,54 @@
+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;
+
+public class HtmlLabelRenderer extends WidgetRenderer {
+
+ @Override
+ public VLabel createWidget() {
+ return GWT.create(VLabel.class);
+ }
+
+ @Override
+ public void render(RendererCellReference cell, String input, VLabel label) {
+ Map 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("" + Integer.toHexString(Integer.parseInt(value)) + ";");
+ }
+ else{
+ label.setHTML("");
+ }
+ applyStyle(label, style);
+ label.getElement().setId(id);
+ }
+
+ private void applyStyle(VLabel label, String style) {
+ label.setStylePrimaryName("v-label");
+ label.setStyleName("small v-label-small");
+ label.addStyleName("font-icon v-label-font-icon");
+ if (style != null) {
+ label.addStyleName(style + " v-label-" + style);
+ }
+ }
+
+ private Map formatInput(String input) {
+ Map details = new HashMap<>();
+ String[] tempData = input.split(",");
+ for (String statusWithCount : tempData) {
+ String[] statusWithCountList = statusWithCount.split(":");
+ details.put(statusWithCountList[0], statusWithCountList[1]);
+ }
+ return details;
+ }
+
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/LinkRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/LinkRenderer.java
new file mode 100644
index 000000000..016fbf8b5
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/LinkRenderer.java
@@ -0,0 +1,24 @@
+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.widget.grid.RendererCellReference;
+
+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.setStylePrimaryName("v-button");
+ button.setStyleName("borderless v-button-borderless");
+ button.addStyleName("small v-button-small");
+ button.addStyleName("on-focus-no-border v-button-on-focus-no-border");
+ button.addStyleName("link v-button-link");
+ }
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/StringDistributionBarRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/StringDistributionBarRenderer.java
new file mode 100644
index 000000000..1fa2f4efe
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/client/renderers/StringDistributionBarRenderer.java
@@ -0,0 +1,114 @@
+package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar;
+import org.vaadin.alump.distributionbar.gwt.client.dom.ToolTipPresenter.TooltipClassNameProvider;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Style.Unit;
+import com.vaadin.client.renderers.WidgetRenderer;
+import com.vaadin.client.widget.grid.RendererCellReference;
+
+public class StringDistributionBarRenderer extends WidgetRenderer {
+
+ private static final String STATUS_BAR_PART = "status-bar-part-";
+ private static final String FINISHED = "FINISHED";
+ private static final String SCHEDULED = "SCHEDULED";
+ private static final String ROLLOUT_STATUS_PROGRESS_BAR_ID = "rollout.status.progress.bar.id";
+ private String uiWidgetClassName;
+
+ @Override
+ public GwtDistributionBar createWidget() {
+ GwtDistributionBar gwt = GWT.create(GwtDistributionBar.class);
+ gwt.setTooltipClassNameProvider(new TooltipClassNameProvider() {
+ @Override
+ public String getClassNames() {
+ return getUiWidgetClassName();
+ }
+ });
+ return gwt;
+ }
+
+
+ @Override
+ public void render(RendererCellReference cell, String input, GwtDistributionBar widget) {
+ if (null != input) {
+ widget.setNumberOfParts(2);
+ Map map = formatData(input);
+ if (!map.isEmpty()) {
+ if (isNoTargets(map.values())) {
+ setBarPartSize(widget, SCHEDULED.toLowerCase(), 0, 0);
+ setBarPartSize(widget, FINISHED.toLowerCase(), 0, 1);
+
+ } else {
+ setThePartDetails(widget, map);
+ }
+ }
+ widget.getElement().setId(ROLLOUT_STATUS_PROGRESS_BAR_ID);
+ widget.getElement().getStyle().setWidth(100, Unit.PCT);
+ widget.getElement().getStyle().setHeight(100, Unit.PCT);
+ }
+ widget.updateParts();
+ }
+
+ private void setThePartDetails(GwtDistributionBar widget, Map map) {
+ widget.setNumberOfParts(getNumberOfParts(map.values()));
+ int index = 0;
+ for (Entry entryVal : map.entrySet()) {
+ Long count = entryVal.getValue();
+ if (count > 0) {
+ setBarPartSize(widget, entryVal.getKey().toLowerCase(), count.intValue(), index);
+ index++;
+ }
+ }
+ }
+
+ private Map formatData(String input) {
+ Map details = new HashMap<>();
+ String[] tempData = input.split(",");
+ for (String statusWithCount : tempData) {
+ String[] statusWithCountList = statusWithCount.split(":");
+ details.put(statusWithCountList[0], new Long(statusWithCountList[1]));
+ }
+ return details;
+ }
+
+ private int getNumberOfParts(Collection values) {
+ int count = 0;
+ for (Long val : values) {
+ if (val != 0) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean isNoTargets(Collection values) {
+ for (Long count : values) {
+ if (count != 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void setBarPartSize(final GwtDistributionBar bar, final String statusName, final int count,
+ final int index) {
+ bar.setPartSize(index, count);
+ bar.setPartTooltip(index, statusName);
+ bar.setPartStyleName(index, index, STATUS_BAR_PART + statusName);
+ }
+
+ public String getUiWidgetClassName() {
+ return uiWidgetClassName;
+ }
+
+ public void setUiWidgetClassName(String uiWidgetClassName) {
+ this.uiWidgetClassName = uiWidgetClassName;
+ }
+
+}
\ No newline at end of file
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java
new file mode 100644
index 000000000..205eab5db
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlButtonRenderer.java
@@ -0,0 +1,14 @@
+package org.eclipse.hawkbit.ui.customrenderers.renderers;
+
+import com.vaadin.ui.renderers.ButtonRenderer;
+
+public class HtmlButtonRenderer extends ButtonRenderer {
+ private static final long serialVersionUID = -1242995370043404892L;
+ public HtmlButtonRenderer() {
+ super();
+ }
+ public HtmlButtonRenderer(RendererClickListener listener) {
+ super(listener);
+ }
+
+}
\ No newline at end of file
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlLabelRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlLabelRenderer.java
new file mode 100644
index 000000000..bc519ce8a
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/HtmlLabelRenderer.java
@@ -0,0 +1,14 @@
+package org.eclipse.hawkbit.ui.customrenderers.renderers;
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+public class HtmlLabelRenderer extends AbstractRenderer {
+
+ private static final long serialVersionUID = -7675588068526774915L;
+ /**
+ * Creates a new text renderer
+ */
+ public HtmlLabelRenderer() {
+ super(String.class, null);
+ }
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/LinkRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/LinkRenderer.java
new file mode 100644
index 000000000..ad9a5f371
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/LinkRenderer.java
@@ -0,0 +1,14 @@
+package org.eclipse.hawkbit.ui.customrenderers.renderers;
+
+import com.vaadin.ui.renderers.ButtonRenderer;
+
+public class LinkRenderer extends ButtonRenderer {
+ private static final long serialVersionUID = -1242995370043404892L;
+ public LinkRenderer() {
+ super();
+ }
+ public LinkRenderer(RendererClickListener listener) {
+ super(listener);
+ }
+
+}
\ No newline at end of file
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/StringDistributionBarRenderer.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/StringDistributionBarRenderer.java
new file mode 100644
index 000000000..3f6f301d2
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/customrenderers/renderers/StringDistributionBarRenderer.java
@@ -0,0 +1,18 @@
+package org.eclipse.hawkbit.ui.customrenderers.renderers;
+
+
+import com.vaadin.ui.Grid.AbstractRenderer;
+
+public class StringDistributionBarRenderer extends AbstractRenderer {
+ private static final long serialVersionUID = -4543220859821576209L;
+
+ /**
+ * Creates a new text renderer
+ */
+ public StringDistributionBarRenderer() {
+ super(String.class, null);
+ }
+
+
+}
+
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleGrid.java
new file mode 100644
index 000000000..f825bf4cd
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleGrid.java
@@ -0,0 +1,90 @@
+/**
+ * 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.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.themes.ValoTheme;
+
+/**
+ * Abstract table class.
+ *
+ */
+public abstract class AbstractSimpleGrid extends Grid {
+
+ private static final long serialVersionUID = 4856562746502217630L;
+
+ /**
+ * Initialize the components.
+ */
+ protected void init() {
+ setSizeFull();
+ setImmediate(true);
+ setId(getTableId());
+ addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
+ addStyleName(ValoTheme.TABLE_SMALL);
+
+ setHeight("100%");
+ setHeightMode(HeightMode.CSS);
+ 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 getTableId();
+
+ protected abstract void setColumnProperties();
+
+ protected abstract void addColumnRenderes();
+
+ protected abstract void setHiddenColumns();
+
+ protected abstract CellDescriptionGenerator getDescriptionGenerator();
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleTableLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleTableLayout.java
index 560e4040e..9f28122b4 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleTableLayout.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/AbstractSimpleTableLayout.java
@@ -28,11 +28,13 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
private AbstractSimpleTableHeader tableHeader;
- private AbstractSimpleTable table;
+
+ private AbstractSimpleGrid grid;
- protected void init(final AbstractSimpleTableHeader tableHeader, final AbstractSimpleTable table) {
+
+ protected void init(final AbstractSimpleTableHeader tableHeader,final AbstractSimpleGrid grid) {
this.tableHeader = tableHeader;
- this.table = table;
+ this.grid = grid;
buildLayout();
}
@@ -50,9 +52,10 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
tableHeaderLayout.addComponent(tableHeader);
tableHeaderLayout.setComponentAlignment(tableHeader, Alignment.TOP_CENTER);
- tableHeaderLayout.addComponent(table);
- tableHeaderLayout.setComponentAlignment(table, Alignment.TOP_CENTER);
- tableHeaderLayout.setExpandRatio(table, 1.0f);
+// grid.setSizeFull();
+ tableHeaderLayout.addComponent(grid);
+ tableHeaderLayout.setComponentAlignment(grid, Alignment.TOP_CENTER);
+ tableHeaderLayout.setExpandRatio(grid, 1.0f);
addComponent(tableHeaderLayout);
@@ -66,10 +69,6 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
}
- /**
- * @return
- *
- */
private HorizontalLayout createCountMessageComponent() {
final HorizontalLayout rolloutGroupTargetsCountLayout = new HorizontalLayout();
final Label countMessageLabel = getCountMessageLabel();
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarDetails.java
new file mode 100644
index 000000000..342b0eba1
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarDetails.java
@@ -0,0 +1,23 @@
+package org.eclipse.hawkbit.ui.rollout;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DistributionBarDetails {
+
+ private Map details = new HashMap<>();
+
+
+ public DistributionBarDetails( Map details){
+ this.details = details;
+ }
+
+ public Map getDetails() {
+ return details;
+ }
+
+ public void setDetails(Map details) {
+ this.details = details;
+ }
+
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/ProxyRollout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/ProxyRollout.java
index 92f30293a..c3080b789 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/ProxyRollout.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/ProxyRollout.java
@@ -8,8 +8,13 @@
*/
package org.eclipse.hawkbit.ui.rollout;
+import java.util.HashMap;
+import java.util.Map;
+
import org.eclipse.hawkbit.repository.model.Rollout;
+import com.vaadin.server.FontAwesome;
+
/**
* Proxy rollout with suctome properties.
*
@@ -26,21 +31,16 @@ public class ProxyRollout extends Rollout {
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 String totalTargetsCount;
+
+ //TODO remove this
+ private DistributionBarDetails distributionBarDetails ;
+
+ //TODO remove this
+ private Map statusTotalCountMap = new HashMap<>();
+
/**
* @return the distributionSetNameVersion
@@ -102,81 +102,6 @@ public class ProxyRollout extends Rollout {
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
*/
@@ -192,21 +117,6 @@ public class ProxyRollout extends Rollout {
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
*/
@@ -221,4 +131,27 @@ public class ProxyRollout extends Rollout {
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
+
+ public Map getStatusTotalCountMap() {
+ return statusTotalCountMap;
+ }
+
+ public void setStatusTotalCountMap(Map statusTotalCountMap) {
+ this.statusTotalCountMap = statusTotalCountMap;
+ }
+
+ public DistributionBarDetails getDistributionBarDetails() {
+ return distributionBarDetails;
+ }
+
+ public void setDistributionBarDetails(DistributionBarDetails distributionBarDetails) {
+ this.distributionBarDetails = distributionBarDetails;
+ }
+
+ public String getAction() {
+ return FontAwesome.CIRCLE_O.getHtml();
+ }
+
+
+
}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutBeanQuery.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutBeanQuery.java
index 8dfdca4b5..254e17352 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutBeanQuery.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutBeanQuery.java
@@ -132,23 +132,10 @@ public class RolloutBeanQuery extends AbstractBeanQuery {
proxyRollout.setStatus(rollout.getStatus());
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
-
- 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.setTotalTargetCountStatus(totalTargetCountActionStatus);
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
-
+
+ proxyRolloutList.add(proxyRollout);
}
return proxyRolloutList;
}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupBeanQuery.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupBeanQuery.java
index 7d6a3a46f..a42618c24 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupBeanQuery.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupBeanQuery.java
@@ -15,7 +15,6 @@ import java.util.Map;
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
import org.eclipse.hawkbit.repository.RolloutManagement;
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.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -122,22 +121,8 @@ public class RolloutGroupBeanQuery extends AbstractBeanQuery
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
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.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
proxyRolloutGroupsList.add(proxyRolloutGroup);
}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupListGrid.java
new file mode 100644
index 000000000..eb7ec1390
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutGroupListGrid.java
@@ -0,0 +1,390 @@
+package org.eclipse.hawkbit.ui.rollout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+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.customrenderers.renderers.HtmlLabelRenderer;
+import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
+import org.eclipse.hawkbit.ui.customrenderers.renderers.StringDistributionBarRenderer;
+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.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.server.Page;
+import com.vaadin.server.Page.BrowserWindowResizeEvent;
+import com.vaadin.server.Page.BrowserWindowResizeListener;
+import com.vaadin.spring.annotation.SpringComponent;
+import com.vaadin.spring.annotation.ViewScope;
+import com.vaadin.ui.Grid.CellDescriptionGenerator;
+import com.vaadin.ui.Grid.CellReference;
+import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
+
+@SpringComponent
+@ViewScope
+public class RolloutGroupListGrid extends AbstractSimpleGrid implements BrowserWindowResizeListener {
+ 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;
+
+ @Override
+ @PostConstruct
+ protected void init() {
+ super.init();
+ Page.getCurrent().addBrowserWindowResizeListener(this);
+ 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
+ */
+ @SuppressWarnings("unchecked")
+ @EventBusListenerMethod(scope = EventScope.SESSION)
+ public void onEvent(final RolloutGroupChangeEvent rolloutGroupChangeEvent) {
+ if (rolloutUIState.isShowRolloutGroups()) {
+ final RolloutGroup rolloutGroup = rolloutGroupManagement
+ .findRolloutGroupWithDetailedStatus(rolloutGroupChangeEvent.getRolloutGroupId());
+ final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
+ final Item item = rolloutContainer.getItem(rolloutGroup.getId());
+ if (item != null) {
+ 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 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);
+
+ 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 getTableId() {
+ return SPUIComponetIdProvider.ROLLOUT_GROUP_LIST_TABLE_ID;
+ }
+
+ @Override
+ protected void setColumnProperties() {
+ List
+
+ com.vaadin
+ vaadin-client
+ ${vaadin.version}
+
com.vaadin
vaadin-themes