Skip to content

Commit

Permalink
Make fields with validators immediate (#13709)
Browse files Browse the repository at this point in the history
Change-Id: I113aa38869cf4dceec24315e70d3b44eae526f65
  • Loading branch information
Artur- authored and Vaadin Code Review committed May 19, 2015
1 parent 8513067 commit d63bf2c
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 4 deletions.
20 changes: 20 additions & 0 deletions server/src/com/vaadin/ui/AbstractComponent.java
Expand Up @@ -405,6 +405,26 @@ public boolean isConnectorEnabled() {
} }
} }


/**
* Returns the explicitly set immediate value.
*
* @return the explicitly set immediate value or null if
* {@link #setImmediate(boolean)} has not been explicitly invoked
*/
protected Boolean getExplicitImmediateValue() {
return explicitImmediateValue;
}

/**
* Returns the immediate mode of the component.
* <p>
* Certain operations such as adding a value change listener will set the
* component into immediate mode if {@link #setImmediate(boolean)} has not
* been explicitly called with false.
*
* @return true if the component is in immediate mode (explicitly or
* implicitly set), false if the component if not in immediate mode
*/
public boolean isImmediate() { public boolean isImmediate() {
if (explicitImmediateValue != null) { if (explicitImmediateValue != null) {
return explicitImmediateValue; return explicitImmediateValue;
Expand Down
18 changes: 18 additions & 0 deletions server/src/com/vaadin/ui/AbstractField.java
Expand Up @@ -1745,6 +1745,24 @@ private void removePropertyListeners() {
} }
} }


/**
* {@inheritDoc}
* <p>
* Fields are automatically set to immediate if validators have been added.
*/
@Override
public boolean isImmediate() {
if (getExplicitImmediateValue() != null) {
return getExplicitImmediateValue();
}
// Make field immediate when there is some kind of validation present
// (validator or required). This will avoid the UI being in a wrong
// state, e.g. user entered valid data but old validation error is still
// shown
return super.isImmediate() || !getValidators().isEmpty()
|| isRequired();
}

/* /*
* (non-Javadoc) * (non-Javadoc)
* *
Expand Down
@@ -1,16 +1,19 @@
package com.vaadin.tests.server.component.abstractfield; package com.vaadin.tests.server.component.abstractfield;


import junit.framework.TestCase; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;


import org.easymock.EasyMock; import org.easymock.EasyMock;
import org.junit.Test;


import com.vaadin.data.Validator; import com.vaadin.data.Validator;
import com.vaadin.ui.AbstractField; import com.vaadin.ui.AbstractField;
import com.vaadin.ui.Field;


public class AbsFieldValidatorsTest extends TestCase { public class AbsFieldValidatorsTest {


Field<Object> field = new AbstractField<Object>() { AbstractField<Object> field = new AbstractField<Object>() {
@Override @Override
public Class getType() { public Class getType() {
return Object.class; return Object.class;
Expand All @@ -20,6 +23,7 @@ public Class getType() {
Validator validator = EasyMock.createMock(Validator.class); Validator validator = EasyMock.createMock(Validator.class);
Validator validator2 = EasyMock.createMock(Validator.class); Validator validator2 = EasyMock.createMock(Validator.class);


@Test
public void testAddValidator() { public void testAddValidator() {
assertNotNull(field.getValidators()); assertNotNull(field.getValidators());
assertEquals(0, field.getValidators().size()); assertEquals(0, field.getValidators().size());
Expand All @@ -34,6 +38,7 @@ public void testAddValidator() {
assertTrue(field.getValidators().contains(validator2)); assertTrue(field.getValidators().contains(validator2));
} }


@Test
public void testRemoveValidator() { public void testRemoveValidator() {
field.addValidator(validator); field.addValidator(validator);
field.addValidator(validator2); field.addValidator(validator2);
Expand All @@ -51,6 +56,7 @@ public void testRemoveValidator() {
assertFalse(field.getValidators().contains(validator2)); assertFalse(field.getValidators().contains(validator2));
} }


@Test
public void testRemoveAllValidators() { public void testRemoveAllValidators() {
field.addValidator(validator); field.addValidator(validator);
field.addValidator(validator2); field.addValidator(validator2);
Expand All @@ -61,4 +67,51 @@ public void testRemoveAllValidators() {
assertFalse(field.getValidators().contains(validator)); assertFalse(field.getValidators().contains(validator));
assertFalse(field.getValidators().contains(validator2)); assertFalse(field.getValidators().contains(validator2));
} }

@Test
public void validatorShouldMakeImmediate() {
assertFalse("field should not be immediate by default",
field.isImmediate());
field.addValidator(validator);
assertTrue("field should be immediate when it has a validator",
field.isImmediate());
}

@Test
public void nonImmediateFieldWithValidator() {
field.setImmediate(false);
field.addValidator(validator);
assertFalse("field should be non-immediate because explicitly set",
field.isImmediate());
}

@Test
public void removeValidatorMakesNonImmediate() {
field.addValidator(validator);
field.removeValidator(validator);
assertFalse(
"field should be non-immediate after validator was removed",
field.isImmediate());
}

@Test
public void requiredMakesImmediate() {
assertFalse("field should not be immediate by default",
field.isImmediate());
field.setRequired(true);
assertTrue("field should be immediate when it is required",
field.isImmediate());
}

@Test
public void removeRequiredMakesNonImmediate() {
assertFalse("field should not be immediate by default",
field.isImmediate());
field.setRequired(true);
field.setRequired(false);
assertFalse(
"field should not be immediate even though it was required",
field.isImmediate());
}

} }

0 comments on commit d63bf2c

Please sign in to comment.