2016-07-21 14 views
0

Ich habe eine PrimeFaces-Datentabelle erstellt, die gefiltert werden kann (siehe unten). Es funktioniert gut, aber jetzt habe ich versucht, die Möglichkeit zu erstellen, nach Start- und Enddatum zu filtern, Daten über den Kalender auszuwählen (es sollte Daten zwischen diesen beiden Daten finden; Startdatum/Enddatum beachten und Filterdatum oben) . Ich brauche es, um nach Start- und Enddatum zu filtern, so wie es nach allem anderen gefiltert wird.Filter p: dataTable nach Datumsbereich mit Seitennummerierung

Es wird über eine benutzerdefinierte Methode aufgerufen, aber es gibt nicht die richtigen Werte zurück, und am wichtigsten, wenn ich eine andere Seite auf dem Paginator auswählt, wird standardmäßig auf die ungefilterte Liste zurückgesetzt. Das ist so etwas wie eine Katastrophe. Ich möchte Hilfe, damit der Benutzer nach Start-/Enddatum als Teil des gesamten Filtersystems filtern kann. Momentan sind Start-/Enddatumsfelder Teil der Kopfzeile.

Ich dachte vielleicht, wenn die Filter Datumsfelder ändern die Liste (Bean-Eigenschaft) verwendet, um die Daten für die Tabelle (TableFiltered) zu ziehen, wird dies sicherstellen, dass die gezogenen Daten immer auf die richtigen Daten, die gefiltert worden sind. Aber so hat es nicht funktioniert. Ich verstehe nicht.

enter image description here

Innen home.xhtml

<p:outputPanel id="tableContainer"> 
<p:remoteCommand name="filterByDate" action="#{homeController.FilterByDate()}" update="tableContainer" /> 
<p:dataTable var="hbel" id="hbelList" value="#{homeController.tableFiltered}" rows="10" 
    paginator="true" 
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="10,100,1000" 
    widgetVar="widgetTable" 
    tableStyle="width:auto"> 

<f:facet name="header"> 
    <p:outputPanel> 
    <p:calendar id="calStartDate" value="#{homeController.startDate}" maxdate="#{homeController.endDate}" navigator="true" pattern="dd-MMM-yy" placeholder=" start date"> 
     <p:ajax process="calStartDate" partialSubmit="true" event="change"/> 
    </p:calendar> 

    <p:calendar id="calEndDate" value="#{homeController.endDate}" maxdate="#{homeController.endDate}" navigator="true" pattern="dd-MMM-yy" placeholder=" end date"> 
     <p:ajax process="calEndDate" partialSubmit="true" event="change"/> 
    </p:calendar> 

    <p:commandButton id="btnFilter" value="Filter Dates" ajax="true"> 
     <p:ajax oncomplete="filterByDate()" /> 
    </p:commandButton> 

    </p:outputPanel> 
