]> source.dussan.org Git - vaadin-framework.git/commitdiff
NoSelectionModel for Grid
authorPekka Hyvönen <pekka@vaadin.com>
Tue, 29 Nov 2016 14:29:39 +0000 (16:29 +0200)
committerVaadin Code Review <review@vaadin.com>
Wed, 30 Nov 2016 12:58:00 +0000 (12:58 +0000)
Fixes vaadin/framework8-issues#518

Change-Id: Ice6bdef03c3b62dd2c74376f98cfb8004dfa0bbf

client/src/main/java/com/vaadin/client/connectors/grid/NoSelectionModelConnector.java [new file with mode: 0644]
server/src/main/java/com/vaadin/ui/components/grid/NoSelectionModel.java [new file with mode: 0644]
server/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionModelTest.java [new file with mode: 0644]
uitest/src/main/java/com/vaadin/tests/components/grid/basics/GridBasics.java
uitest/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionTest.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/grid/basics/GridBasicsTest.java

diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/NoSelectionModelConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/NoSelectionModelConnector.java
new file mode 100644 (file)
index 0000000..383fae2
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2000-2016 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.client.connectors.grid;
+
+import com.vaadin.client.ServerConnector;
+import com.vaadin.client.extensions.AbstractExtensionConnector;
+import com.vaadin.client.widget.grid.selection.SelectionModel;
+import com.vaadin.shared.ui.Connect;
+
+import elemental.json.JsonObject;
+
+/**
+ * Connector for grids selection model that doesn't allow selecting anything.
+ *
+ * @author Vaadin Ltd
+ *
+ * @since 8.0
+ */
+@Connect(com.vaadin.ui.components.grid.NoSelectionModel.class)
+public class NoSelectionModelConnector extends AbstractExtensionConnector {
+
+    @Override
+    protected void extend(ServerConnector target) {
+        assert target instanceof GridConnector : "NoSelectionModelConnector cannot extend anything else than Grid.";
+
+        ((GridConnector) target).getWidget()
+                .setSelectionModel(new SelectionModel<JsonObject>() {
+
+                    @Override
+                    public void select(JsonObject item) {
+                    }
+
+                    @Override
+                    public void deselect(JsonObject item) {
+                    }
+
+                    @Override
+                    public boolean isSelected(JsonObject item) {
+                        return false;
+                    }
+
+                    @Override
+                    public void deselectAll() {
+                    }
+                });
+    }
+
+}
diff --git a/server/src/main/java/com/vaadin/ui/components/grid/NoSelectionModel.java b/server/src/main/java/com/vaadin/ui/components/grid/NoSelectionModel.java
new file mode 100644 (file)
index 0000000..047ee54
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2000-2016 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.ui.components.grid;
+
+import java.util.Collections;
+import java.util.Optional;
+import java.util.Set;
+
+import com.vaadin.server.AbstractExtension;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.GridSelectionModel;
+
+/**
+ * Selection model that doesn't allow selecting anything from the grid.
+ *
+ * @author Vaadin Ltd
+ *
+ * @since 8.0
+ *
+ * @param <T>
+ *            the type of items in the grid
+ */
+public class NoSelectionModel<T> extends AbstractExtension
+        implements GridSelectionModel<T> {
+
+    /**
+     * Creates a new no selection model and attaches it for the given grid.
+     *
+     * @param grid
+     *            the grid to bind the selection model into
+     */
+    public NoSelectionModel(Grid<T> grid) {
+        extend(grid);
+    }
+
+    @Override
+    public Set<T> getSelectedItems() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Optional<T> getFirstSelectedItem() {
+        return Optional.empty();
+    }
+
+    @Override
+    public void select(T item) {
+    }
+
+    @Override
+    public void deselect(T item) {
+    }
+
+    @Override
+    public void deselectAll() {
+    }
+
+}
\ No newline at end of file
diff --git a/server/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionModelTest.java b/server/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionModelTest.java
new file mode 100644 (file)
index 0000000..15456bd
--- /dev/null
@@ -0,0 +1,69 @@
+package com.vaadin.tests.components.grid;
+
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Optional;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.vaadin.server.data.provider.bov.Person;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.GridSelectionModel;
+import com.vaadin.ui.components.grid.MultiSelectionModelImpl;
+import com.vaadin.ui.components.grid.NoSelectionModel;
+import com.vaadin.ui.components.grid.SingleSelectionModelImpl;
+
+public class GridNoSelectionModelTest {
+
+    public static final Person PERSON_C = new Person("c", 3);
+    public static final Person PERSON_B = new Person("b", 2);
+    public static final Person PERSON_A = new Person("a", 1);
+
+    private Grid<Person> grid;
+    private GridSelectionModel<Person> model;
+
+    @Before
+    public void setUp() {
+        grid = new Grid<>();
+        grid.setItems(PERSON_A, PERSON_B, PERSON_C);
+
+        model = new NoSelectionModel<>(grid);
+        grid.setSelectionModel(model);
+    }
+
+    @Test
+    public void select() {
+        model.select(PERSON_A);
+
+        Assert.assertFalse(model.isSelected(PERSON_A));
+        Assert.assertEquals(0, model.getSelectedItems().size());
+        Assert.assertEquals(Optional.empty(), model.getFirstSelectedItem());
+
+        model.select(PERSON_B);
+
+        Assert.assertFalse(model.isSelected(PERSON_B));
+        Assert.assertEquals(0, model.getSelectedItems().size());
+        Assert.assertEquals(Optional.empty(), model.getFirstSelectedItem());
+    }
+
+    @Test
+    public void changingToSingleSelectionModel() {
+        grid.setSelectionModel(new SingleSelectionModelImpl<>(grid));
+
+        grid.getSelectionModel().select(PERSON_B);
+        Assert.assertEquals(PERSON_B,
+                grid.getSelectionModel().getFirstSelectedItem().get());
+    }
+
+    @Test
+    public void changingToMultiSelectionModel() {
+        grid.setSelectionModel(new MultiSelectionModelImpl<>(grid));
+
+        grid.getSelectionModel().select(PERSON_B);
+        Assert.assertEquals(new LinkedHashSet<>(Arrays.asList(PERSON_B)),
+                grid.getSelectionModel().getSelectedItems());
+    }
+
+}
index c2628598c553a92537194df6ebd3f09bbf83af3b..6d5a678ca7e511ac881c34d95a4174c29cc960c2 100644 (file)
@@ -42,6 +42,7 @@ import com.vaadin.ui.TextField;
 import com.vaadin.ui.VerticalLayout;
 import com.vaadin.ui.components.grid.MultiSelectionModelImpl;
 import com.vaadin.ui.components.grid.MultiSelectionModelImpl.SelectAllCheckBoxVisible;
