Pixelstix
Pixelstix

Reputation: 782

Primefaces dataTable single selection validation

I can validate a p:selectOneMenu like this:

<p:selectOneMenu id="eventTimezoneDropdown"
        value="#{myBean.eventTimeZone}"
        required="true"
        requiredMessage="The TimeZone must be specified."
        effect="none">
    <f:selectItems value="#{myBean.timeZoneItems}"/>
</p:selectOneMenu>

Conceptually speaking, using a p:dataTable with single row selection will achieve the same goal - it allows you to select one row using a selection attribute instead of value attribute and using value attribute instead of <f:selectItems>.

<p:dataTable id="ActivitiesTable" var="row"
        value="#{myBean.rows}"
        selection="#{myBean.selectedRow}"
        rowKey="#{row.activityId}">
    <p:column selectionMode="single"/>
    ...
</p:dataTable>

However I don't see any validation options (e.g. a required attribute) on the p:dataTable.

Is there a way or workaround to have a required selection validation on a p:dataTable similar to the required attribute on p:selectOneMenu?

Environment: Primefaces 5.3, JSF 2.2.8-14, Tomcat 7.0.68.

Upvotes: 1

Views: 2338

Answers (2)

Jaims
Jaims

Reputation: 1575

Another way to work around this issue is by using a hidden input field, bound to the same value which gets updated on row select.

<p:dataTable id="ActivitiesTable" var="row"
    value="#{myBean.rows}"
    selection="#{myBean.selectedRow}"
    rowKey="#{row.activityId}">
<p:ajax event="rowSelectRadio" update="@parent:hiddenTimezoneInput"
<p:column selectionMode="single"/>
...
</p:dataTable>

<h:inputHidden id="hiddenTimezoneInput" value="#{myBean.selectedRow}"
               required="true" requiredMessage="The TimeZone must be specified."/>

This way, you can add regular validators on the inputHidden (such as required) and have it processed on form submit.

Upvotes: 1

Youcef LAIDANI
Youcef LAIDANI

Reputation: 60046

what i know in primefaces there are not this functionality in datatable, but you can play with your code,

i suggest that you can do the same event in your ManagedBean, so you can check if a row is selected or not, if yes then ok else you can create a simple message, that notifie the user that the selection of a row is required like that:

public void requiredSelect() {
    if (myObject == null) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Error", "My object is required!"));
    }
}

Upvotes: 1

Related Questions