1
votes

I have a primefaces datatable with a <p:commandLink> in each row. The user clicks it to see a different page with details about the record he selected. It was working fine until I add a filteredValue in my datatable. I need this attribute (filteredValue) in order to correctly filter and sort my datatable, as shown in this question.

But after adding this attribute, my commandLink stops working. How can I make it work with the attribute?

Here's my datatable:

<p:dataTable var="prot" value="#{myBean.listaProtocolos}" rows="15" filteredValue="#{myBean.listaProtocolosFiltrados}" sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}" sortOrder="descending" paginator="true" style="font-size: 0.9em;" paginatorPosition="bottom">
  <p:column filterBy="${prot.nrProtocolo}" filterMatchMode="contains" width="8%" style="text-align:center">
    <f:facet name="header">ID</f:facet>
    <p:commandLink action="#{myBean.verDetalhesProtocolo}" process="@this messages" update="@this messages">
      <h:outputText value="#{prot.nrProtocolo}" style="text-decoration: underline;"/>
      <f:setPropertyActionListener target="#{myBean.nrProtocolo}" value="#{prot.nrProtocolo}" />
    </p:commandLink>
  </p:column>
(etc)

and the relevant pieces of myBean:

public void verDetalhesProtocolo() {
    for(ProtocoloMY pro : this.listaProtocolos){
        if(pro.getNrProtocolo().trim().equalsIgnoreCase(this.nrProtocolo.trim())) {
            this.protocolo = new ProtocoloMY(pro);
            break;
        }
    }
    FacesContext facesContext = FacesContext.getCurrentInstance();
    facesContext.getExternalContext().redirect("detalhes_protocolo_processo.xhtml");
    //(This method isn't even called when I add the attribute filteredValue to my datatable)

public String getNrProtocolo() {
    return nrProtocolo;
}

public void setNrProtocolo(String nrProtocolo) {
    this.nrProtocolo = nrProtocolo;
}
    public List<ProtocoloMY> getListaProtocolos() {
    return listaProtocolos;
}

public List<ProtocoloMY> getListaProtocolosFiltrados() {
    return listaProtocolosFiltrados;
}

public void setListaProtocolosFiltrados(List<ProtocoloMY> listaProtocolosFiltrados) {
    this.listaProtocolosFiltrados = listaProtocolosFiltrados;
}

public void setListaProtocolos(List<ProtocoloMY> listaProtocolos) {
    this.listaProtocolos = listaProtocolos;
}

And I almost forgot to say: There's some network traffic happening when I click the link, but nothing is shown in my backend console and the method in my bean isn't called. browser's console indicating some data travelled to the backend

I'm running primefaces v6.0.

1
What PrimeFaces version do you use? Did you try to use commandButton or ajax rowSelect event instead command link? primefaces.org/showcase/ui/data/datatable/selection.xhtmlMihawk
Hi, I'm using version 6.0. I tried commandbutton with same results. Didn't try rowSelect yetBruno Lamps

1 Answers

2
votes

For PrimeFaces to be able to track which row by its unique id you need to add the attribute rowKey="#{row.id}" to your p:datatable using whatever value in your row POJO that makes it unique.