Search code examples
jsf-2primefacesdatatableradio-buttonrequired

PrimeFaces DataTable with required Radiobutton


I am using PrimeFaces DataTable with Radiobuttons inside a one wizard tab. Is possible to somehow set Radiobuttons like required?

User shouldn't go to the next wizard tab until he will choose one option in DataTable with Radiobuttons.

Or have you any ideas how to resolve this problem? Thanks for any replies!

JSP page

<p:tab id="test" title="Test">
    <p:panel header="Term page">
        <p:dataTable id="collection" value="#{register.dataList}" var="dl" rowKey="#{dl.c_id}" selection="#{register.selectedTerm}"">
            <p:column selectionMode="single" style="width:2%" />
            <p:column>
                #{dl.c_id}
            </p:column>
        </p:dataTable>
    </p:panel>
</p:tab>

Solution

  • You can check for data selection in flowListener of <p:wizard> tag that is triggered when next/previous buttons are clicked and conditionally add FacesMessage:

    public String onFlowProcess(FlowEvent event) {
        String current = event.getOldStep();
        String next = event.getNewStep();
        boolean proceed = true;
        if(current.equals("first") && next.equals("second") && (selectedData == null)) {
            //proceed only when data was selected and user is moving to the next step
            FacesMessage facesMessage = new FacesMessage("You need to make a selection in a datatable to proceed!");
            FacesContext.getCurrentInstance().addMessage("form:selection", facesMessage);
            proceed = false;
        }
        return proceed ? next : current;
    }
    

    The full example is provided below.

    The view:

    <h:form id="form">
        <p:wizard widgetVar="wiz" flowListener="#{q16439053Bean.onFlowProcess}">
            <p:tab id="first" title="First">
                <p:message for="selection"/>
                <p:panel id="selection" header="Term page">
                    <p:dataTable id="collection" value="#{q16439053Bean.list}" var="data" rowKey="#{data.name}" selection="#{q16439053Bean.selectedData}">
                        <p:column selectionMode="single" style="width:2%" />
                        <p:column>
                            #{data.name}
                        </p:column>
                    </p:dataTable>
                </p:panel>
            </p:tab>
            <p:tab id="second" title="Second">
                Done!
            </p:tab>
        </p:wizard>
    </h:form>
    

    The bean:

    @ManagedBean
    @ViewScoped
    public class Q16439053Bean implements Serializable {
    
        private List<Data> list;
        private Data selectedData;
    
        public List<Data> getList() {
            return list;
        }
    
        public void setList(List<Data> list) {
            this.list = list;
        }
    
        public Data getSelectedData() {
            return selectedData;
        }
    
        public void setSelectedData(Data selectedData) {
            this.selectedData = selectedData;
        }
    
        public class Data {
    
            private String name;
            private String value;
    
            public Data() {
            }
    
            public Data(String name, String value) {
                this.name = name;
                this.value = value;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public String getValue() {
                return value;
            }
    
            public void setValue(String value) {
                this.value = value;
            }
    
        }
    
        public Q16439053Bean() {
            list = new ArrayList<Data>();
            Data d;
            d = new Data("name", "value");
            list.add(d);
            d = new Data("name1", "value1");
            list.add(d);
            d = new Data("name2", "value2");
            list.add(d);
            d = new Data("name3", "value3");
            list.add(d);
        }
    
        public String onFlowProcess(FlowEvent event) {
            String current = event.getOldStep();
            String next = event.getNewStep();
            boolean proceed = true;
            if(current.equals("first") && next.equals("second") && (selectedData == null)) {
                FacesMessage facesMessage = new FacesMessage("You need to make a selection in a datatable to proceed!");
                FacesContext.getCurrentInstance().addMessage("form:selection", facesMessage);
                proceed = false;
            }
            return proceed ? next : current;
        }
    
    }