From 97ecad0e0a0b638c1a49289bb1637ce882f7788a Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 3 Jun 2015 16:32:18 +0300 Subject: [PATCH] Required indicator for Table now works as expected (#17294) Table is a field (and one of the most powerful ones), but it cannot be used as required, especially if one wants to use the built in "required indicators" in Vaadin. Those only work if client side connector extends AbstractFieldConnector so Table is now extending it as well and (I expect that it ) needs to do the AbstractHasComponentsConnector stuff internally. Change-Id: I4ceb719366621053c7fe4c9691d624d61ed57567 --- .../client/ui/table/TableConnector.java | 46 ++++++++++-- .../table/TableRequiredIndicator.java | 73 +++++++++++++++++++ .../table/TableRequiredIndicatorTest.java | 39 ++++++++++ 3 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/table/TableRequiredIndicator.java create mode 100644 uitest/src/com/vaadin/tests/components/table/TableRequiredIndicatorTest.java diff --git a/client/src/com/vaadin/client/ui/table/TableConnector.java b/client/src/com/vaadin/client/ui/table/TableConnector.java index 0d34d2d4d9..7bbda39c43 100644 --- a/client/src/com/vaadin/client/ui/table/TableConnector.java +++ b/client/src/com/vaadin/client/ui/table/TableConnector.java @@ -15,24 +15,29 @@ */ package com.vaadin.client.ui.table; +import java.util.Collections; import java.util.Iterator; +import java.util.List; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Position; +import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.BrowserInfo; import com.vaadin.client.ComponentConnector; import com.vaadin.client.ConnectorHierarchyChangeEvent; +import com.vaadin.client.ConnectorHierarchyChangeEvent.ConnectorHierarchyChangeHandler; import com.vaadin.client.DirectionalManagedLayout; +import com.vaadin.client.HasComponentsConnector; import com.vaadin.client.Paintable; import com.vaadin.client.ServerConnector; import com.vaadin.client.TooltipInfo; import com.vaadin.client.UIDL; import com.vaadin.client.WidgetUtil; -import com.vaadin.client.ui.AbstractHasComponentsConnector; +import com.vaadin.client.ui.AbstractFieldConnector; import com.vaadin.client.ui.PostLayoutListener; import com.vaadin.client.ui.VScrollTable; import com.vaadin.client.ui.VScrollTable.ContextMenuDetails; @@ -42,8 +47,15 @@ import com.vaadin.shared.ui.table.TableConstants; import com.vaadin.shared.ui.table.TableState; @Connect(com.vaadin.ui.Table.class) -public class TableConnector extends AbstractHasComponentsConnector implements - Paintable, DirectionalManagedLayout, PostLayoutListener { +public class TableConnector extends AbstractFieldConnector implements + HasComponentsConnector, ConnectorHierarchyChangeHandler, Paintable, + DirectionalManagedLayout, PostLayoutListener { + + private List childComponents; + + public TableConnector() { + addConnectorHierarchyChangeHandler(this); + } @Override protected void init() { @@ -371,7 +383,7 @@ public class TableConnector extends AbstractHasComponentsConnector implements /** * Shows a saved row context menu if the row for the context menu is still * visible. Does nothing if a context menu has not been saved. - * + * * @param savedContextMenu */ public void showSavedContextMenu(ContextMenuDetails savedContextMenu) { @@ -429,11 +441,33 @@ public class TableConnector extends AbstractHasComponentsConnector implements protected void updateComponentSize(String newWidth, String newHeight) { super.updateComponentSize(newWidth, newHeight); - if("".equals(newWidth)) { + if ("".equals(newWidth)) { getWidget().updateWidth(); } - if("".equals(newHeight)) { + if ("".equals(newHeight)) { getWidget().updateHeight(); } } + + @Override + public List getChildComponents() { + if (childComponents == null) { + return Collections.emptyList(); + } + + return childComponents; + } + + @Override + public void setChildComponents(List childComponents) { + this.childComponents = childComponents; + } + + @Override + public HandlerRegistration addConnectorHierarchyChangeHandler( + ConnectorHierarchyChangeHandler handler) { + return ensureHandlerManager().addHandler( + ConnectorHierarchyChangeEvent.TYPE, handler); + } + } diff --git a/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicator.java b/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicator.java new file mode 100644 index 0000000000..2985932145 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicator.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.table; + +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Table; + +public class TableRequiredIndicator extends AbstractTestUI { + + static final String TABLE = "table"; + static final String COUNT_SELECTED_BUTTON = "button"; + static final int TOTAL_NUMBER_OF_ROWS = 300; + static final String COUNT_OF_SELECTED_ROWS_LABEL = "label"; + + @Override + protected void setup(VaadinRequest request) { + + final Table table = new Table(); + table.setId(TABLE); + table.setSelectable(true); + table.addContainerProperty("row", String.class, null); + for (int i = 0; i < TOTAL_NUMBER_OF_ROWS; i++) { + Object itemId = table.addItem(); + table.getContainerProperty(itemId, "row").setValue("row " + i); + } + addComponent(table); + + // This should cause red asterisk to the vertical layout + table.setRequired(true); + + table.addValueChangeListener(new ValueChangeListener() { + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = table.getValue(); + if (value != null) { + Notification.show("Value is set."); + } else { + Notification.show("Value is NOT set."); + } + + } + }); + } + + @Override + protected String getTestDescription() { + return "Table is required and should have red asterisk to indicate that."; + } + + @Override + protected Integer getTicketNumber() { + return 13008; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicatorTest.java b/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicatorTest.java new file mode 100644 index 0000000000..b94ddaee45 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/TableRequiredIndicatorTest.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.table; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.By; + +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * Checks that Table that has required flag set to true is also indicated as + * such on the client side. + * + * @author Vaadin Ltd + */ +public class TableRequiredIndicatorTest extends MultiBrowserTest { + + @Test + public void testRequiredIndicatorIsVisible() { + openTestURL(); + Assert.assertTrue(isElementPresent(By + .className("v-required-field-indicator"))); + } + +} -- 2.39.5