Browse Source

Avoid obsolete calendar panel renderings to avoid various NPEs.

(#12504,#12667)

Change-Id: Ie0a9a8d9913116520b766062ebabdb771a76d1b6
tags/7.1.8
Matti Tahvonen 10 years ago
parent
commit
e1c38bf70c

+ 14
- 10
client/src/com/vaadin/client/ui/VCalendarPanel.java View File

@@ -2215,11 +2215,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
* - the allowed range's start date
*/
public void setRangeStart(Date rangeStart) {
this.rangeStart = rangeStart;
if (initialRenderDone) {
// Dynamic updates to the range needs to render the calendar to
// update the element stylenames
renderCalendar();
if (this.rangeStart != rangeStart) {
this.rangeStart = rangeStart;
if (initialRenderDone) {
// Dynamic updates to the range needs to render the calendar to
// update the element stylenames
renderCalendar();
}
}

}
@@ -2232,11 +2234,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
* - the allowed range's end date
*/
public void setRangeEnd(Date rangeEnd) {
this.rangeEnd = rangeEnd;
if (initialRenderDone) {
// Dynamic updates to the range needs to render the calendar to
// update the element stylenames
renderCalendar();
if (this.rangeEnd != rangeEnd) {
this.rangeEnd = rangeEnd;
if (initialRenderDone) {
// Dynamic updates to the range needs to render the calendar to
// update the element stylenames
renderCalendar();
}
}
}
}

+ 4
- 5
client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java View File

@@ -77,9 +77,6 @@ public class PopupDateFieldConnector extends TextualDateConnector {

String oldLocale = getWidget().getCurrentLocale();

boolean lastReadOnlyState = getWidget().isReadonly();
boolean lastEnabledState = getWidget().isEnabled();

getWidget().parsable = uidl.getBooleanAttribute("parsable");

super.updateFromUIDL(uidl, client);
@@ -92,7 +89,8 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.getCurrentResolution()) {
getWidget().calendar.setResolution(getWidget()
.getCurrentResolution());
if (getWidget().calendar.getDate() != null) {
if (getWidget().calendar.getDate() != null
&& getWidget().getCurrentDate() != null) {
getWidget().calendar.setDate((Date) getWidget()
.getCurrentDate().clone());
// force re-render when changing resolution only
@@ -101,7 +99,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
}

// Force re-render of calendar if locale has changed (#12153)
if (getWidget().getCurrentLocale() != oldLocale) {
if (!getWidget().getCurrentLocale().equals(oldLocale)) {
getWidget().calendar.renderCalendar();
}

@@ -113,6 +111,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.setFocusChangeListener(new FocusChangeListener() {
@Override
public void focusChanged(Date date) {

getWidget().updateValue(date);
getWidget().buildDate();
Date date2 = getWidget().calendar.getDate();

+ 103
- 0
uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java View File

@@ -7,8 +7,17 @@ import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Locale;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.abstractfield.AbstractFieldTest;
import com.vaadin.tests.tb3.MultiBrowserTest;
import com.vaadin.ui.DateField;

public class DateFieldTest<T extends DateField> extends AbstractFieldTest<T> {
@@ -140,4 +149,98 @@ public class DateFieldTest<T extends DateField> extends AbstractFieldTest<T> {
}
};

public static class Tb3DateFieldTests extends MultiBrowserTest {

@Override
protected boolean isDebug() {
// run in debug to see js errors
return true;
}

@Test
public void testMakingRequired() throws InterruptedException {
Thread.sleep(1000);
menu("Component");
menuSub("State");
menu("Required");
assertNoErrorNotification();
}

private void assertNoErrorNotification() {
try {
getDriver().findElement(
By.xpath("//div[contains(@class, 'v-Notification') ]"));
Assert.fail("Error notification shown!");
} catch (NoSuchElementException e) {
// As expected
}
}

@Test
public void testValueAfterOpeningPopupInRequiredField()
throws InterruptedException {
Thread.sleep(1000);
menu("Component");
menuSub("State");
menu("Required");

menu("Component");
menuSub("Features");
menuSub("Resolution");
menu("Month");

menu("Component");
menuSub("Listeners");
menu("Value change listener");

String inputtedValue = "2/12";
getInput().sendKeys(inputtedValue);

openPopup();
closePopup();
String actual = getInput().getAttribute("value");
Assert.assertEquals(inputtedValue, actual);
assertNoErrorNotification();

}

private void openPopup() throws InterruptedException {
Dimension size = getInput().getSize();
new Actions(getDriver()).moveToElement(getInput(), 0, 0)
.moveByOffset(size.getWidth() + 5, size.getHeight() / 2)
.click();
// This fails in Opera for some weird reason
// getDriver().findElement(By.className("v-datefield-button")).click();
}

private WebElement getInput() {
return getDriver().findElement(By.xpath("//input"));
}

private void closePopup() {
getDriver().findElement(By.tagName("body")).click();
}

/**
* @since
* @param string
*/
private void menuSub(String string) {
getDriver().findElement(
By.xpath("//span[text() = '" + string + "']")).click();
new Actions(getDriver()).moveByOffset(100, 0).build().perform();
}

/**
* @since
* @param string
*/
private void menu(String string) {
getDriver().findElement(
By.xpath("//span[text() = '" + string + "']")).click();

}

}

}

Loading…
Cancel
Save