1 Reply Latest reply on Jul 18, 2014 9:10 AM by Juan Ignacio Sánchez Lara

    Pass list as page parameter

    Matthew Hibberd Newbie

      I have started an application from seam-gen and I am wanting to add to the default search functionality.


      The search criteria for the email, id etc fields works fine, as does the pagination. However I am stuck trying to add the search capability on the keyword field. The problem being that the value is not binding to the keywords list in the restrictionLogEvent. This is because I don't know how to pass this param like the others using a param definition in the page xml like the other fields.


      Is this even possible?
      If not, can anyone suggest a better way of implementing the search?


      Thanks!



      List page:



      <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
          xmlns:s="http://jboss.com/products/seam/taglib"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:rich="http://richfaces.org/rich"
          xmlns:a4j="http://richfaces.org/a4j"
          template="/layout/template.xhtml">
      
      <ui:define name="body">
          <h:form id="logEventSearch" styleClass="edit">
              <rich:simpleTogglePanel label="LogEvent Search Filter" switchType="ajax">
                   <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Id</ui:define>
                      <h:inputText id="id" value="#{logEventList.restrictionLogEvent.id}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Email</ui:define>
                      <h:inputText id="email" value="#{logEventList.restrictionLogEvent.email}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">User Comments</ui:define>
                      <h:inputText id="emailbody" value="#{logEventList.restrictionLogEvent.emailbody}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Log Type</ui:define>
                      <h:inputText id="logtype" value="#{logEventList.restrictionLogEvent.logtype}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Title</ui:define>
                      <h:inputText id="title" value="#{logEventList.restrictionLogEvent.title}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Version</ui:define>
                      <h:inputText id="version" value="#{logEventList.restrictionLogEvent.version}"/>
                  </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Keywords</ui:define>
                          <rich:pickList value="#{logEventList.restrictionLogEvent.keywords}">
                               <s:selectItems value="#{keywordList.resultList}" var="keyword" label="#{keyword.name}" />
                               <s:convertEntity />
                          </rich:pickList>
                     </s:decorate>
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Match</ui:define>
                      <h:selectOneRadio id="logic" value="#{logEventList.restrictionLogicOperator}" styleClass="radio">
                          <f:selectItem itemLabel="All" itemValue="and"/>
                          <f:selectItem itemLabel="Any" itemValue="or"/>
                      </h:selectOneRadio>
                  </s:decorate>
                  
              </rich:simpleTogglePanel>
              <div class="actionButtons">
                  <h:commandButton id="search" value="Search" action="/secure/LogEventList.xhtml"/>
                  <s:button id="reset" value="Reset" includePageParams="false"/>
              </div>
          </h:form>
          
          <a4j:region>
                <h:form>
                     <a4j:poll id="poll" interval="20000" reRender="logEventList" enabled="#{pollStatus.pollEnabled}" />
              </h:form>
          </a4j:region>
      
           <h:form>
               <rich:panel id="logEventListPanel">
                   <f:facet name="header">LogEvent Search Results (#{empty logEventList.resultList ? 0 : (logEventList.paginated ? logEventList.resultCount : logEventList.resultList.size)})</f:facet>
                    <div class="results" id="logEventList">
           
                         <a4j:commandButton style="width:120px" id="control" value="#{pollStatus.pollEnabled?'Stop':'Start'} Auto Refresh" reRender="poll, logEventListPanel">
                               <a4j:actionparam name="polling" value="#{!pollStatus.pollEnabled}" assignTo="#{pollStatus.pollEnabled}" />
                          </a4j:commandButton>
                          
                         <rich:dataTable id="logEventList" var="logEvent" value="#{logEventList.resultList}" rendered="#{not empty logEventList.resultList}">
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Id"/>
                                         <ui:param name="propertyPath" value="logEvent.id"/>
                                     </ui:include>
                                 </f:facet>
                                 <s:link view="/secure/logEventEdit.xhtml" value="#{logEvent.id}">
                                      <f:param name="logEventId" value="#{logEvent.id}" />
                                 </s:link>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Version"/>
                                         <ui:param name="propertyPath" value="logEvent.version"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.version}"/>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Created"/>
                                         <ui:param name="propertyPath" value="logEvent.created"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.created}">
                                     <s:convertDateTime type="both" dateStyle="short"/>
                                 </h:outputText>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Email"/>
                                         <ui:param name="propertyPath" value="logEvent.email"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.email}"/>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="User Comments"/>
                                         <ui:param name="propertyPath" value="logEvent.emailbody"/>
                                     </ui:include>
                                 </f:facet>
                                 <s:formattedText value="#{logEvent.emailbody}"/>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Key Id"/>
                                         <ui:param name="propertyPath" value="logEvent.keyId"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.keyId}"/>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Log Type"/>
                                         <ui:param name="propertyPath" value="logEvent.logtype"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.logtype}"/>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Message"/>
                                         <ui:param name="propertyPath" value="logEvent.message"/>
                                     </ui:include>
                                 </f:facet>
                                 <a4j:htmlCommandLink value="#{logEvent.message}" action="#{logDownloader.download}">
                                      <f:param name="logEventId" value="#{logEvent.id}" />
                                 </a4j:htmlCommandLink>
                             </h:column>
                             
                             <h:column>
                                 <f:facet name="header">
                                     <ui:include src="/layout/sort.xhtml">
                                         <ui:param name="entityList" value="#{logEventList}"/>
                                         <ui:param name="propertyLabel" value="Title"/>
                                         <ui:param name="propertyPath" value="logEvent.title"/>
                                     </ui:include>
                                 </f:facet>
                                 <h:outputText value="#{logEvent.title}" />
                             </h:column>
                             
                             <rich:column styleClass="action">
                                 <f:facet name="header">Keywords</f:facet>
                                 <a4j:repeat var="keyword" value="#{logEvent.keywords}" rowKeyVar="count">
                                      <h:outputText value=", " rendered="#{count > 0}" />
                                      <h:outputText value="#{keyword.name}" title="#{keyword.description}" />
                                 </a4j:repeat>
                             </rich:column>
                             
                             <rich:column styleClass="action">
                                 <f:facet name="header">Opportunities</f:facet>
                                 <a4j:repeat var="opportunity" value="#{logEvent.opportunities}">
                                      <h:outputText value="#{opportunity.name}" title="#{opportunity.description}" />
                                 </a4j:repeat>
                             </rich:column>
                         </rich:dataTable>
                    </div>
               </rich:panel>
          </h:form>
      
          <div class="tableControl">
              <s:link view="/secure/LogEventList.xhtml"
                  rendered="#{logEventList.previousExists}"
                     value="#{messages.left}#{messages.left} First Page"
                        id="firstPage">
                <f:param name="firstResult" value="0"/>
              </s:link>
              <s:link view="/secure/LogEventList.xhtml"
                  rendered="#{logEventList.previousExists}"
                     value="#{messages.left} Previous Page"
                        id="previousPage">
                  <f:param name="firstResult"
                          value="#{logEventList.previousFirstResult}"/>
              </s:link>
              <s:link view="/secure/LogEventList.xhtml"
                  rendered="#{logEventList.nextExists}"
                     value="Next Page #{messages.right}"
                        id="nextPage">
                  <f:param name="firstResult"
                          value="#{logEventList.nextFirstResult}"/>
              </s:link>
              <s:link view="/secure/LogEventList.xhtml"
                  rendered="#{logEventList.nextExists}"
                     value="Last Page #{messages.right}#{messages.right}"
                        id="lastPage">
                  <f:param name="firstResult"
                          value="#{logEventList.lastFirstResult}"/>
              </s:link>
          </div>
      </ui:define>
      </ui:composition>




      List page xml:



      <?xml version="1.0" encoding="UTF-8"?>
      <page xmlns="http://jboss.com/products/seam/pages"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd">
      
         <param name="firstResult" value="#{logEventList.firstResult}"/>
         <param name="sort" value="#{logEventList.orderColumn}"/>
         <param name="dir" value="#{logEventList.orderDirection}"/>
         <param name="logic" value="#{logEventList.restrictionLogicOperator}"/>
      
         <param name="from"/>
         <param name="id" value="#{logEventList.restrictionLogEvent.id}"/>
         <param name="build" value="#{logEventList.restrictionLogEvent.build}"/>
         <param name="email" value="#{logEventList.restrictionLogEvent.email}"/>
         <param name="emailbody" value="#{logEventList.restrictionLogEvent.emailbody}"/>
         <param name="logtype" value="#{logEventList.restrictionLogEvent.logtype}"/>
         <param name="message" value="#{logEventList.restrictionLogEvent.message}"/>
         <param name="requiresupport" value="#{logEventList.restrictionLogEvent.requiresupport}"/>
         <param name="title" value="#{logEventList.restrictionLogEvent.title}"/>
         <param name="token" value="#{logEventList.restrictionLogEvent.token}"/>
         <param name="version" value="#{logEventList.restrictionLogEvent.version}"/>
      
      </page>




      List EntityQuery:



      @Name("logEventList")
      public class LogEventList extends EntityQuery<LogEvent> {
      
           private static final long serialVersionUID = -948846997295581654L;
      
           private static final String EJBQL = "select logEvent from LogEvent logEvent left join logEvent.keywords keyword";
      
           private static final String[] RESTRICTIONS = {
                     "logEvent.id = #{logEventList.restrictionLogEvent.id}",
                     "lower(logEvent.build) like lower(concat(#{logEventList.restrictionLogEvent.build},'%'))",
                     "lower(logEvent.email) like lower(concat(#{logEventList.restrictionLogEvent.email},'%'))",
                     "lower(logEvent.emailbody) like lower(concat(#{logEventList.restrictionLogEvent.emailbody},'%'))",
                     "lower(logEvent.logtype) like lower(concat(#{logEventList.restrictionLogEvent.logtype},'%'))",
                     "lower(logEvent.message) like lower(concat(#{logEventList.restrictionLogEvent.message},'%'))",
                     "lower(logEvent.requiresupport) like lower(concat(#{logEventList.restrictionLogEvent.requiresupport},'%'))",
                     "lower(logEvent.title) like lower(concat(#{logEventList.restrictionLogEvent.title},'%'))",
                     "lower(logEvent.token) like lower(concat(#{logEventList.restrictionLogEvent.token},'%'))",
                     "lower(logEvent.version) like lower(concat(#{logEventList.restrictionLogEvent.version},'%'))",
                     "keyword.id in (#{not empty logEventList.restrictionLogEvent.keywords ? logEventList.restrictionLogEvent.keywords : null }",};
      
           private LogEvent restrictionLogEvent = new LogEvent(); // Used in above hql for query restrictions
      
           public LogEventList() {
                setEjbql(EJBQL);
                setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
                setMaxResults(25);
                setOrder("created desc");
           }
           
           public LogEvent getRestrictionLogEvent() {
                return restrictionLogEvent;
           }
      }