Add additional class names and style to components and error indicators to distinguish different error levels.
Vaadin 7 solution for #3139
public static final String REQUIRED_EXT = "-required";
public static final String ERROR_EXT = "-error";
+
+ /**
+ * Style name and style name prefix for the error indicator element.
+ */
+ public static final String STYLE_NAME_ERROR_INDICATOR = "v-errorindicator";
}
*/
package com.vaadin.client;
+import com.vaadin.shared.ui.ErrorLevel;
import com.vaadin.shared.util.SharedUtil;
+/**
+ * An object that contains information about a tooltip, such as the tooltip's
+ * title, error message, error level and an ID.
+ */
public class TooltipInfo {
private String title;
private String errorMessageHtml;
+ private ErrorLevel errorLevel;
+
// Contains the tooltip's identifier. If a tooltip's contents and this
// identifier haven't changed, the tooltip won't be updated in subsequent
// events.
private Object identifier;
+ /**
+ * Constructs a new tooltip info instance.
+ */
public TooltipInfo() {
}
+ /**
+ * Constructs a new tooltip info instance.
+ *
+ * @param tooltip
+ * tooltip title
+ */
public TooltipInfo(String tooltip) {
setTitle(tooltip);
}
+ /**
+ * Constructs a new tooltip info instance.
+ *
+ * @param tooltip
+ * tooltip title
+ * @param errorMessage
+ * error message
+ */
public TooltipInfo(String tooltip, String errorMessage) {
this(tooltip, errorMessage, null);
}
+ /**
+ * Constructs a new tooltip info instance.
+ *
+ * @param tooltip
+ * tooltip title
+ * @param errorMessage
+ * error message
+ * @param identifier
+ * the tooltip's identifier
+ */
public TooltipInfo(String tooltip, String errorMessage, Object identifier) {
+ this(tooltip, errorMessage, identifier, null);
+ }
+
+ /**
+ * Constructs a new tooltip info instance.
+ *
+ * @param tooltip
+ * tooltip title
+ * @param errorMessage
+ * error message
+ * @param identifier
+ * the tooltip's identifier
+ * @param errorLevel
+ * error level
+ */
+ public TooltipInfo(String tooltip, String errorMessage, Object identifier,
+ ErrorLevel errorLevel) {
setIdentifier(identifier);
setTitle(tooltip);
setErrorMessage(errorMessage);
+ setErrorLevel(errorLevel);
}
+ /**
+ * Sets the tooltip's identifier.
+ *
+ * @param identifier
+ * the identifier to set
+ */
public void setIdentifier(Object identifier) {
this.identifier = identifier;
}
+ /**
+ * Gets the tooltip's identifier.
+ *
+ * @return the identifier
+ */
public Object getIdentifier() {
return identifier;
}
+ /**
+ * Gets the tooltip title.
+ *
+ * @return the title
+ */
public String getTitle() {
return title;
}
+ /**
+ * Sets the tooltip title.
+ *
+ * @param title
+ * the title to set
+ */
public void setTitle(String title) {
this.title = title;
}
+ /**
+ * Gets the error message.
+ *
+ * @return the error message
+ */
public String getErrorMessage() {
return errorMessageHtml;
}
+ /**
+ * Sets the error message.
+ *
+ * @param errorMessage
+ * the error message to set
+ */
public void setErrorMessage(String errorMessage) {
errorMessageHtml = errorMessage;
}
+ /**
+ * Gets the error level.
+ *
+ * @return the error level
+ */
+ public ErrorLevel getErrorLevel() {
+ return errorLevel;
+ }
+
+ /**
+ * Sets the error level.
+ *
+ * @param errorLevel
+ * the error level to set
+ */
+ public void setErrorLevel(ErrorLevel errorLevel) {
+ this.errorLevel = errorLevel;
+ }
+
/**
* Checks is a message has been defined for the tooltip.
*
|| (errorMessageHtml != null && !errorMessageHtml.isEmpty());
}
+ /**
+ * Indicates whether another tooltip info instance is equal to this one. Two
+ * instances are equal if their title, error message, error level and
+ * identifier are equal.
+ *
+ * @param other
+ * the reference tooltip info instance with which to compare
+ * @return {@code true} if the instances are equal, {@code false} otherwise
+ */
public boolean equals(TooltipInfo other) {
return (other != null && SharedUtil.equals(other.title, title)
&& SharedUtil.equals(other.errorMessageHtml, errorMessageHtml)
+ && SharedUtil.equals(other.errorLevel, errorLevel)
&& other.identifier == identifier);
}
}
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHTML;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractFieldConnector;
import com.vaadin.client.ui.Icon;
import com.vaadin.shared.AbstractFieldState;
import com.vaadin.shared.ComponentConstants;
import com.vaadin.shared.ui.ComponentStateUtil;
+import com.vaadin.shared.ui.ErrorLevel;
public class VCaption extends HTML {
errorIndicatorElement = DOM.createDiv();
DOM.setInnerHTML(errorIndicatorElement, " ");
DOM.setElementProperty(errorIndicatorElement, "className",
- "v-errorindicator");
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
DOM.insertChild(getElement(), errorIndicatorElement,
getInsertPosition(InsertPosition.ERROR));
Roles.getTextboxRole().setAriaHiddenState(errorIndicatorElement,
true);
}
+
+ ErrorUtil.setErrorLevelStyle(errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ owner.getState().errorLevel);
+
} else if (errorIndicatorElement != null) {
// Remove existing
getElement().removeChild(errorIndicatorElement);
public boolean updateCaptionWithoutOwner(String caption, boolean disabled,
boolean hasDescription, boolean hasError, String iconURL,
String iconAltText) {
+ return updateCaptionWithoutOwner(caption, disabled, hasDescription,
+ hasError, null, iconURL, iconAltText);
+ }
+
+ @Deprecated
+ public boolean updateCaptionWithoutOwner(String caption, boolean disabled,
+ boolean hasDescription, boolean hasError, ErrorLevel errorLevel,
+ String iconURL, String iconAltText) {
boolean wasPlacedAfterComponent = placedAfterComponent;
// Caption is placed after component unless there is some part which
errorIndicatorElement = DOM.createDiv();
DOM.setInnerHTML(errorIndicatorElement, " ");
DOM.setElementProperty(errorIndicatorElement, "className",
- "v-errorindicator");
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
DOM.insertChild(getElement(), errorIndicatorElement,
getInsertPosition(InsertPosition.ERROR));
}
+
+ ErrorUtil.setErrorLevelStyle(errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR, errorLevel);
+
} else if (errorIndicatorElement != null) {
// Remove existing
getElement().removeChild(errorIndicatorElement);
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ui.VOverlay;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
+import com.vaadin.shared.ui.ErrorLevel;
public class VErrorMessage extends FlowPanel {
public static final String CLASSNAME = "v-errormessage";
}
}
+ /**
+ * Sets the correct error level style name for the error message and removes
+ * all previous style names.
+ *
+ * @param errorLevel
+ * error level
+ * @since
+ */
+ public void updateErrorLevel(ErrorLevel errorLevel) {
+ ErrorUtil.setErrorLevelStyle(getStyleElement(), CLASSNAME, errorLevel);
+ }
+
/**
* Shows this error message next to given element.
*
&& !info.getErrorMessage().isEmpty()) {
em.setVisible(true);
em.updateMessage(info.getErrorMessage());
+ em.updateErrorLevel(info.getErrorLevel());
} else {
em.setVisible(false);
}
@Override
public void hide() {
em.updateMessage("");
+ em.updateErrorLevel(null);
description.setInnerHTML("");
updatePosition(null, true);
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.shared.ui.ErrorLevel;
import com.vaadin.shared.util.SharedUtil;
/**
// 12 + int(30.6) / 60 = 12 + 30/60 = 12.5
return integerPart + ((int) nrFractions) / divisor;
}
+
+ /**
+ * Utility methods for displaying error message on components.
+ */
+ public static class ErrorUtil {
+
+ /**
+ * Sets the error level style name for the given element and removes all
+ * previously applied error level style names. The style name has the
+ * {@code prefix-errorLevel} format.
+ *
+ * @param element
+ * element to apply the style name to
+ * @param prefix
+ * part of the style name before the error level string
+ * @param errorLevel
+ * error level for which the style will be applied
+ */
+ public static void setErrorLevelStyle(Element element, String prefix,
+ ErrorLevel errorLevel) {
+ for (ErrorLevel errorLevelValue : ErrorLevel.values()) {
+ String className =
+ prefix + "-" + errorLevelValue.toString().toLowerCase();
+ if (errorLevel == errorLevelValue) {
+ element.addClassName(className);
+ } else {
+ element.removeClassName(className);
+ }
+ }
+ }
+ }
}
import com.vaadin.client.Util;
import com.vaadin.client.VConsole;
import com.vaadin.client.WidgetUtil;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.annotations.OnStateChange;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.metadata.NoDataException;
setWidgetStyleNameWithPrefix(primaryStyleName, StyleConstants.ERROR_EXT,
null != state.errorMessage);
+ // add or remove error level style name
+ ErrorUtil.setErrorLevelStyle(getWidget().getElement(),
+ primaryStyleName + StyleConstants.ERROR_EXT, state.errorLevel);
+
// add additional user defined style names as class names, prefixed with
// component default class name. remove nonexistent style names.
@Override
public TooltipInfo getTooltipInfo(Element element) {
- return new TooltipInfo(getState().description, getState().errorMessage);
+ return new TooltipInfo(getState().description, getState().errorMessage,
+ null, getState().errorLevel);
}
@Override
caption.updateCaptionWithoutOwner(tabState.caption,
!tabState.enabled, hasAttribute(tabState.description),
hasAttribute(tabState.componentError),
+ tabState.componentErrorLevel,
connector.getResourceUrl(
- ComponentConstants.ICON_RESOURCE + tabState.key));
+ ComponentConstants.ICON_RESOURCE + tabState.key),
+ tabState.iconAltText);
}
private boolean hasAttribute(String string) {
import com.vaadin.client.Focusable;
import com.vaadin.client.StyleConstants;
import com.vaadin.client.VTooltip;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.ui.aria.AriaHelper;
import com.vaadin.shared.AbstractComponentState;
import com.vaadin.shared.ComponentConstants;
import com.vaadin.shared.ui.ComponentStateUtil;
+import com.vaadin.shared.ui.ErrorLevel;
import com.vaadin.shared.ui.MarginInfo;
/**
}
public void updateError(Widget widget, String errorMessage,
- boolean hideErrors) {
+ ErrorLevel errorLevel, boolean hideErrors) {
final ErrorFlag e = widgetToError.get(widget);
if (e != null) {
- e.updateError(errorMessage, hideErrors);
+ e.updateError(errorMessage, errorLevel, hideErrors);
}
}
return owner;
}
- public void updateError(String errorMessage, boolean hideErrors) {
+ public void updateError(String errorMessage, ErrorLevel errorLevel,
+ boolean hideErrors) {
boolean showError = null != errorMessage;
if (hideErrors) {
showError = false;
errorIndicatorElement = DOM.createDiv();
DOM.setInnerHTML(errorIndicatorElement, " ");
DOM.setElementProperty(errorIndicatorElement, "className",
- "v-errorindicator");
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
DOM.appendChild(getElement(), errorIndicatorElement);
// Hide the error indicator from screen reader, as this
.setAriaHiddenState(errorIndicatorElement, true);
}
+ ErrorUtil.setErrorLevelStyle(errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR, errorLevel);
+
} else if (errorIndicatorElement != null) {
DOM.removeChild(getElement(), errorIndicatorElement);
errorIndicatorElement = null;
import com.google.gwt.user.client.ui.SimplePanel;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.Focusable;
+import com.vaadin.client.StyleConstants;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner;
import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler;
+import com.vaadin.shared.ui.ErrorLevel;
public class VPanel extends SimplePanel
implements ShortcutActionHandlerOwner, Focusable {
}
/** For internal use only. May be removed or replaced in the future. */
- public void setErrorIndicatorVisible(boolean showError) {
+ public void setErrorIndicatorVisible(boolean showError,
+ ErrorLevel errorLevel) {
if (showError) {
if (errorIndicatorElement == null) {
errorIndicatorElement = DOM.createSpan();
DOM.setElementProperty(errorIndicatorElement, "className",
- "v-errorindicator");
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
DOM.sinkEvents(errorIndicatorElement, Event.MOUSEEVENTS);
sinkEvents(Event.MOUSEEVENTS);
}
+
+ ErrorUtil.setErrorLevelStyle(errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR, errorLevel);
+
DOM.insertBefore(captionNode, errorIndicatorElement, captionText);
} else if (errorIndicatorElement != null) {
DOM.removeChild(captionNode, errorIndicatorElement);
if (tabState.description != null
|| tabState.componentError != null) {
setTooltipInfo(new TooltipInfo(tabState.description,
- tabState.componentError, this));
+ tabState.componentError, this,
+ tabState.componentErrorLevel));
} else {
setTooltipInfo(null);
}
boolean ret = updateCaptionWithoutOwner(captionString,
!tabState.enabled, hasAttribute(tabState.description),
hasAttribute(tabState.componentError),
+ tabState.componentErrorLevel,
tab.getTabsheet().connector.getResourceUrl(
ComponentConstants.ICON_RESOURCE + tabState.key),
tabState.iconAltText);
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.vaadin.client.MouseEventDetailsBuilder;
+import com.vaadin.client.StyleConstants;
import com.vaadin.client.VCaption;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.annotations.OnStateChange;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.ConnectorFocusAndBlurHandler;
ConnectorFocusAndBlurHandler.addHandlers(this);
}
- @OnStateChange("errorMessage")
- void setErrorMessage() {
+ @OnStateChange({"errorMessage", "errorLevel"})
+ void setErrorMessageAndLevel() {
if (null != getState().errorMessage) {
if (getWidget().errorIndicatorElement == null) {
getWidget().errorIndicatorElement = DOM.createSpan();
- getWidget().errorIndicatorElement
- .setClassName("v-errorindicator");
+ getWidget().errorIndicatorElement.setClassName(
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
}
+
+ ErrorUtil.setErrorLevelStyle(getWidget().errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ getState().errorLevel);
+
getWidget().wrapper.insertFirst(getWidget().errorIndicatorElement);
} else if (getWidget().errorIndicatorElement != null) {
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.vaadin.client.MouseEventDetailsBuilder;
+import com.vaadin.client.StyleConstants;
import com.vaadin.client.VCaption;
import com.vaadin.client.VTooltip;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.annotations.OnStateChange;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractFieldConnector;
getWidget().errorIndicatorElement = DOM.createSpan();
getWidget().errorIndicatorElement.setInnerHTML(" ");
DOM.setElementProperty(getWidget().errorIndicatorElement,
- "className", "v-errorindicator");
+ "className", StyleConstants.STYLE_NAME_ERROR_INDICATOR);
DOM.appendChild(getWidget().getElement(),
getWidget().errorIndicatorElement);
DOM.sinkEvents(getWidget().errorIndicatorElement,
} else {
getWidget().errorIndicatorElement.getStyle().clearDisplay();
}
+
+ ErrorUtil.setErrorLevelStyle(getWidget().errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ getState().errorLevel);
+
} else if (getWidget().errorIndicatorElement != null) {
getWidget().errorIndicatorElement.getStyle()
.setDisplay(Display.NONE);
if (null != getState().errorMessage) {
getWidget().errorMessage.updateMessage(getState().errorMessage);
+ getWidget().errorMessage.updateErrorLevel(getState().errorLevel);
getWidget().errorMessage.setVisible(true);
} else {
getWidget().errorMessage.setVisible(false);
}
getWidget().table.updateError(component.getWidget(),
- component.getState().errorMessage, hideErrors);
+ component.getState().errorMessage,
+ component.getState().errorLevel, hideErrors);
}
@Override
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.user.client.DOM;
+import com.vaadin.client.StyleConstants;
import com.vaadin.client.VCaption;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.Icon;
if (getWidget().errorIndicatorElement == null) {
getWidget().errorIndicatorElement = DOM.createDiv();
DOM.setElementProperty(getWidget().errorIndicatorElement,
- "className", "v-errorindicator");
+ "className", StyleConstants.STYLE_NAME_ERROR_INDICATOR);
}
+
+ ErrorUtil.setErrorLevelStyle(getWidget().errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ getState().errorLevel);
+
DOM.insertChild(getWidget().getElement(),
getWidget().errorIndicatorElement, 0);
} else if (getWidget().errorIndicatorElement != null) {
package com.vaadin.client.ui.nativebutton;
import com.google.gwt.user.client.DOM;
+import com.vaadin.client.StyleConstants;
import com.vaadin.client.VCaption;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractComponentConnector;
import com.vaadin.client.ui.ConnectorFocusAndBlurHandler;
if (null != getState().errorMessage) {
if (getWidget().errorIndicatorElement == null) {
getWidget().errorIndicatorElement = DOM.createSpan();
- getWidget().errorIndicatorElement
- .setClassName("v-errorindicator");
+ getWidget().errorIndicatorElement.setClassName(
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
}
+
+ ErrorUtil.setErrorLevelStyle(getWidget().errorIndicatorElement,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ getState().errorLevel);
+
getWidget().getElement().insertBefore(
getWidget().errorIndicatorElement,
getWidget().captionElement);
slot.setCaptionResizeListener(null);
}
- slot.setCaption(caption, icon, styles, error, showError, required,
- enabled, child.getState().captionAsHtml);
+ slot.setCaption(caption, icon, styles, error,
+ child.getState().errorLevel, showError, required, enabled,
+ child.getState().captionAsHtml);
AriaHelper.handleInputRequired(child.getWidget(), required);
AriaHelper.handleInputInvalid(child.getWidget(), showError);
import com.vaadin.client.LayoutManager;
import com.vaadin.client.StyleConstants;
import com.vaadin.client.WidgetUtil;
+import com.vaadin.client.WidgetUtil.ErrorUtil;
import com.vaadin.client.ui.FontIcon;
import com.vaadin.client.ui.Icon;
import com.vaadin.client.ui.ImageIcon;
import com.vaadin.client.ui.layout.ElementResizeEvent;
import com.vaadin.client.ui.layout.ElementResizeListener;
import com.vaadin.shared.ui.AlignmentInfo;
+import com.vaadin.shared.ui.ErrorLevel;
/**
* Represents a slot which contains the actual widget in the layout.
public void setCaption(String captionText, Icon icon, List<String> styles,
String error, boolean showError, boolean required, boolean enabled,
boolean captionAsHtml) {
+ setCaption(captionText, icon, styles, error, null, showError, required,
+ enabled, captionAsHtml);
+ }
+
+ /**
+ * Set the caption of the slot
+ *
+ * @param captionText
+ * The text of the caption
+ * @param icon
+ * The icon
+ * @param styles
+ * The style names
+ * @param error
+ * The error message
+ * @param errorLevel
+ * The error level
+ * @param showError
+ * Should the error message be shown
+ * @param required
+ * Is the (field) required
+ * @param enabled
+ * Is the component enabled
+ * @param captionAsHtml
+ * true if the caption should be rendered as HTML, false
+ * otherwise
+ */
+ public void setCaption(String captionText, Icon icon, List<String> styles,
+ String error, ErrorLevel errorLevel, boolean showError,
+ boolean required, boolean enabled, boolean captionAsHtml) {
// TODO place for optimization: check if any of these have changed
// since last time, and only run those changes
if (error != null && showError) {
if (errorIcon == null) {
errorIcon = DOM.createSpan();
- errorIcon.setClassName("v-errorindicator");
+ errorIcon.setClassName(
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR);
}
+
+ ErrorUtil.setErrorLevelStyle(errorIcon,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR, errorLevel);
+
caption.appendChild(errorIcon);
} else if (errorIcon != null) {
errorIcon.removeFromParent();
getWidget().setIconUri(null, client);
}
- getWidget().setErrorIndicatorVisible(null != getState().errorMessage);
+ getWidget().setErrorIndicatorVisible(null != getState().errorMessage,
+ getState().errorLevel);
// We may have actions attached to this panel
if (uidl.getChildCount() > 0) {
return text;
}
+ /**
+ * Converts this to an error level that can be used on the client side.
+ *
+ * @return error level for the client side
+ */
+ public com.vaadin.shared.ui.ErrorLevel convertToShared() {
+ switch (this) {
+ case INFORMATION:
+ return com.vaadin.shared.ui.ErrorLevel.INFO;
+ case WARNING:
+ return com.vaadin.shared.ui.ErrorLevel.WARNING;
+ case CRITICAL:
+ return com.vaadin.shared.ui.ErrorLevel.CRITICAL;
+ case SYSTEMERROR:
+ return com.vaadin.shared.ui.ErrorLevel.SYSTEM;
+ case ERROR:
+ default:
+ return com.vaadin.shared.ui.ErrorLevel.ERROR;
+ }
+ }
}
/**
ErrorMessage error = getErrorMessage();
if (null != error) {
getState().errorMessage = error.getFormattedHtmlMessage();
+ getState().errorLevel = error.getErrorLevel().convertToShared();
} else {
getState().errorMessage = null;
+ getState().errorLevel = null;
}
getState().immediate = isImmediate();
public void setComponentError(ErrorMessage componentError) {
this.componentError = componentError;
- String formattedHtmlMessage = componentError != null
- ? componentError.getFormattedHtmlMessage() : null;
- tabState.componentError = formattedHtmlMessage;
+ if (componentError != null) {
+ tabState.componentError = componentError
+ .getFormattedHtmlMessage();
+ tabState.componentErrorLevel = componentError.getErrorLevel()
+ .convertToShared();
+ } else {
+ tabState.componentError = null;
+ tabState.componentErrorLevel = null;
+ }
+
markAsDirty();
}
import com.vaadin.shared.annotations.NoLayout;
import com.vaadin.shared.communication.SharedState;
+import com.vaadin.shared.ui.ErrorLevel;
/**
* Default shared state implementation for AbstractComponent.
public String id = null;
public String primaryStyleName = null;
- // HTML formatted error message for the component
- // TODO this could be an object with more information, but currently the UI
- // only uses the message
+ /** HTML formatted error message for the component */
public String errorMessage = null;
+
+ /** Level of error */
+ public ErrorLevel errorLevel = null;
+
public boolean captionAsHtml = false;
}
--- /dev/null
+/*
+ * 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.shared.ui;
+
+/**
+ * Represents the error levels displayed on components.
+ * @author Vaadin Ltd
+ * @since
+ */
+public enum ErrorLevel {
+
+ /**
+ * Error level for informational messages.
+ */
+ INFO,
+
+ /**
+ * Error level for warning messages.
+ */
+ WARNING,
+
+ /**
+ * Error level for regular messages.
+ */
+ ERROR,
+
+ /**
+ * Error level for critical messages.
+ */
+ CRITICAL,
+
+ /**
+ * Error level for system errors and bugs.
+ */
+ SYSTEM
+}
import java.io.Serializable;
+import com.vaadin.shared.ui.ErrorLevel;
+
/**
* Shared state of a single tab in a Tabsheet or an Accordion.
*
public String styleName;
public String key;
public String componentError;
+ public ErrorLevel componentErrorLevel;
public String id;
public String iconAltText;
}
}
+ .#{$primary-stylename}-error-info {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-level-info-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-info-color;
+ border-color: $v-error-indicator-level-info-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-warning {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-level-warning-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-warning-color;
+ border-color: $v-error-indicator-level-warning-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-error {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-level-error-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-error-color;
+ border-color: $v-error-indicator-level-error-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-critical {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-level-critical-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-critical-color;
+ border-color: $v-error-indicator-level-critical-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-system {
+ .#{$primary-stylename}-input {
+ @include valo-textfield-error-level-system-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-system-color;
+ border-color: $v-error-indicator-level-system-color;
+ }
+ }
+
.#{$primary-stylename}-suggestpopup {
@include valo-combobox-popup-style;
}
}
}
+ .#{$primary-stylename}-error-info {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-level-info-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-info-color;
+ border-color: $v-error-indicator-level-info-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-warning {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-level-warning-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-warning-color;
+ border-color: $v-error-indicator-level-warning-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-error {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-level-error-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-error-color;
+ border-color: $v-error-indicator-level-error-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-critical {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-level-critical-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-critical-color;
+ border-color: $v-error-indicator-level-critical-color;
+ }
+ }
+
+ .#{$primary-stylename}-error-system {
+ .#{$primary-stylename}-textfield {
+ @include valo-textfield-error-level-system-style;
+ }
+
+ .#{$primary-stylename}-button {
+ color: $v-error-indicator-level-system-color;
+ border-color: $v-error-indicator-level-system-color;
+ }
+ }
+
// Different widths for different resolutions
.#{$primary-stylename}-full {
width: round($v-font-size * 15);
@include valo-textfield-error-style;
}
+ .#{$primary-stylename}-error-info {
+ @include valo-textfield-error-level-info-style;
+ }
+
+ .#{$primary-stylename}-error-warning {
+ @include valo-textfield-error-level-warning-style;
+ }
+
+ .#{$primary-stylename}-error-error {
+ @include valo-textfield-error-level-error-style;
+ }
+
+ .#{$primary-stylename}-error-critical {
+ @include valo-textfield-error-level-critical-style;
+ }
+
+ .#{$primary-stylename}-error-system {
+ @include valo-textfield-error-level-system-style;
+ }
@if $include-additional-styles {
.#{$primary-stylename}-borderless {
*
* @group textfield
*/
-@mixin valo-textfield-error-style {
- border-color: $v-error-indicator-color !important;
- $bg: scale-color($v-error-indicator-color, $lightness: 98%);
+@mixin valo-textfield-error-style($indicator-color: $v-error-indicator-color) {
+ border-color: $indicator-color !important;
+ $bg: scale-color($indicator-color, $lightness: 98%);
background: $bg;
color: valo-font-color($bg);
}
+/**
+ * Outputs the styles for a text field error state with error level 'info'.
+ *
+ * @group textfield
+ */
+@mixin valo-textfield-error-level-info-style {
+ @include valo-textfield-error-style($v-error-indicator-level-info-color);
+}
+
+/**
+ * Outputs the styles for a text field error state with error level 'warning'.
+ *
+ * @group textfield
+ */
+@mixin valo-textfield-error-level-warning-style {
+ @include valo-textfield-error-style($v-error-indicator-level-warning-color);
+}
+
+/**
+ * Outputs the styles for a text field error state with error level 'error'.
+ *
+ * @group textfield
+ */
+@mixin valo-textfield-error-level-error-style {
+ @include valo-textfield-error-style($v-error-indicator-level-error-color);
+}
+
+/**
+ * Outputs the styles for a text field error state with error level 'critical'.
+ *
+ * @group textfield
+ */
+@mixin valo-textfield-error-level-critical-style {
+ @include valo-textfield-error-style($v-error-indicator-level-critical-color);
+}
+
+/**
+ * Outputs the styles for a text field error state with error level 'system'.
+ *
+ * @group textfield
+ */
+@mixin valo-textfield-error-level-system-style {
+ @include valo-textfield-error-style($v-error-indicator-level-system-color);
+}
+
/**
* Outputs the selectors and styles for an inline-icon style for a text field. Included indipendently (i.e. not enclosed with a parent text field selector).
}
}
+ .#{$primary-stylename}-error-info {
+ .#{$primary-stylename}-options,
+ .#{$primary-stylename}-selections {
+ @include valo-textfield-error-level-info-style;
+ }
+ }
+
+ .#{$primary-stylename}-error-warning {
+ .#{$primary-stylename}-options,
+ .#{$primary-stylename}-selections {
+ @include valo-textfield-error-level-warning-style;
+ }
+ }
+
+ .#{$primary-stylename}-error-error {
+ .#{$primary-stylename}-options,
+ .#{$primary-stylename}-selections {
+ @include valo-textfield-error-level-error-style;
+ }
+ }
+
+ .#{$primary-stylename}-error-critical {
+ .#{$primary-stylename}-options,
+ .#{$primary-stylename}-selections {
+ @include valo-textfield-error-level-critical-style;
+ }
+ }
+
+ .#{$primary-stylename}-error-system {
+ .#{$primary-stylename}-options,
+ .#{$primary-stylename}-selections {
+ @include valo-textfield-error-level-system-style;
+ }
+ }
}
@include valo-error-indicator-style;
}
+ .v-errorindicator-info {
+ @include valo-error-indicator-style($indicator-color: $v-error-indicator-level-info-color);
+ }
+
+ .v-errorindicator-warning {
+ @include valo-error-indicator-style($indicator-color: $v-error-indicator-level-warning-color);
+ }
+
+ .v-errorindicator-error {
+ @include valo-error-indicator-style($indicator-color: $v-error-indicator-level-error-color);
+ }
+
+ .v-errorindicator-critical {
+ @include valo-error-indicator-style($indicator-color: $v-error-indicator-level-critical-color);
+ }
+
+ .v-errorindicator-system {
+ @include valo-error-indicator-style($indicator-color: $v-error-indicator-level-system-color);
+ }
+
.v-required-field-indicator {
color: $v-required-field-indicator-color;
padding: 0 .2em;
*
* @requires {mixin} valo-error-indicator-icon-style by default
*/
-@mixin valo-error-indicator-style ($is-pseudo-element: false) {
- color: $v-error-indicator-color;
+@mixin valo-error-indicator-style ($is-pseudo-element: false, $indicator-color: $v-error-indicator-color) {
+ color: $indicator-color;
font-weight: 600;
width: ceil($v-unit-size/2);
text-align: center;
*/
$v-tooltip-error-message-font-color: $v-error-indicator-color !default;
+/**
+ * The font color for error tooltips for level 'info'.
+ *
+ * @type color
+ * @group tooltip
+ */
+$v-tooltip-error-message-level-info-font-color: $v-error-indicator-level-info-color !default;
+
+/**
+ * The font color for error tooltips for level 'warning'.
+ *
+ * @type color
+ * @group tooltip
+ */
+$v-tooltip-error-message-level-warning-font-color: $v-error-indicator-level-warning-color !default;
+
+/**
+ * The font color for error tooltips for level 'error'.
+ *
+ * @type color
+ * @group tooltip
+ */
+$v-tooltip-error-message-level-error-font-color: $v-error-indicator-level-error-color !default;
+
+/**
+ * The font color for error tooltips for level 'critical'.
+ *
+ * @type color
+ * @group tooltip
+ */
+$v-tooltip-error-message-level-critical-font-color: $v-error-indicator-level-critical-color !default;
+
+/**
+ * The font color for error tooltips for level 'system'.
+ *
+ * @type color
+ * @group tooltip
+ */
+$v-tooltip-error-message-level-system-font-color: $v-error-indicator-level-system-color !default;
+
/**
* The corner radius for tooltips.
*
}
}
+ .v-errormessage-info {
+ color: $v-tooltip-error-message-level-info-font-color;
+ }
+
+ .v-errormessage-warning {
+ color: $v-tooltip-error-message-level-warning-font-color;
+ }
+
+ .v-errormessage-error {
+ color: $v-tooltip-error-message-level-error-font-color;
+ }
+
+ .v-errormessage-critical {
+ color: $v-tooltip-error-message-level-critical-font-color;
+ }
+
+ .v-errormessage-system {
+ color: $v-tooltip-error-message-level-system-font-color;
+ }
+
.v-tooltip-text {
max-height: 10em;
overflow: auto;
*/
$v-selection-color: $v-focus-color !default;
+/**
+ * Color of the component error indication for 'info' error level.
+
+ * @group color
+ * @type color
+ */
+$v-error-indicator-level-info-color: #00a7f5 !default;
+
+/**
+ * Color of the component error indication for 'warning' error level.
+
+ * @group color
+ * @type color
+ */
+$v-error-indicator-level-warning-color: #fc9c00 !default;
+
+/**
+ * Color of the component error indication for 'error' error level.
+
+ * @group color
+ * @type color
+ */
+$v-error-indicator-level-error-color: #ed473b !default;
+
+/**
+ * Color of the component error indication for 'critical' error level.
+
+ * @group color
+ * @type color
+ */
+$v-error-indicator-level-critical-color: #fa007d !default;
+
+/**
+ * Color of the component error indication for 'system' error level.
+
+ * @group color
+ * @type color
+ */
+$v-error-indicator-level-system-color: #bb00ff !default;
+
/**
* Color of the component error indicator and other error indications, such as the
* error style notification.
* @group color
* @type color
*/
-$v-error-indicator-color: #ed473b !default;
+$v-error-indicator-color: $v-error-indicator-level-error-color !default;
/**
* Color of the required indicator in field components.
--- /dev/null
+package com.vaadin.tests.components;
+
+import java.util.Arrays;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.data.Property;
+import com.vaadin.server.AbstractErrorMessage;
+import com.vaadin.server.ErrorMessage;
+import com.vaadin.server.ExternalResource;
+import com.vaadin.server.UserError;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Accordion;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.FormLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Link;
+import com.vaadin.ui.NativeButton;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.TwinColSelect;
+import com.vaadin.ui.themes.ValoTheme;
+
+@Theme("valo")
+public class ErrorLevels extends AbstractTestUI {
+
+ private ComboBox errorLevels;
+ private Button button;
+ private Button borderlessButton;
+ private Link link;
+ private ComboBox comboBox;
+ private TextField textField;
+ private TextField textFieldBorderless;
+ private TabSheet tabSheet;
+ private Accordion accordion;
+ private CheckBox checkBox;
+ private NativeButton nativeButton;
+ private FormLayout formLayout;
+ private TextField formLayoutTextField;
+ private Panel panel;
+ private DateField dateField;
+ private TwinColSelect twinColSelect;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ errorLevels = new ComboBox("Error level",
+ Arrays.asList(ErrorMessage.ErrorLevel.values()));
+ errorLevels.setNullSelectionAllowed(false);
+ errorLevels.setValue(ErrorMessage.ErrorLevel.ERROR);
+ errorLevels.addValueChangeListener(new Property.ValueChangeListener() {
+ @Override
+ public void valueChange(Property.ValueChangeEvent event) {
+ setErrorMessages();
+ }
+ });
+ addComponent(errorLevels);
+
+ Label subtitle = new Label("Components");
+ subtitle.setStyleName(ValoTheme.LABEL_H3);
+ addComponent(subtitle);
+
+ // Button
+ button = new Button("Button");
+
+ borderlessButton = new Button("Borderless button");
+ borderlessButton.setStyleName(ValoTheme.BUTTON_BORDERLESS);
+
+ addComponent(new HorizontalLayout(button, borderlessButton));
+
+ // Native button
+ nativeButton = new NativeButton("Native button");
+ addComponent(nativeButton);
+
+ // Link
+ link = new Link("Link", new ExternalResource("#"));
+ addComponent(link);
+
+ // Combo box
+ comboBox = new ComboBox("Combo box");
+ addComponent(comboBox);
+
+ // Text field
+ textField = new TextField("Text field");
+ textField.setValue("text");
+
+ textFieldBorderless = new TextField("Borderless text field");
+ textFieldBorderless.setStyleName(ValoTheme.TEXTFIELD_BORDERLESS);
+ textFieldBorderless.setValue("text");
+
+ addComponent(new HorizontalLayout(textField, textFieldBorderless));
+
+ // Date field
+ dateField = new DateField("Date field");
+ addComponent(dateField);
+
+ // Check box
+ checkBox = new CheckBox("Check box");
+ addComponent(checkBox);
+
+ // Tab sheet
+ tabSheet = new TabSheet();
+ tabSheet.addTab(new Label("Label1"), "Tab1");
+ tabSheet.addTab(new Label("Label2"), "Tab2");
+ tabSheet.setWidth("400px");
+ addComponent(tabSheet);
+
+ // Accordion
+ accordion = new Accordion();
+ accordion.addTab(new Label("Label1"), "Tab1");
+ accordion.addTab(new Label("Label2"), "Tab2");
+ accordion.setWidth("400px");
+ addComponent(accordion);
+
+ // Form layout
+ formLayout = new FormLayout();
+ formLayout.setWidth("400px");
+
+ formLayoutTextField = new TextField("Form layout text field");
+ formLayout.addComponent(formLayoutTextField);
+
+ addComponent(formLayout);
+
+ // Panel
+ panel = new Panel();
+ panel.setContent(new Label("Panel"));
+ panel.setWidth("400px");
+ addComponent(panel);
+
+ // TwinColSelect
+ twinColSelect = new TwinColSelect("Twin col select");
+ addComponent(twinColSelect);
+
+ setErrorMessages();
+
+ getLayout().setSpacing(true);
+ }
+
+ private void setErrorMessages() {
+ button.setComponentError(createErrorMessage("Button error"));
+ borderlessButton.setComponentError(
+ createErrorMessage("Borderless button error"));
+ link.setComponentError(createErrorMessage("Link error"));
+ comboBox.setComponentError(createErrorMessage("ComboBox error"));
+ textField.setComponentError(createErrorMessage("Text field error"));
+ textFieldBorderless.setComponentError(
+ createErrorMessage("Borderless text field error"));
+ tabSheet.setComponentError(createErrorMessage("Tab sheet error"));
+ tabSheet.getTab(0).setComponentError(createErrorMessage("Tab error"));
+ accordion.setComponentError(createErrorMessage("Accordion error"));
+ accordion.getTab(0).setComponentError(createErrorMessage("Tab error"));
+ checkBox.setComponentError(createErrorMessage("Check box error"));
+ nativeButton
+ .setComponentError(createErrorMessage("Native button error"));
+ formLayout.setComponentError(createErrorMessage("Form layout error"));
+ formLayoutTextField.setComponentError(
+ createErrorMessage("Form layout text field error"));
+ panel.setComponentError(createErrorMessage("Panel error"));
+ dateField.setComponentError(createErrorMessage("Date field error"));
+ twinColSelect.setComponentError(createErrorMessage("Twin col select error"));
+ }
+
+ private ErrorMessage createErrorMessage(String text) {
+ return new UserError(text, AbstractErrorMessage.ContentMode.TEXT,
+ (ErrorMessage.ErrorLevel) errorLevels.getValue());
+ }
+}
--- /dev/null
+package com.vaadin.tests.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.client.StyleConstants;
+import com.vaadin.shared.ui.ErrorLevel;
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.AccordionElement;
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.CheckBoxElement;
+import com.vaadin.testbench.elements.DateFieldElement;
+import com.vaadin.testbench.elements.FormLayoutElement;
+import com.vaadin.testbench.elements.LinkElement;
+import com.vaadin.testbench.elements.NativeButtonElement;
+import com.vaadin.testbench.elements.PanelElement;
+import com.vaadin.testbench.elements.TabSheetElement;
+import com.vaadin.testbench.elements.TwinColSelectElement;
+import com.vaadin.testbench.parallel.BrowserUtil;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+import com.vaadin.tests.tb3.newelements.ComboBoxElement;
+
+public class ErrorLevelsTest extends SingleBrowserTest {
+
+ private ComboBoxElement errorLevelSelector;
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+ openTestURL();
+
+ errorLevelSelector = $(ComboBoxElement.class).first();
+ }
+
+ @Test
+ public void testErrorIndicatorsClassName() {
+ ErrorLevel errorLevel = ErrorLevel.WARNING;
+ selectErrorLevel(errorLevel);
+
+ List<WebElement> errorIndicators = findElements(
+ By.className(StyleConstants.STYLE_NAME_ERROR_INDICATOR));
+ for (WebElement errorIndicator : errorIndicators) {
+ assertHasRightClassNames(errorIndicator,
+ StyleConstants.STYLE_NAME_ERROR_INDICATOR,
+ errorLevel);
+ }
+ }
+
+ @Test
+ public void testComponentsClassName() {
+ ErrorLevel errorLevel = ErrorLevel.WARNING;
+ selectErrorLevel(errorLevel);
+
+ // Button
+ ButtonElement buttonElement = $(ButtonElement.class).first();
+ assertHasRightClassNames(buttonElement, "v-button-error", errorLevel);
+
+ // Native button
+ NativeButtonElement nativeButtonElement = $(NativeButtonElement.class)
+ .first();
+ assertHasRightClassNames(nativeButtonElement, "v-nativebutton-error",
+ errorLevel);
+
+ // Link
+ LinkElement linkElement = $(LinkElement.class).first();
+ assertHasRightClassNames(linkElement, "v-link-error", errorLevel);
+
+ // Combo box
+ ComboBoxElement comboBoxElement = $(ComboBoxElement.class).get(1);
+ assertHasRightClassNames(comboBoxElement, "v-filterselect-error",
+ errorLevel);
+
+ // Date field
+ DateFieldElement dateFieldElement = $(DateFieldElement.class).first();
+ assertHasRightClassNames(dateFieldElement, "v-datefield-error",
+ errorLevel);
+
+ // Checkbox
+ CheckBoxElement checkBoxElement = $(CheckBoxElement.class).first();
+ assertHasRightClassNames(checkBoxElement, "v-checkbox-error",
+ errorLevel);
+
+ // Tab sheet
+ TabSheetElement tabSheetElement = $(TabSheetElement.class).first();
+ assertHasRightClassNames(tabSheetElement, "v-tabsheet-error",
+ errorLevel);
+
+ // Accordion
+ AccordionElement accordionElement = $(AccordionElement.class).first();
+ assertHasRightClassNames(accordionElement, "v-accordion-error",
+ errorLevel);
+
+ // Form layout
+ FormLayoutElement formLayoutElement = $(FormLayoutElement.class)
+ .first();
+ assertHasRightClassNames(formLayoutElement, "v-formlayout-error",
+ errorLevel);
+
+ // Panel
+ PanelElement panelElement = $(PanelElement.class).first();
+ assertHasRightClassNames(panelElement, "v-panel-error", errorLevel);
+
+ // Twin col select
+ TwinColSelectElement twinColSelectElement = $(
+ TwinColSelectElement.class).first();
+ assertHasRightClassNames(twinColSelectElement, "v-select-twincol-error",
+ errorLevel);
+ }
+
+ private void assertHasRightClassNames(WebElement element, String prefix,
+ ErrorLevel errorLevel) {
+ Assert.assertTrue("Element must have only one error level class name",
+ containsCorrectErrorLevelClassNameOnly(element, prefix,
+ errorLevel));
+ }
+
+ private boolean containsCorrectErrorLevelClassNameOnly(WebElement element,
+ String prefix, ErrorLevel errorLevel) {
+ List<String> classNames = new ArrayList<String>(
+ Arrays.asList(element.getAttribute("class").split(" ")));
+ classNames.retainAll(getErrorLevelClassNames(prefix,
+ Arrays.asList(ErrorLevel.values())));
+ return classNames.size() == 1 && classNames
+ .contains(getErrorLevelClassName(prefix, errorLevel));
+ }
+
+ private String getErrorLevelClassName(String prefix,
+ ErrorLevel errorLevel) {
+ return prefix + "-" + errorLevel.toString().toLowerCase();
+ }
+
+ private List<String> getErrorLevelClassNames(String prefix,
+ Collection<ErrorLevel> errorLevels) {
+ List<String> classNames = new ArrayList<String>(errorLevels.size());
+ for (ErrorLevel errorLevel : errorLevels) {
+ classNames.add(getErrorLevelClassName(prefix, errorLevel));
+ }
+ return classNames;
+ }
+
+ private void selectErrorLevel(ErrorLevel errorLevel) {
+ errorLevelSelector.clear();
+ errorLevelSelector.sendKeys(errorLevel.toString().toLowerCase());
+ errorLevelSelector.sendKeys(getReturn());
+ }
+
+ private Keys getReturn() {
+ if (BrowserUtil.isPhantomJS(getDesiredCapabilities())) {
+ return Keys.ENTER;
+ } else {
+ return Keys.RETURN;
+ }
+ }
+}
}
private WebElement getCurrentErrorMessage() {
- return getDriver()
- .findElement(By.xpath("//div[@class='v-errormessage']"));
+ return getDriver().findElement(
+ By.xpath("//div[contains(@class, 'v-errormessage')]"));
}
private void assertTooltip(String tooltip) {