diff options
Diffstat (limited to 'compatibility-server')
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 |