+import com.vaadin.ui.components.grid.NoSelectionModel;
 import com.vaadin.ui.components.grid.SingleSelectionModelImpl;
 import com.vaadin.ui.renderers.DateRenderer;
 import com.vaadin.ui.renderers.HtmlRenderer;
@@ -495,6 +496,10 @@ public class GridBasics extends AbstractTestUIWithLog {
         selectionModelItem.addItem("multi", menuItem -> {
             switchToMultiSelect();
         });
+        selectionModelItem.addItem("none", menuItem -> {
+            selectionListenerRegistration.remove();
+            grid.setSelectionModel(new NoSelectionModel<>(grid));
+        });
 
         selectionModelItem.addItem("Select All", menuItem -> {
             switchToMultiSelect();
diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridNoSelectionTest.java
new file mode 100644 (file)
index 0000000..d0e36de
--- /dev/null
@@ -0,0 +1,136 @@
+package com.vaadin.tests.components.grid;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.customelements.GridElement;
+import com.vaadin.tests.components.grid.basics.GridBasicsTest;
+
+public class GridNoSelectionTest extends GridBasicsTest {
+
+    @Test
+    public void clickToSelectDoesNothing() {
+        setSelectionModelNone();
+
+        verifyClickSelectDoesNothing();
+    }
+
+    @Test
+    public void spaceBarSelectDoesNothing() {
+        setSelectionModelNone();
+
+        verifyKeyboardSelectionNotAllowed();
+    }
+
+    @Test
+    public void serverSideSelectDoesNothing() {
+        toggleFirstRowSelection();
+
+        assertTrue(getGridElement().getRow(0).isSelected());
+
+        setSelectionModelNone();
+
+        toggleFirstRowSelection();
+
+        assertFalse(getGridElement().getRow(0).isSelected());
+    }
+
+    @Test
+    public void changingSelectionModels_fromMulti() {
+        setSelectionModelMulti();
+
+        getGridElement().getCell(0, 0).click();
+        assertTrue(getGridElement().getRow(0).isSelected());
+
+        getGridElement().scrollToRow(50);
+        getGridElement().getCell(49, 0).click();
+        assertTrue(getGridElement().getRow(49).isSelected());
+
+        setSelectionModelNone();
+
+        assertFalse(getGridElement().getRow(0).isSelected());
+
+        verifyClickSelectDoesNothing();
+        verifyKeyboardSelectionNotAllowed();
+
+        getGridElement().scrollToRow(50);
+        assertFalse(getGridElement().getRow(49).isSelected());
+    }
+
+    @Test
+    public void changingSelectionModels_fromMultiAllSelected() {
+        setSelectionModelMulti();
+
+        getGridHeaderRowCells().get(0).click(); // select all click
+
+        assertTrue(getDefaultColumnHeader(0).findElement(By.tagName("input"))
+                .isSelected());
+        assertTrue(getGridElement().getRow(0).isSelected());
+        assertTrue(getGridElement().getRow(1).isSelected());
+        assertTrue(getGridElement().getRow(10).isSelected());
+
+        setSelectionModelNone();
+
+        assertEquals(0, getDefaultColumnHeader(0)
+                .findElements(By.tagName("input")).size());
+        assertFalse(getGridElement().getRow(0).isSelected());
+        assertFalse(getGridElement().getRow(1).isSelected());
+        assertFalse(getGridElement().getRow(10).isSelected());
+    }
+
+    @Test
+    public void changingSelectionModels_fromSingle() {
+        // this is the same as default
+        getGridElement().getCell(3, 0).click();
+        assertTrue(getGridElement().getRow(3).isSelected());
+
+        setSelectionModelNone();
+
+        assertFalse(getGridElement().getRow(3).isSelected());
+
+        verifyClickSelectDoesNothing();
+        verifyKeyboardSelectionNotAllowed();
+    }
+
+    protected void verifyClickSelectDoesNothing() {
+        getGridElement().getCell(0, 0).click();
+
+        assertFalse("Grid row should not be selected",
+                getGridElement().getRow(0).isSelected());
+
+        getGridElement().getCell(2, 2).click();
+
+        assertFalse("Grid row should not be selected",
+                getGridElement().getRow(2).isSelected());
+    }
+
+    protected void verifyKeyboardSelectionNotAllowed() {
+        GridElement grid = getGridElement();
+        grid.getCell(3, 1).click();
+
+        assertFalse("Grid should not allow selecting",
+                grid.getRow(3).isSelected());
+
+        new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
+
+        assertFalse("Grid should not allow selecting with space key",
+                grid.getRow(3).isSelected());
+
+        new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
+
+        assertFalse("Grid should not allow selecting",
+                grid.getRow(3).isSelected());
+
+        new Actions(getDriver()).sendKeys(Keys.ARROW_DOWN).perform();
+        new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
+        assertFalse("Grid should not allow selecting",
+                grid.getRow(4).isSelected());
+    }
+
+}
index 20e94cb7a6de06cd59d7cf947d4545641bae3cdb..5a88be96904790a77555e5fca4ed2bdfbd626fba 100644 (file)
@@ -235,6 +235,10 @@ public abstract class GridBasicsTest extends MultiBrowserTest {
         selectMenuPath("Component", "State", "Selection model", "single");
     }
 
+    protected void setSelectionModelNone() {
+        selectMenuPath("Component", "State", "Selection model", "none");
+    }
+
     protected void setSelectAllCheckBoxVisible() {
         selectMenuPath("Component", "State", "Selection model",
                 "SelectAllCheckbox: Visible");
@@ -255,10 +259,4 @@ public abstract class GridBasicsTest extends MultiBrowserTest {
 
         return header.findElement(By.tagName("input"));
     }
-
-    // TODO enable once select model none is added
-    // protected void setSelectionModelNone() {
-    // selectMenuPath("Component", "State", "Selection model", "none");
-    // }
-
 }