Primefaces Save/Pass Filtered DataTable Results List

孤者浪人 提交于 2019-12-12 08:49:56

问题


Currently, I'm displaying image metadata successfully from my database using a datatable with sorting/filtering capabilities. Below my datatable I'm successfully displaying my images using a third party image coverflow (http://www.jacksasylum.eu/ContentFlow/). I'm using the same list to display both at this point. After I filter my data within my datatable I need to dynamically update my image list in my coverflow with the filtered datatable results.

What is the best way to do this using PrimeFaces? Would anyone be able to point me toward a working example?

Here is my code:

screenshotData.xhtml

<h:form>
        <p:dataTable var="scrshot" value="#{screenshots}" paginator="true" rows="8" 
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
                 rowsPerPageTemplate="5,10,15" widgetVar="dataTable" draggableColumns="true"
                 emptyMessage="No screenshot data found with given criteria"> 
          <f:facet name="header"> 
            <p:outputPanel> 
                <h:outputText value="Search all fields:"/> 
                <p:inputText id="globalFilter" onkeyup="dataTable.filter()" style="width:150px" /> 
            </p:outputPanel> 
          </f:facet>
          <p:column headerText="Time" sortBy="#{scrshot.time}" filterBy="#{scrshot.time}" filterMatchMode="startsWith"> 
            <h:outputText value="#{scrshot.time}" /> 
          </p:column> 
          <p:column headerText="Id" sortBy="#{scrshot.id}" filterBy="#{scrshot.id}" filterMatchMode="startsWith"> 
            <h:outputText value="#{scrshot.id}" /> 
          </p:column> 
          <p:column headerText="User" sortBy="#{scrshot.user}" filterBy="#{scrshot.user}" filterMatchMode="startsWith"> 
            <h:outputText value="#{scrshot.user}" /> 
          </p:column>
          </p:dataTable>   
        </h:form>     
        <br/>
        <h:form>
          <p:outputPanel id="imgBlock" layout="block">
           <div class="ContentFlow"  style="width: 1400px; height: 500px" align="center">
            <div class="loadIndicator"><div class="indicator"></div></div>
            <div class="flow">
              <a4j:repeat var="img" value="#{screenshots}" rendered="true">
                 <div class="item">       
                     <img class="content" id="images" src="ImgServlet?id=#{img.id}" title="#{img.time}" draggable="true"/>
                     <div class="label">#{img.id}</div>
                  </div>
              </a4j:repeat>
             </div>         
           <div class="globalCaption"></div>
           <div class="scrollbar"><div class="slider"><div class="position"></div></div></div>
          </div>
         </p:outputPanel> 
       </h:form>   
...............

Screenshot.java

@Entity
@XmlRootElement
@Table(name="imgTable", uniqueConstraints = @UniqueConstraint(columnNames = "id"))
public class Screenshot implements Serializable, PhotoInterface {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
   private Long id;
   private String user;
   private Timestamp time;
-------- Getters/Setters ---------

ScreenshotListProducer.java

@RequestScoped
public class ScreenshotListProducer {
   @Inject
   private EntityManager em;

   private List<Screenshot> screenshots;

   @Produces
   @Named
   public List<Screenshot> getScreenshots() {
      return screenshots;
   }

回答1:


I found this an interesting question so I did some research. First I had a laugh finding this. Then I stumbled upon this. The answer appears to be:

Add this to the <p:datatable>:

<p:ajax event="filter" listener="#{bean.onFilter}" update = "@this"/>

In the bean:

public Map<String, String> onFilter(AjaxBehaviorEvent event) {
       DataTable table = (DataTable) event.getSource();
       List<Screenshot> obj =   table.getFilteredData();

       // Do your stuff here

       Map<String, String>  filters = table.getFilters();
       return filters;
   }



回答2:


Thanks for the all comments in this and an other questions.

I will share the solution whith PrimeFaces 5.1:

public Map<String, Object> onFilter(AjaxBehaviorEvent event) {
        System.out.println("FILTRAMOS LA TABLA");
        DataTable table = (DataTable) event.getSource();
        List<Actual> obj = table.getFilteredValue();

        listaActivosFijosFiltrados = obj;

        if (obj != null) {
            System.out.println("filtered = " + obj.size());
        } else {
            System.out.println("No records found");
        }

        Map<String, Object> filters = table.getFilters();
        return filters;
    }


来源:https://stackoverflow.com/questions/11515518/primefaces-save-pass-filtered-datatable-results-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!