anmolbabu has uploaded a new change for review. Change subject: webadmin : Volume Capacity UI - Part2 ......................................................................
webadmin : Volume Capacity UI - Part2 This patch introduces the clock icon for refresh of volume and brick capacities.Clicking on the clock next to each volume manually forces a refresh of the volume and brick capacities. Change-Id: I983daf32966527cdfa7773e07aa055a24519fbe2 Signed-off-by: Anmol Babu <[email protected]> --- A frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/utils/TimeUnitConverter.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeBrickView.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/CompositeVolumeCapacityColumn.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityClockCell.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityCompositeCell.java A frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/RefreshClock.png 10 files changed, 330 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/02/23502/1 diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/utils/TimeUnitConverter.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/utils/TimeUnitConverter.java new file mode 100644 index 0000000..01f1b81 --- /dev/null +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/utils/TimeUnitConverter.java @@ -0,0 +1,124 @@ +package org.ovirt.engine.ui.frontend.utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.ovirt.engine.core.common.utils.Pair; + +public class TimeUnitConverter { + + public static enum TimeUnit { + + /* + * The weights of the units here are their equivalent number of previous units + */ + + Seconds(1 , 1) , //Base unit assumed here for all practical purposes is seconds.And 1 sec = 1 sec so weight = 1 + Minutes(2 , 60) , //1 minute = 60s + Hours(3 , 60) , //1 hour = 60 mins + Days(4 , 24) , //1 day = 24 hrs + Months(5 , 30) , //1 months = 30 days + Years(6 , 12); //1 year = 12 months.So,this assumes 12 * 30 = 360 days as 1 year + + public static List<Pair<TimeUnitConverter.TimeUnit, Long>> timeUnits = new ArrayList<Pair<TimeUnitConverter.TimeUnit, Long>>(); + /* + * List of triplet required because order is required and this ordering of units is independent of weight and to facilitate + * easy mapping between the triplet entities like unit name,weight and order. + */ + + private long value; + private int order; + + private TimeUnit(int order , long weight) { + this.value = weight; + this.order = order; + } + + static { + for(TimeUnit timeUnit : TimeUnit.values()) { + timeUnits.add(new Pair<TimeUnitConverter.TimeUnit, Long>(timeUnit, timeUnit.getWeight())); + } + /* + * Sort the Triplet list in descending order of Triplet order value. + */ + Collections.sort(timeUnits, new Comparator<Pair<TimeUnitConverter.TimeUnit, Long>>() { + @Override + public int compare(Pair<TimeUnitConverter.TimeUnit, Long> o1, Pair<TimeUnitConverter.TimeUnit, Long> o2) { + return o1.getFirst().getOrder() - o2.getFirst().getOrder(); + } + }); + } + + public long getWeight() { + return value; + } + + public void setWeight(long weight) { + this.value = weight; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + } + + public static Pair<Long, TimeUnitConverter.TimeUnit> convert(long inValue, TimeUnit inUnit, TimeUnit outUnit) { + /* + * Iterate over the list starting from the outUnit all the way upto inUnit and divide/multiply the inValue + * by the weights of the units iterated so far. + */ + if(inUnit.getOrder() < outUnit.getOrder()) { + //The conversion is from a lower to a upper unit. + for(int i = outUnit.getOrder(); i > inUnit.getOrder(); i-- ) { + /* + * Iterate over the list starting from the outUnit all the way upto inUnit and divide the inValue + * by the weights of the units iterated so far. + */ + inValue /= TimeUnit.timeUnits.get(i-1).getSecond(); + } + } else { + //The conversion is from a bigger unit to a smaller unit. + for(int i = outUnit.getOrder(); i < inUnit.getOrder(); i++ ) { + /* + * Iterate over the list starting from the outUnit all the way upto inUnit and multiply the inValue + * by the weights of the units iterated so far. + */ + inValue *= TimeUnit.timeUnits.get(i).getSecond(); + } + } + Pair<Long , TimeUnitConverter.TimeUnit> timePair = new Pair<Long, TimeUnitConverter.TimeUnit>(inValue, outUnit); + //The result is a pair of converted value and its unit. + return timePair; + } + + public static Pair<Long, TimeUnitConverter.TimeUnit> autoConvert(long inValue, TimeUnit inUnit) { + int i = inUnit.getOrder(); + Pair<Long, TimeUnitConverter.TimeUnit> result = new Pair<Long, TimeUnitConverter.TimeUnit>(); + int product = 1; + while(product <= inValue && i <= 5) { + product *= TimeUnit.timeUnits.get(i).getSecond(); + result.setSecond(TimeUnit.timeUnits.get(i).getFirst()); + if(product > inValue) { + /* + * If product exceeds the value, undo last transaction(multiplication and increment in i). + */ + product /= TimeUnit.timeUnits.get(i).getSecond(); + i--; + result.setSecond(TimeUnit.timeUnits.get(i).getFirst()); + break; + } + if(i == 5) { + break; + } + i++; + } + result.setFirst(inValue/product); + return result; + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java index 28242b9..98d1e9a 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java @@ -10,6 +10,7 @@ import org.ovirt.engine.core.common.action.gluster.CreateGlusterVolumeParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeOptionParameters; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeParameters; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRebalanceParameters; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType; @@ -65,6 +66,8 @@ public static final Integer STRIPE_COUNT_DEFAULT = 4; private UICommand newVolumeCommand; + + private UICommand refreshVolumeCapcity; public UICommand getNewVolumeCommand() { @@ -494,6 +497,8 @@ onRemoveVolume(); } else if(command.getName().equals("stop_rebalance_from_status")) {//$NON-NLS-1$ stopRebalance(); + } else if(command.equals(getRefreshVolumeCapcity())) { + refreshVolumeCapacities(); } } @@ -890,6 +895,17 @@ } } + public void refreshVolumeCapacities() { + Frontend.getInstance().runAction(VdcActionType.RefreshGlusterVolumeDetails, new GlusterVolumeParameters(((GlusterVolumeEntity)getSelectedItem()).getId()), new IFrontendActionAsyncCallback() { + @Override + public void executed(FrontendActionAsyncResult result) { + if(result.getReturnValue().getSucceeded()) { + refresh(); + } + } + }); + } + @Override protected String getListName() { return "VolumeListModel"; //$NON-NLS-1$ @@ -922,4 +938,12 @@ public boolean isSearchStringMatch(String searchString) { return searchString.trim().toLowerCase().startsWith("volume"); //$NON-NLS-1$ } + + public UICommand getRefreshVolumeCapcity() { + return refreshVolumeCapcity; + } + + public void setRefreshVolumeCapcity(UICommand refreshVolumeCapcity) { + this.refreshVolumeCapcity = refreshVolumeCapcity; + } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java index 1ce251b..27fc371 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationMessages.java @@ -101,4 +101,7 @@ @DefaultMessage("{0} GB") String rebalanceFileSizeGb(String size); + + @DefaultMessage("Last updated {0} {1} ago \nClick the icon to refresh now") + String volumeCapacityRefreshClockToolTip(long time, String timeUnit); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java index d765243..78cd1e6 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationResources.java @@ -412,4 +412,6 @@ @Source("images/glusterAsyncTasks/remove_brick_commit_required.png") ImageResource removeBrickCommitRequired(); + @Source("images/RefreshClock.png") + ImageResource clockImage(); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java index 2327042..8ec6320 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java @@ -20,6 +20,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabVolumePresenter; import org.ovirt.engine.ui.webadmin.section.main.view.AbstractMainTabWithDetailsTableView; import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; +import org.ovirt.engine.ui.webadmin.widget.table.column.CompositeVolumeCapacityColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.MenuCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityCompositeCell; @@ -27,6 +28,7 @@ import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeBrickStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeCapacityCell; +import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeCapacityClockCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeTaskWaitingCell; @@ -85,6 +87,29 @@ getTable().addColumn(new VolumeBrickStatusColumn(), constants.bricksStatusVolume(), "150px"); //$NON-NLS-1$ + WebAdminButtonDefinition<GlusterVolumeEntity> buttonDefinition = new WebAdminButtonDefinition<GlusterVolumeEntity>(constants.volumeCapacity()) { + @Override + protected UICommand resolveCommand() { + return getMainModel().getRefreshVolumeCapcity(); + } + }; + + List<HasCell<GlusterVolumeEntity, ?>> volumeCapacityCompositeList = new ArrayList<HasCell<GlusterVolumeEntity, ?>>(); + volumeCapacityCompositeList.add(new Column<GlusterVolumeEntity, GlusterVolumeEntity>(new VolumeCapacityCell()) { + @Override + public GlusterVolumeEntity getValue(GlusterVolumeEntity object) { + return object; + } + }); + volumeCapacityCompositeList.add(new Column<GlusterVolumeEntity, GlusterVolumeEntity>(new VolumeCapacityClockCell(buttonDefinition)) { + @Override + public GlusterVolumeEntity getValue(GlusterVolumeEntity object) { + return object; + } + }); + + getTable().addColumn(new CompositeVolumeCapacityColumn<GlusterVolumeEntity>(volumeCapacityCompositeList), constants.volumeCapacity(), "150px");//$NON-NLS-1$; + MenuCell<GlusterTaskSupport> rebalanceMenuCell = getRebalanceActivityMenu(constants); MenuCell<GlusterTaskSupport> removeBricksMenuCell = getRemoveBrickActivityMenu(constants); List<HasCell<GlusterTaskSupport, ?>> list = new ArrayList<HasCell<GlusterTaskSupport, ?>>(); @@ -121,13 +146,6 @@ return object; } }); - - getTable().addColumn(new Column<GlusterVolumeEntity, GlusterVolumeEntity>(new VolumeCapacityCell()) { - @Override - public GlusterVolumeEntity getValue(GlusterVolumeEntity object) { - return object; - } - }, constants.volumeCapacity(), "60px");//$NON-NLS-1$ getTable().addColumn(new VolumeActivityColumn<GlusterVolumeEntity>(new VolumeActivityCompositeCell<GlusterTaskSupport>(compositeList) { @Override diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeBrickView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeBrickView.java index d106c7a..73fd4f7 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeBrickView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeBrickView.java @@ -45,7 +45,7 @@ initWidget(getTable()); } - void initTable(ApplicationConstants constants) { + void initTable(final ApplicationConstants constants) { getTable().enableColumnResizing(); getTable().addColumn(new BrickStatusColumn(), constants.empty(), "30px"); //$NON-NLS-1$ @@ -75,6 +75,13 @@ BrickProperties brickProperties = object.getBrickProperties(); return (int)(((brickProperties.getTotalSize() - brickProperties.getFreeSize())/ (brickProperties.getTotalSize())) * 100); } + + @Override + protected String getProgressText(GlusterBrickEntity object) { + Integer progressValue = getProgressValue(object); + return progressValue != null ? progressValue + "%" : "?"; //$NON-NLS-1$ //$NON-NLS-2$ + } + }, constants.volumeCapacity(), "60px");//$NON-NLS-1$ getTable().addColumn(new VolumeActivityColumn<GlusterBrickEntity>(getActivityCell(constants)), diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/CompositeVolumeCapacityColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/CompositeVolumeCapacityColumn.java new file mode 100644 index 0000000..eb51047 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/CompositeVolumeCapacityColumn.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import java.io.Serializable; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; + +import com.google.gwt.cell.client.HasCell; +import com.google.gwt.user.cellview.client.Column; + +public class CompositeVolumeCapacityColumn<T extends Serializable> extends Column<GlusterVolumeEntity, GlusterVolumeEntity> { + + public CompositeVolumeCapacityColumn(List<HasCell<GlusterVolumeEntity, ?>> hasCells) { + super(new VolumeCapacityCompositeCell(hasCells)); + } + + @Override + public GlusterVolumeEntity getValue(GlusterVolumeEntity object) { + return object; + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityClockCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityClockCell.java new file mode 100644 index 0000000..ab53c6d --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityClockCell.java @@ -0,0 +1,67 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.ui.common.CommonApplicationResources; +import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition; +import org.ovirt.engine.ui.frontend.utils.TimeUnitConverter; +import org.ovirt.engine.ui.frontend.utils.TimeUnitConverter.TimeUnit; +import org.ovirt.engine.ui.webadmin.ApplicationMessages; +import org.ovirt.engine.ui.webadmin.ApplicationTemplates; +import org.ovirt.engine.ui.webadmin.gin.ClientGinjectorProvider; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.cell.client.ValueUpdater; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +public class VolumeCapacityClockCell extends AbstractCell<GlusterVolumeEntity> { + + private ApplicationTemplates templates = ClientGinjectorProvider.getApplicationTemplates(); + private static CommonApplicationResources resources = GWT.create(CommonApplicationResources.class); + private ApplicationMessages messages = ClientGinjectorProvider.getApplicationMessages(); + + private ActionButtonDefinition<GlusterVolumeEntity> buttonDefinition; + + public VolumeCapacityClockCell(ActionButtonDefinition<GlusterVolumeEntity> buttonDefinition) { + super("click");//$NON-NLS-1$ + this.buttonDefinition = buttonDefinition; + } + + @Override + public void render(Context context, GlusterVolumeEntity value, SafeHtmlBuilder sb) { + sb.append(templates.volumeActivityMenu(getImage(value.getAdvancedDetails().getUpdatedAt()))); + } + + private Pair<Long, TimeUnitConverter.TimeUnit> getTimeElapsed(long l) { + if(l < 0) { + l = 0; + } + return TimeUnitConverter.autoConvert(l, TimeUnit.Seconds); + } + + private SafeHtml getImage(Date updatedAt) { + ImageResource image; + image = resources.refreshButtonImage(); + Pair<Long, TimeUnit> interval = getTimeElapsed(new Date().compareTo(updatedAt)); + return templates.image(SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(image).getHTML()), messages.volumeCapacityRefreshClockToolTip(interval.getFirst(), interval.getSecond().toString())); + } + + @Override + public void onBrowserEvent(Context context, Element parent, GlusterVolumeEntity value, NativeEvent event, ValueUpdater<GlusterVolumeEntity> valueUpdater) { + super.onBrowserEvent(context, parent, value, event, valueUpdater); + List<GlusterVolumeEntity> values = new ArrayList<GlusterVolumeEntity>(); + values.add(value); + buttonDefinition.onClick(values); + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityCompositeCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityCompositeCell.java new file mode 100644 index 0000000..c22c4ea --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeCapacityCompositeCell.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import java.util.Iterator; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo; + +import com.google.gwt.cell.client.Cell; +import com.google.gwt.cell.client.CompositeCell; +import com.google.gwt.cell.client.HasCell; +import com.google.gwt.dom.client.Element; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; + +public class VolumeCapacityCompositeCell extends CompositeCell<GlusterVolumeEntity> { + + List<HasCell<GlusterVolumeEntity, ?>> hasCells; + public VolumeCapacityCompositeCell(List<HasCell<GlusterVolumeEntity, ?>> hasCells) { + super(hasCells); + this.hasCells = hasCells; + } + + @Override + public void render(Context context, GlusterVolumeEntity value, SafeHtmlBuilder sb) { + if((value.getAdvancedDetails() == null) || (!isVisible(value.getAdvancedDetails().getCapacityInfo()))) { + return; + } + sb.appendHtmlConstant("<table style=\"margin:0 auto\"><tr>"); //$NON-NLS-1$ + Iterator<HasCell<GlusterVolumeEntity, ?>> iterator = hasCells.iterator(); + while (iterator.hasNext()) { + render(context, value, sb, iterator.next()); + } + sb.appendHtmlConstant("</tr></table>"); //$NON-NLS-1$ + } + + private boolean isVisible(GlusterVolumeSizeInfo value) { + if(value == null) { + return false; + } + return true; + } + + @Override + protected <X> void render(Context context, GlusterVolumeEntity value, SafeHtmlBuilder sb, HasCell<GlusterVolumeEntity, X> hasCell) { + Cell<X> cell = hasCell.getCell(); + sb.appendHtmlConstant("<td>"); //$NON-NLS-1$ + cell.render(context, hasCell.getValue(value), sb); + sb.appendHtmlConstant("</td>"); //$NON-NLS-1$ + } + + @Override + protected Element getContainerElement(Element parent) { + return super.getContainerElement(parent).getFirstChildElement().getFirstChildElement().getFirstChildElement(); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/RefreshClock.png b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/RefreshClock.png new file mode 100644 index 0000000..cb277b2 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/webadmin/images/RefreshClock.png Binary files differ -- To view, visit http://gerrit.ovirt.org/23502 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I983daf32966527cdfa7773e07aa055a24519fbe2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: anmolbabu <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