</f:facet> 

    <p:column filterStyle="width: 48px;" filterBy="#{hbel.batchId}" headerText="BatchID" filterMatchMode="exact"> 
     <h:outputText value="#{hbel.batchId}" /> 
    </p:column> 

    <p:column filterStyle="width: 48px;" filterBy="#{hbel.recordId}" headerText="RecordID" filterMatchMode="exact"> 
     <h:outputText value="#{hbel.recordId}" /> 
    </p:column> 

    <p:column filterBy="#{hbel.unitName}" headerText="UnitName" filterMatchMode="in"> 
     <f:facet name="filter"> 
      <p:selectCheckboxMenu label="Unit" onchange="PF('widgetTable').filter()" panelStyle="width:125px" scrollHeight="150"> 
       <f:selectItem itemLabel="Location" itemValue="LOCATION"/> 
       <f:selectItem itemLabel="Unit" itemValue="UNIT" /> 
       <f:selectItem itemLabel="Customer" itemValue="DIRECT_CUSTOMER" /> 
       <f:selectItem itemLabel="Occupancy" itemValue="OCCUPANCY" /> 
       <f:selectItem itemLabel="Bank Account" itemValue="BANK_ACCOUNT" /> 
      </p:selectCheckboxMenu> 
     </f:facet> 
     <h:outputText value="#{hbel.unitName}" /> 
    </p:column> 

    <p:column filterBy="#{hbel.logDate}" headerText="LogDate" filterMatchMode="exact"> 
     <h:outputText value="#{hbel.logDate}" /> 
    </p:column> 

    <p:column filterBy="#{hbel.logFlag}" headerText="LogFlag" filterMatchMode="in"> 
     <f:facet name="filter"> 
      <p:selectCheckboxMenu label="Flag" onchange="PF('widgetTable').filter()" panelStyle="width:125px" scrollHeight="150"> 
       <f:selectItem itemLabel="Business" itemValue="B"/> 
       <f:selectItem itemLabel="Reconciliation" itemValue="R" /> 
       <f:selectItem itemLabel="Technical" itemValue="T" /> 
       <f:selectItem itemLabel="Warning" itemValue="W" /> 
      </p:selectCheckboxMenu> 
     </f:facet> 
     <h:outputText value="#{hbel.logFlag}" /> 
    </p:column> 

    <p:column filterBy="#{hbel.logFields}" headerText="LogFields" filterMatchMode="contains"> 
     <h:outputText value="#{hbel.logFields}" /> 
    </p:column> 

    <p:column filterBy="#{hbel.logReason}" headerText="LogReason" filterMatchMode="contains"> 
     <h:outputText value="#{hbel.logReason}" /> 
    </p:column> 

</p:dataTable> 
</p:outputPanel> 

Innen homeController.java Bohne (Anfrage scoped)

// custom filtering 
    public void FilterByDate() 
    { 
     if (startDate != null && 
      endDate != null) 
     { 
      // new dates (add start and end date to range) 
      Calendar c = Calendar.getInstance(); 
      c.setTime(startDate); 
      c.add(Calendar.DATE, -1); 
      Date startDateMod = c.getTime(); 
      c.setTime(endDate); 
      c.add(Calendar.DATE, 1); 
      Date endDateMod = c.getTime(); 

      // reset table first 
      tableFiltered.clear(); 
      // add legal items from tableFull 
      for (HubToBauExceptionLog hbel : tableFull) 
      { 
       if (hbel != null && 
        hbel.getLogDate().after(startDateMod) && 
        hbel.getLogDate().before(endDateMod)) 
       { 
        tableFiltered.add(hbel); 
       } 
      } 
     } 
} 

Antwort

1

Von Primefaces docs:

Filterung

Ajax-basierte Filterung wird aktiviert, indem filterBy auf Spaltenebene gesetzt wird und eine Liste zur Verfügung gestellt wird, um die gefilterte Teilliste zu behalten. Es ist vorgeschlagen, einen Bereich länger als Anforderung wie Viewscope zu verwenden, um den gefilterten Wert zu behalten, so dass die gefilterte Liste nach Filterung noch zugänglich ist.

<p:dataTable var="car" value="#{carBean.cars}" 
      filteredValue="#{carBean.filteredCars}"> 
    <p:column filterBy="#{car.model}" headerText="Model"> 
     <h:outputText value="#{car.model}" /> 
    </p:column> 
    ...more columns 
</p:dataTable> 

So versuchen, Ihre Datatable eine Liste für die filteredValue, halten Sie den Wert als tablefull und in FilterByDate Methode bevölkern die gefilterte Liste hinzuzufügen.

<p:dataTable var="hbel" id="hbelList" 
    value="#{homeController.tableFull}" rows="10" 
    filteredValue="#{homeController.tableFiltered}" 
    paginator="true" 
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="10,100,1000" 
    widgetVar="widgetTable" 
    tableStyle="width:auto"> 
+0

Vielen Dank! Ich habe den dataTable-Parametern "filteredValue" hinzugefügt und außerdem den Bereich von homeController in die Anwendung geändert. Jetzt funktioniert es! – inappropriateCode