3 Replies Latest reply on Oct 18, 2013 4:51 PM by achittela

    Custom Filtering with Selectonemenu

    achittela

      I am trying to filter the data table based on the values selected in the selectbox. I have around 10000 records in datatable, to make rendering faster I am using SerializableDataModel and i implemented logic in walk() method and Modify() method.

      I am able to filter the data table with the text box values but, i am not able to use the select box filter in this scenario. How can i get column name of the select box and the selected value and it to the filterMap in the modify method ?

      I tried filter expression but, it's not working in this scenario.

       

       

      Walk() method:

       

          @Override
          public void walk(FacesContext context, DataVisitor visitor, Range range,
                           Object argument) throws IOException {
              // This is method we have to populate a data for DataTable
              // Range parameter provides the firstRow value and no. of rows value
              this.firstRow = ((SequenceRange) range).getFirstRow();
              this.numberOfRows = ((SequenceRange) range).getRows();
      
              List<CustomerList> cList = getCustomerList(this.firstRow,
                      this.numberOfRows.intValue(), this.sortField, this.ascending);
              System.out.println("customerList in walk method:" + cList.size());
              this.totalRows = new Integer(displayCustomerListOne.size());
              System.out.println("displayCustomerListOne.size" + this.totalRows);
      
      
              wrappedKeys = new ArrayList<Integer>();
              if (!cList.isEmpty()) {
                  for (CustomerList item : cList) {
                      System.out.println("item.getAvIdPk()" + item.getAvIdPk());
                      wrappedKeys.add(item.getAvIdPk());
                      wrappedData.put(item.getAvIdPk(), item);
                      // Once data populated to wrappedKeys and wrappedData call the
                      // process method using visitor parameter
                      visitor.process(context, item.getAvIdPk(), argument);
                  }
              }
          }
      

       

      Modify() method:

       

          @Override
          public void modify(List<FilterField> filterFields,
                             List<SortField2> sortFields) {
              filterMap.clear();
              String expressionStr = null;
              ExtendedFilterField extendedFilterField = null;
              String value = null;
              Expression filterExpression = null;
              if (null != sortFields && !sortFields.isEmpty()) {
                  SortField2 sortField2 = sortFields.get(0);
                  Expression sortExpression = sortField2.getExpression();
      
      
                  String expressionString = sortExpression.getExpressionString();
                  if (!sortExpression.isLiteralText()) {
                      expressionString = expressionString.replaceAll(
                              "[#|$]{1}\\{.*?\\.", "").replaceAll("\\}", "");
                  }
                  this.sortField = expressionString;
                  if (sortField2.getOrdering() == Ordering.ASCENDING) {
                      this.ascending = true;
                  } else if (sortField2.getOrdering() == Ordering.DESCENDING) {
                      this.ascending = false;
                  }
              }
      
              if (filterFields != null && !filterFields.isEmpty()) {
                  for (FilterField filterField : filterFields) {
                      if (filterField instanceof ExtendedFilterField) {
                          extendedFilterField = (ExtendedFilterField) filterField;
                          value = extendedFilterField.getFilterValue();
                          if (value != null && !value.equals("")) {
                              filterExpression = extendedFilterField.getExpression();
                              System.out.println("filterExpression "+filterExpression);
                              expressionStr = filterExpression.getExpressionString();
                              if (!filterExpression.isLiteralText()) {
                                  expressionStr = expressionStr.replaceAll(
                                          "[#|$]{1}\\{.*?\\.", "").replaceAll("\\}",
                                          "");
                              }
                              filterMap.put(expressionStr, value);
                          }
                      }
                  }
              }
          }
      

       

       

      Below is my JSP code:

       

      <rich:dataTable value="#{item}" var="dataTableItem"
        rowClasses="oddRow,evenRow"
        footerClass="thclass" id="data"
        onRowClick="dataTable.onRowSubmit(this);" first="#{item.rowIndex}"
        rows="20" reRender="pg" sortMode="single">
      
        <rich:column sortable="false" id="col_1">
        <f:facet name="header">
        <h:panelGroup>
        <h:outputText />
        <br />
        <h:outputText />
        </h:panelGroup>
        </f:facet>
        <h:commandButton style="display: none;"
        action="#{item.customerDetail}">
        <f:param name="selectedAvId" value="#{dataTableItem.avId}" />
        </h:commandButton>
        <h:graphicImage value="images/icoEdit15.gif" style="border:none"
        alt="Edit"></h:graphicImage>
        </rich:column>
      
        <rich:column sortable="true" headerClass="standardTable_Header"
        sortBy="#{dataTableItem.changeTypeStatus}" id="col_2">
        <f:facet name="header">
        <h:panelGroup>
        <h:outputText value="#{msgs.changeTypeStatus} " id="cl2" /><br>                      
        <h:selectOneMenu value="#{item.filterChangeType}">
        <f:selectItem itemValue=""/>
        <f:selectItem itemValue="Enroll"/>
        <f:selectItem itemValue="De-Enroll"/>
        <f:selectItem itemValue="Management Company"/>
        <f:selectItem itemValue="Parent Company"/>
        <f:selectItem itemValue="Name"/>
        <f:selectItem itemValue="Owner"/>
        <f:selectItem itemValue="Brand"/>
        <f:selectItem itemValue="Comment"/>
        <f:selectItem itemValue="Address"/>
        <f:selectItem itemValue="Marketing Rights"/>
        <a4j:support event="onchange" reRender="data , pg" requestDelay="500" ajaxSingle="true"
        ignoreDupResponses="true"/>
        </h:selectOneMenu>
        </h:panelGroup>
        </f:facet>
        <h:outputText id="cl_2" value="#{dataTableItem.changeTypeStatus}" />
        </rich:column>
      
        <rich:column sortable="true"
        filterBy="#{dataTableItem.brandMandated}" filterEvent="onkeyup"
        filterValue="#{item.filterValue4}"
        sortBy="#{dataTableItem.brandMandated}" id="col_4">
        <f:facet name="header">
        <h:outputText value="#{msgs.brandmandated}" id="cl4" />
        </f:facet>
        <h:outputText style="white-space:nowrap;"
        value="#{dataTableItem.brandMandated}" id="cl_4" />
        </rich:column>
      
      <rich:column sortable="true" sortBy="#{dataTableItem.city}"
        filterBy="#{dataTableItem.city}" filterEvent="onkeyup"
        filterValue="#{item.filterValue11}" id="col_11">
        <f:facet name="header">
        <h:outputText value="#{msgs.city}" id="cl11" />
        </f:facet>
        <h:outputText value="#{dataTableItem.city}" id="cl_11" />
        </rich:column>
      
        <rich:column sortable="true" sortBy="#{dataTableItem.state}"
        filterBy="#{dataTableItem.state}" filterEvent="onkeyup"
        filterValue="#{item.filterValue12}" id="col_12">
        <f:facet name="header">
        <h:outputText value="#{msgs.state}" id="cl12" />
        </f:facet>
        <h:outputText value="#{dataTableItem.state}" id="cl_12" />
        </rich:column>
      
        <rich:datascroller id="pg" renderIfSinglePage="false" maxPages="5" for="data" />
      </rich:dataTable>
      
        • 1. Re: Custom Filtering with Selectonemenu
          bleathem

          The showcase filtering sample uses a selectOneMenu, have you tried comparing your impl to that?

          http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=dataTable&sample=tableFiltering

          • 2. Re: Custom Filtering with Selectonemenu
            achittela

            I tried it but it didn't worked. All other filters are working fine, only the one with select box is not working.

            Some how the filterMap doesn't contain the select box value.

             

            I am using richfaces 3.3.4

             

            <rich:column filterValue="#{item.filterChangeType}" id="col_2"

                             filterExpression="#{fn:containsIgnoreCase(dataTableItem.changeTypeStatus, item.filterChangeType)}">

                             <f:facet name="header">

                                 <h:panelGroup>

                                     <h:outputText value="ChangeTypeStatus " />

                                     <h:selectOneMenu value="#{item.filterChangeType}">

                                         <f:selectItems value="#{item.filterCts}" />

                                         <a4j:support event="onchange" reRender="data , pg" ajaxSingle="true"

              ignoreDupResponses="true" requestDelay="700"/>                           

                                     </h:selectOneMenu>                       

                                 </h:panelGroup>

                             </f:facet>

                             <h:outputText id="cl_2" value="#{dataTableItem.changeTypeStatus}" />

                         </rich:column>

            • 3. Re: Custom Filtering with Selectonemenu
              achittela

              I got it working. As i am using SerializableDataModel, i wrote the select box filtering logic in walk method and it's working fine.