Browse Source

Fix enabled handling for DateField and PopupDateField (#17620)

Change-Id: I3e38bb5c03453b6c1ad5c9bb717241297a779f73
tags/7.5.0.beta1
Artur Signell 9 years ago
parent
commit
8b93cba4de

+ 11
- 8
client/src/com/vaadin/client/ui/VPopupCalendar.java View File

@@ -269,24 +269,29 @@ public class VPopupCalendar extends VTextualDate implements Field,
*/
public void setTextFieldEnabled(boolean textFieldEnabled) {
this.textFieldEnabled = textFieldEnabled;
updateTextFieldEnabled();
}

protected void updateTextFieldEnabled() {
boolean reallyEnabled = isEnabled() && isTextFieldEnabled();
// IE has a non input disabled themeing that can not be overridden so we
// must fake the functionality using readonly and unselectable
if (BrowserInfo.get().isIE()) {
if (!textFieldEnabled) {
if (!reallyEnabled) {
text.getElement().setAttribute("unselectable", "on");
text.getElement().setAttribute("readonly", "");
text.setTabIndex(-2);
} else if (textFieldEnabled
} else if (reallyEnabled
&& text.getElement().hasAttribute("unselectable")) {
text.getElement().removeAttribute("unselectable");
text.getElement().removeAttribute("readonly");
text.setTabIndex(0);
}
} else {
text.setEnabled(textFieldEnabled);
text.setEnabled(reallyEnabled);
}

if (textFieldEnabled) {
if (reallyEnabled) {
calendarToggle.setTabIndex(-1);
Roles.getButtonRole().setAriaHiddenState(
calendarToggle.getElement(), true);
@@ -466,7 +471,7 @@ public class VPopupCalendar extends VTextualDate implements Field,
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
updateTextFieldEnabled();
calendarToggle.setEnabled(enabled);
Roles.getButtonRole().setAriaDisabledState(calendarToggle.getElement(),
!enabled);
@@ -500,9 +505,7 @@ public class VPopupCalendar extends VTextualDate implements Field,
if (!parsable) {
setText(previousValue);
}

// superclass sets the text field independently when building date
setTextFieldEnabled(isEnabled() && isTextFieldEnabled());
updateTextFieldEnabled();
}

/**

+ 76
- 0
uitest/src/com/vaadin/tests/components/datefield/DateFieldWhenChangingValueAndEnablingParent.java View File

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

import java.util.Date;

import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.DateField;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.VerticalLayout;

public class DateFieldWhenChangingValueAndEnablingParent extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
final VerticalLayout main = new VerticalLayout();
final VerticalLayout sub = new VerticalLayout();
final CheckBox chk = new CheckBox("Parent layout enabled");

main.setMargin(true);
setContent(main);

final DateField df1 = createDateField(true);
final DateField df2 = createDateField(false);
final PopupDateField pdf1 = createPopupDateField(true, true);
final PopupDateField pdf2 = createPopupDateField(true, false);
final PopupDateField pdf3 = createPopupDateField(false, true);
final PopupDateField pdf4 = createPopupDateField(false, false);

sub.addComponent(df1);
sub.addComponent(df2);
sub.addComponent(pdf1);
sub.addComponent(pdf2);
sub.addComponent(pdf3);
sub.addComponent(pdf4);
sub.setEnabled(false);
main.addComponent(chk);
main.addComponent(sub);

chk.addValueChangeListener(new ValueChangeListener() {

@Override
public void valueChange(ValueChangeEvent event) {
df1.setValue(new Date());
df2.setValue(new Date());
pdf1.setValue(new Date());
pdf2.setValue(new Date());
pdf3.setValue(new Date());
pdf4.setValue(new Date());
sub.setEnabled(chk.getValue());
}
});
}

private DateField createDateField(boolean enabled) {
DateField df = new DateField("DateField, "
+ (enabled ? "enabled" : "disabled"));
df.setEnabled(enabled);
df.setId("DATEFIELD_" + (enabled ? "ENABLED" : "DISABLED"));
return df;
}

private PopupDateField createPopupDateField(boolean enabled,
boolean textInputEnabled) {
PopupDateField df = new PopupDateField("PopupDateField, "
+ (enabled ? "enabled" : "disabled") + ", text input "
+ (textInputEnabled ? "enabled" : "disabled"));
df.setEnabled(enabled);
df.setTextFieldEnabled(textInputEnabled);
df.setId("DATEFIELD_" + (enabled ? "ENABLED" : "DISABLED") + "_"
+ (textInputEnabled ? "ENABLED" : "DISABLED"));
return df;
}
}

+ 98
- 0
uitest/src/com/vaadin/tests/components/datefield/DateFieldWhenChangingValueAndEnablingParentTest.java View File

@@ -0,0 +1,98 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;

import com.vaadin.testbench.elements.CheckBoxElement;
import com.vaadin.testbench.elements.DateFieldElement;
import com.vaadin.testbench.elements.PopupDateFieldElement;
import com.vaadin.tests.tb3.SingleBrowserTest;

public class DateFieldWhenChangingValueAndEnablingParentTest extends
SingleBrowserTest {

@Test
public void ensureCorrectStateAfterEnabling() {
openTestURL();
$(CheckBoxElement.class).first().click();

assertState($(DateFieldElement.class).id("DATEFIELD_ENABLED"), true,
true);
assertState($(DateFieldElement.class).id("DATEFIELD_DISABLED"), false,
false);

assertState(
$(PopupDateFieldElement.class).id("DATEFIELD_ENABLED_ENABLED"),
true, true);
assertState(
$(PopupDateFieldElement.class).id("DATEFIELD_ENABLED_DISABLED"),
true, false);

// disabling widget should always disable input
assertState(
$(PopupDateFieldElement.class).id("DATEFIELD_DISABLED_ENABLED"),
false, false);
assertState(
$(PopupDateFieldElement.class)
.id("DATEFIELD_DISABLED_DISABLED"), false, false);

}

/**
* @since
* @param id
* @param widgetEnabled
* @param textInputEnabled
*/
private void assertState(DateFieldElement id, boolean widgetEnabled,
boolean textInputEnabled) {
assertDateFieldEnabled(id, widgetEnabled);
assertTextInputEnabled(id, textInputEnabled);

}

private void assertDateFieldEnabled(DateFieldElement id,
boolean assertEnabled) {
boolean hasClass = hasCssClass(id, "v-disabled");
boolean fieldEnabled = !hasClass;
if (assertEnabled) {
Assert.assertTrue("Field " + id.getAttribute("id")
+ " should be enabled", fieldEnabled);
} else {
Assert.assertFalse("Field " + id.getAttribute("id")
+ " should be disabled", fieldEnabled);
}

}

private void assertTextInputEnabled(DateFieldElement id, boolean enabled) {
String disabledAttr = id.findElement(By.xpath("./input")).getAttribute(
"disabled");
boolean textinputEnabled = (disabledAttr == null);

if (enabled) {
Assert.assertTrue("Field " + id.getAttribute("id")
+ " text field should be enabled", textinputEnabled);
} else {
Assert.assertFalse("Field " + id.getAttribute("id")
+ " text field should be disabled", textinputEnabled);
}

}
}

Loading…
Cancel
Save