0 Replies Latest reply on Nov 17, 2009 6:20 PM by garcimouche

    Seam Query Component - pagination mystery

    garcimouche

      (New to SEAM and RichFaces)
      I'd like to have a search capability on my main form to help the user filling out a specific inputText field.
      I decided to implement it with a rich:modalpanel, with the help of some javascript to bring back the desired value to my initial inputtext on the main page.
      Inside my modal panel I have a search field and a search result grid (rich:datatable) backed by a SEAM Query Component. I'd like the grid to be paginated.
      The problem I face is that the Next-Page, Last-Page links work well, but the previous-page, first-page doesn't do anything. I try to debug, but it seems that the firstResult variable get never updated when I click previous-page/first-page....The scope of my Query component is the default one (EVENT).
      In the Ajax Debug window I can see that the 'firstResult' parameter is passed in the request...
      Any pointers would be appreciated.



              <rich:modalPanel id="searchCarrier">
                  <f:facet name="header">
                  <h:outputText value="Search Carrier"/>
                 </f:facet>
                  <a:form>
                       <rich:panel>
                               <a:region>
                                    <h:inputText id="partyName" value="#{pickCarrier.carrierName}" />
                                    <a:commandButton reRender="searchResultPanel" value="Search" action="#{pickCarrier.searchCarrier}"/>
                               </a:region>
                       </rich:panel>
                
                          <rich:panel id="searchResultPanel">
                               <f:facet name="header">Carrier Search Results (#{empty pickCarrier.resultList ? 0 : (pickCarrier.paginated ? pickCarrier.resultCount : pickCarrier.resultList.size)})</f:facet>
                               <h:outputText value="The carrier search returned no results."
                                    rendered="#{empty pickCarrier.resultList}" />
                
                               <rich:dataTable id="partyListGrid" var="_party"
                                    value="#{pickCarrier.resultList}"
                                    rendered="#{not empty pickCarrier.resultList}">
                                    <h:column>
                                         <f:facet name="header">#{title}</f:facet>
                                    <a href="#"
                                         onclick="var carrierCode = document.getElementById('entry:carrierField:carrierCode');var carrierId = document.getElementById('entry:carrierId');carrierCode.value='#{_party.carrierCode}';carrierId.value='#{_party.id}';carrierCode.focus();Richfaces.hideModalPanel('searchCarrier');">
                                    <h:outputText value="#{_party.name}" /> </a>
                               </h:column>
                                    <h:column>
                                         <f:facet name="header">#{code}</f:facet>
                                         <h:outputText id="toto" value="#{_party.carrierCode}" />
                                    </h:column>
                               </rich:dataTable>
                          </rich:panel>
      
                         <div class="tableControl">
                              <a:outputPanel ajaxRendered="true">
                                  <a:commandLink rendered="#{pickCarrier.previousExists}"
                                         value="#{messages.left}#{messages.left} First Page"
                                            id="firstPage" reRender="searchResultPanel" action="#{pickCarrier.searchCarrier}">
                                            <a:actionparam name="firstResult" value="0" assignTo="#{pickCarrier.firstResult}"/> 
                                  </a:commandLink>
                                  <a:commandLink rendered="#{pickCarrier.previousExists}"
                                         value="#{messages.left} Previous Page"
                                            id="previousPage" reRender="searchResultPanel" action="#{pickCarrier.searchCarrier}">
                                            <a:actionparam name="firstResult" value="#{pickCarrier.previousFirstResult}" assignTo="#{pickCarrier.firstResult}"/> 
                                  </a:commandLink>
                                  <a:commandLink rendered="#{pickCarrier.nextExists}"
                                         value="Next Page #{messages.right}"
                                            id="nextPage" reRender="searchResultPanel" action="#{pickCarrier.searchCarrier}">
                                            <a:actionparam name="firstResult" value="#{pickCarrier.nextFirstResult}" assignTo="#{pickCarrier.firstResult}"/> 
                                  </a:commandLink>
                                  <a:commandLink rendered="#{pickCarrier.nextExists}"
                                         value="Last Page #{messages.right}#{messages.right}"
                                            id="lastPage" reRender="searchResultPanel" action="#{pickCarrier.searchCarrier}">
                                            <a:actionparam name="firstResult" value="#{pickCarrier.lastFirstResult}" assignTo="#{pickCarrier.firstResult}"/> 
                                  </a:commandLink>
                              </a:outputPanel>
                         </div>                                   
                     </a:form>
                </rich:modalPanel>





      My Seam Component:


      @Name("pickCarrier")
      public class PickCarrierAction extends EntityQuery<Party> {
      
           private static final long     serialVersionUID     = 1L;
      
           private static final String          EJBQL                    = 
                
                "select party from Party party join party.partyRolesForCurrent party_role where party_role.partyTypeByCurrentRole.code = 'CA'";
      
           private static final String RESTRICTION_CARRIER_CODE = "party.carrierCode=#{pickCarrier.carrierCode}";
           private static final String RESTRICTION_CARRIER_NAME = "lower(party.name) like lower(concat(#{pickCarrier.carrierName},'%'))";
           
           
           @In
           private FacesMessages facesMessages;
           
           @In
           private EntryHome entryHome;
      
           private String carrierCode;
           
           private String carrierName;
      
           public PickCarrierAction() {
                setEjbql(EJBQL);
                setMaxResults(1);
           }
      
           
           public void searchCarrier(){
                setRestrictionExpressionStrings(Arrays.asList(RESTRICTION_CARRIER_NAME));
           }
           
           public void verifyCarrierCodeExists(String widgetId) {
                try
                {
                     if(StringUtils.isEmpty(carrierCode)){
                        facesMessages.addToControl(widgetId, Severity.ERROR, "carrier code is mandatory");
                        return;
                     }
      
                     setRestrictionExpressionStrings(Arrays.asList(RESTRICTION_CARRIER_CODE));
                     
                     Party carrier = this.getSingleResult();
                    if(entryHome!=null && entryHome.getInstance()!=null)
                    {
                         entryHome.getInstance().setPartyByCarrier(carrier);
                    }
                }
                catch(NoResultException nre){
                   facesMessages.addToControl(widgetId, Severity.ERROR, "carrier code does not exist");
                }
           }
      
      
           public void setCarrierCode(String carrierCode)
           {
                this.carrierCode = carrierCode;
           }
      
      
           public String getCarrierCode()
           {
                return carrierCode;
           }
      
      
           public void setCarrierName(String carrierName)
           {
                this.carrierName = carrierName;
           }
      
      
           public String getCarrierName()
           {
                return carrierName;
           }
           
           
      }