Можно ли установить styleClass элемента управления xp: из класса валидатора? - PullRequest
0 голосов
/ 21 сентября 2018

Для формы я установил валидатор для поля редактирования, например:

<xp:inputText
    id="inpRiskFactors" 
    styleClass="inputEscalation"
    value="#{matterBean.matter.escRiskFactors}" 
    validator="#{matterValidators.valEscRiskFactors}"...

Вот фрагмент моего метода проверки:

public void valEscRiskFactors(FacesContext facesContext, UIComponent component, Object value) {        
        utils.printToConsole(this.getClass().getSimpleName().toString() + " - valEscRiskFactors(...), value = " + value.toString());
        String msg = null;
        if (value.toString().replaceAll("\\s+","").equals("")){
            msg = matterProp.getProperty("msg_valid_esc_risk_factors");
            FacesMessage message = new FacesMessage(msg);
            throw new ValidatorException(message);
        }       
    }

Мне было интересно, если яможет изменить / установить свойство styleclass вызывающего компонента (компонента UIComponent) из этого метода?

Для пользователя было бы неплохо применить некоторые CSS к элементам управления xp:, которые требуются и не проходят проверку.

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Явный вызов setStyleClass метода UIComponent с приведением к XspInputText работает для меня

((XspInputText)component).setStyleClass("my-class");

Если вы не хотите выполнять приведение, но хотите применить styleClass к любомуКомпонент, который поддерживает такое свойство, может помочь Java-отражение:

try {
    Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
    if (setStyleClass != null) {
        setStyleClass.invoke(component, "my-class");
    }
} catch (SecurityException e) {} 
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}

Вы можете добавить styleClass вместо replace

try {
    String styleClass = null;
    Method getStyleClass = component.getClass().getMethod("getStyleClass");
    if (getStyleClass != null) {
        styleClass = (String)getStyleClass.invoke(component, (Object[])null);
    }
    Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
    if (setStyleClass != null) {
        String newStyleClass = StringUtil.isNotEmpty(styleClass) ? styleClass.concat(" my-class") : "my-class";
        setStyleClass.invoke(component, newStyleClass);
    }
} catch (SecurityException e) {} 
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}
0 голосов
/ 21 сентября 2018

В большинстве (всех?) Стандартных элементов управления XPages для проверки используется стандарт WAI-ARIA, и поэтому для свойства aria-invalid автоматически устанавливается значение "true", когда элемент управления недействителен.

Это означает, что вы можете использовать CSS для стилизации элемента управления вводом.Например, вы можете по-разному стилизовать цвет фона и границу, когда элемент управления недействителен:

[aria-invalid=true] {
    background-color: #fee;
    border-color: red;
} 
...