summaryrefslogtreecommitdiffstats
path: root/compatibility-server
diff options
context:
space:
mode:
Diffstat (limited to 'compatibility-server')
-rw-r--r--compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java19
-rw-r--r--compatibility-server/src/main/java/com/vaadin/v7/ui/Grid.java18
-rw-r--r--compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/ItemSetChangeDuringEditorCommit.java106
3 files changed, 142 insertions, 1 deletions
diff --git a/compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java b/compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java
index befdc26998..0be6b236d0 100644
--- a/compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java
+++ b/compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java
@@ -635,6 +635,25 @@ public class DateField extends AbstractField<Date> implements
}
}
+ @Override
+ public void discard() {
+ Property prop = getPropertyDataSource();
+ if (prop != null) {
+ Object value = prop.getValue();
+ if (!isValid() && value == null) {
+ // If the user entered an invalid value in the date field
+ // getInternalValue() returns null.
+ // If the datasource also contains null, then
+ // updateValueFromDataSource() will then not clear the internal
+ // state
+ // and error indicators (ticket #8069).
+ setInternalValue(null);
+ } else {
+ super.discard();
+ }
+ }
+ }
+
/*
* only fires the event if preventValueChangeEvent flag is false
*/
diff --git a/compatibility-server/src/main/java/com/vaadin/v7/ui/Grid.java b/compatibility-server/src/main/java/com/vaadin/v7/ui/Grid.java
index f89cf5544b..f7bcd8075f 100644
--- a/compatibility-server/src/main/java/com/vaadin/v7/ui/Grid.java
+++ b/compatibility-server/src/main/java/com/vaadin/v7/ui/Grid.java
@@ -4560,6 +4560,11 @@ public class Grid extends AbstractFocusable implements SelectionNotifier,
private Object editedItemId = null;
private boolean editorActive = false;
+ /**
+ * True while the editor is storing the field values, i.e. commiting the
+ * field group.
+ */
+ private boolean editorSaving = false;
private FieldGroup editorFieldGroup = new CustomFieldGroup();
private CellStyleGenerator cellStyleGenerator;
@@ -6902,7 +6907,12 @@ public class Grid extends AbstractFocusable implements SelectionNotifier,
* @see FieldGroup#commit()
*/
public void saveEditor() throws CommitException {
- editorFieldGroup.commit();
+ try {
+ editorSaving = true;
+ editorFieldGroup.commit();
+ } finally {
+ editorSaving = false;
+ }
}
/**
@@ -6910,6 +6920,12 @@ public class Grid extends AbstractFocusable implements SelectionNotifier,
* possible unsaved changes in the editor fields.
*/
public void cancelEditor() {
+ if (editorSaving) {
+ // If the editor is already saving the values, it's too late to
+ // cancel it. This prevents item set changes from propagating during
+ // save, causing discard to be run during commit.
+ return;
+ }
if (isEditorActive()) {
getEditorRpc()
.cancel(getContainerDataSource().indexOfId(editedItemId));
diff --git a/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/ItemSetChangeDuringEditorCommit.java b/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/ItemSetChangeDuringEditorCommit.java
new file mode 100644
index 0000000000..0a97a84999
--- /dev/null
+++ b/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/ItemSetChangeDuringEditorCommit.java
@@ -0,0 +1,106 @@
+package com.vaadin.v7.tests.server.component.grid;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.server.ServerRpcManager.RpcInvocationException;
+import com.vaadin.server.ServerRpcMethodInvocation;
+import com.vaadin.tests.util.MockUI;
+import com.vaadin.ui.UI;
+import com.vaadin.v7.data.fieldgroup.FieldGroup;
+import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
+import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.shared.ui.grid.EditorServerRpc;
+import com.vaadin.v7.ui.Grid;
+import com.vaadin.v7.ui.TextField;
+
+public class ItemSetChangeDuringEditorCommit {
+
+ private static class IndexedContainerImpl extends IndexedContainer {
+
+ public IndexedContainerImpl() {
+ }
+
+ @Override
+ public void fireItemSetChange() {
+ super.fireItemSetChange();
+ }
+ }
+
+ @Test
+ public void itemSetChangeDoesNotInterruptCommit()
+ throws RpcInvocationException, CommitException {
+ UI ui = new MockUI();
+ final IndexedContainerImpl indexedContainer = new IndexedContainerImpl();
+ indexedContainer.addContainerProperty("firstName", String.class,
+ "first");
+ indexedContainer.addContainerProperty("lastName", String.class, "last");
+ indexedContainer.addItem();
+ indexedContainer.addItem();
+
+ Grid grid = new Grid();
+ ui.setContent(grid);
+ grid.setContainerDataSource(indexedContainer);
+ grid.setEditorEnabled(true);
+ grid.getEditorFieldGroup()
+ .addCommitHandler(new FieldGroup.CommitHandler() {
+ @Override
+ public void preCommit(FieldGroup.CommitEvent commitEvent)
+ throws FieldGroup.CommitException {
+ }
+
+ @Override
+ public void postCommit(FieldGroup.CommitEvent commitEvent)
+ throws FieldGroup.CommitException {
+ indexedContainer.fireItemSetChange();
+ }
+ });
+
+ editItem(grid, 0);
+ ((TextField) grid.getEditorFieldGroup().getField("firstName"))
+ .setValue("New first");
+ ((TextField) grid.getEditorFieldGroup().getField("lastName"))
+ .setValue("New last");
+ grid.saveEditor();
+
+ Assert.assertEquals("New first", indexedContainer
+ .getContainerProperty(grid.getEditedItemId(), "firstName")
+ .getValue());
+ Assert.assertEquals("New last", indexedContainer
+ .getContainerProperty(grid.getEditedItemId(), "lastName")
+ .getValue());
+
+ grid.cancelEditor();
+ Assert.assertFalse(grid.isEditorActive());
+
+ editItem(grid, 0);
+ Assert.assertEquals("New first",
+ ((TextField) grid.getEditorFieldGroup().getField("firstName"))
+ .getValue());
+ Assert.assertEquals("New last",
+ ((TextField) grid.getEditorFieldGroup().getField("lastName"))
+ .getValue());
+ saveEditor(grid, 0);
+ }
+
+ private void editItem(Grid grid, int itemIndex)
+ throws RpcInvocationException {
+ ServerRpcMethodInvocation invocation = new ServerRpcMethodInvocation(
+ grid.getConnectorId(), EditorServerRpc.class, "bind", 1);
+ invocation.setParameters(new Object[] { itemIndex });
+ grid.getRpcManager(EditorServerRpc.class.getName())
+ .applyInvocation(invocation);
+ Assert.assertTrue(grid.isEditorActive());
+
+ }
+
+ private void saveEditor(Grid grid, int itemIndex)
+ throws RpcInvocationException {
+ ServerRpcMethodInvocation invocation = new ServerRpcMethodInvocation(
+ grid.getConnectorId(), EditorServerRpc.class, "save", 1);
+ invocation.setParameters(new Object[] { itemIndex });
+ grid.getRpcManager(EditorServerRpc.class.getName())
+ .applyInvocation(invocation);
+
+ }
+} \ No newline at end of file