Browse Source

Rebuild calendar pop-up on readOnly state change (#11249)

* Rebuild calendar pop-up on readOnly state change

Fixes https://github.com/vaadin/framework/issues/6565
tags/8.7.0.alpha1
Anastasia Smirnova 5 years ago
parent
commit
a52993ba9c

+ 9
- 0
client/src/main/java/com/vaadin/client/ui/VAbstractCalendarPanel.java View File

@@ -938,6 +938,15 @@ public abstract class VAbstractCalendarPanel<R extends Enum<R>>
renderCalendar(true);
}

/**
* Returns the value of initialRenderDone
*
* @since
*/
public boolean isInitialRenderDone() {
return initialRenderDone;
}

/**
* For internal use only. May be removed or replaced in the future.
*

+ 5
- 1
client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java View File

@@ -117,7 +117,7 @@ public abstract class TextualDateConnector<PANEL extends VAbstractCalendarPanel<
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
String oldLocale = getWidget().getCurrentLocale();
boolean isReadOnly = getWidget().isReadonly();
getWidget().parsable = getState().parsable;

super.onStateChanged(stateChangeEvent);
@@ -159,6 +159,10 @@ public abstract class TextualDateConnector<PANEL extends VAbstractCalendarPanel<
} else {
getWidget().calendarToggle.removeStyleName(
VAbstractPopupCalendar.CLASSNAME + "-button-readonly");
if (getState().readOnly != isReadOnly
&& getWidget().calendar.isInitialRenderDone()) {
getWidget().calendar.renderCalendar();
}
}

getWidget().setDescriptionForAssistiveDevices(

+ 37
- 0
uitest/src/main/java/com/vaadin/tests/components/datefield/DateTimeFieldAfterReadOnly.java View File

@@ -0,0 +1,37 @@
package com.vaadin.tests.components.datefield;

import com.vaadin.annotations.Widgetset;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.DateTimeResolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.DateTimeField;

import java.time.LocalDateTime;
import java.util.Locale;

@Widgetset("com.vaadin.DefaultWidgetSet")
public class DateTimeFieldAfterReadOnly extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
final DateTimeField timeField = new DateTimeField(
"A read-only datefield");
timeField.setResolution(DateTimeResolution.MINUTE);
timeField.setLocale(new Locale("fi"));
timeField.setId("dF");
// Set date so that testing always has same time
timeField.setValue(LocalDateTime.now());
timeField.setReadOnly(true);

addComponent(timeField);

Button b = new Button("Switch read-only");
b.addClickListener(event -> {
timeField.setReadOnly(!timeField.isReadOnly());
});
b.setId("readOnlySwitch");

addComponent(b);
}
}

+ 33
- 0
uitest/src/test/java/com/vaadin/tests/components/datefield/DateTimeFieldAfterReadOnlyTest.java View File

@@ -0,0 +1,33 @@
package com.vaadin.tests.components.datefield;

import com.vaadin.testbench.By;
import com.vaadin.testbench.elements.AbstractDateFieldElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
import org.junit.Test;

import static junit.framework.TestCase.assertEquals;

public class DateTimeFieldAfterReadOnlyTest extends MultiBrowserTest {

@Test
public void readOnlyDateFieldPopupShouldNotOpen() {
openTestURL();
toggleReadOnly();
openPopup();
assertEquals(2, numberOfSelectsField());
}

private void openPopup() {
$(AbstractDateFieldElement.class).first()
.findElement(By.tagName("button")).click();
}

private void toggleReadOnly() {
findElement(By.id("readOnlySwitch")).click();
}

private int numberOfSelectsField() {
return findElement(By.className("v-datefield-calendarpanel-time"))
.findElements(By.className("v-select")).size();
}
}

Loading…
Cancel
Save