2013-04-19 1 views
0

Je voudrais faire une telle table avec l'édition comme ici ->http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=dataTable&sample=dataTableEdit&skin=blueSky. Le problème est que, quand je fais des changements dans editPane (popupPanel) ils ne sont pas rappelés dans le privé OsobaTelefon edytujOsobe. Cela rend la mise à jour impossible via JPA. J'ai tous les getters et setters et la classe OsobaTelefon implémente Serializable.RichFaces 4 dataTable édition problème

@ManagedBean(name = "administrator") 
@ViewScoped 
@SessionScoped 
public class Administrator implements Serializable 
@EJB 
private UzytkownikFacade uzytkownikFacade; 

private static final long serialVersionUID = 1L; 
@EJB 
private OsobaFacade osobaFacade; 

private Osoba osobaAdmina; 
private int numerStrony = 1; 
private Uzytkownik uzytkownik; 
private List<Osoba> listaOsob; 
private static final int CLIENT_ROWS_IN_AJAX_MODE = 10; 
private int clientRows; 
private int wybranaOsoba; 
private OsobaTelefon edytujOsobe; //it doesn't remember the changes made in editPane 
private List<OsobaTelefon> osobyITelefony; 


/** 
* Creates a new instance of Administrator 
*/ 
public Administrator() { 

} 


public void aktualizacjaWybranejOsoby() { 

    this.osobyITelefony.set(this.wybranaOsoba, this.edytujOsobe); 

    Osoba nowaOsoba = new Osoba(); 
    List<Telefon> nowaListaTelefonow = new ArrayList<Telefon>(); 

    OsobaTelefon osobaTelefon = this.osobyITelefony.get(this.wybranaOsoba); 
    int o = this.osobyITelefony.get(this.wybranaOsoba).getIdosoby(); 
    int of = this.osobyITelefony.get(this.wybranaOsoba).getIdtelefonu(); 

    System.out.println("Wybrana osoba ID " + o); 
    System.out.println("Wybrane ID fona " + of); 

    boolean znalezionoOsobe = false; 
    Iterator<Osoba> iteOs = this.listaOsob.iterator(); 
    while (!znalezionoOsobe && iteOs.hasNext()) { 
     Osoba os = iteOs.next(); 
     if (os.getIdosoba() == o) { 
      znalezionoOsobe = true; 

      nowaOsoba.setIdosoba(os.getIdosoba()); 
      nowaOsoba.setImie(osobaTelefon.getImie()); 
      nowaOsoba.setNazwisko(osobaTelefon.getNazwisko()); 
      nowaOsoba.setKodpocztowy(osobaTelefon.getKodpocztowy()); 
      nowaOsoba.setMiejscowosc(osobaTelefon.getMiejscowosc()); 
      nowaOsoba.setUlica(osobaTelefon.getUlica()); 
      nowaOsoba.setUzytkownikList(os.getUzytkownikList()); 

      Telefon nowyTelefon = new Telefon(); 
      for (Telefon tel : os.getTelefonList()) { 

       if (tel.getIdtelefon() == of) { 
        nowyTelefon.setFkIdosoba(nowaOsoba); 
        nowyTelefon.setIdtelefon(of); 
        nowyTelefon.setNumer(this.edytujOsobe.getNumer()); 
        System.out.println("Nr tel. "+tel.getNumer()); 
        nowyTelefon.setOpis(this.edytujOsobe.getOpis()); 
        nowyTelefon.setZastrzezony(this.edytujOsobe.getZastrzezony()); 
        nowaListaTelefonow.add(nowyTelefon); 
       } else { 
        nowaListaTelefonow.add(tel); 
       } 
      } 

      nowaOsoba.setTelefonList(nowaListaTelefonow); 
      this.osobaFacade.aktualizujOsoba(nowaOsoba); 
      this.pobierzOsobyDoTabeli(); 

     } 

    } 


} 

public List<Osoba> pobierzOsobyDoTabeli() { 
    //getting people with phone to List<OsobaTelefon> works good 
} 

public void switchAjaxLoading(ValueChangeEvent event) { 
    this.clientRows = (Boolean) event.getNewValue() ? CLIENT_ROWS_IN_AJAX_MODE : 0; 
} 

public void zapelnijListeTelefonow() { 
    //getting people phone number to List<Phone> works good 
} 

public void usunOsobe() { 
//deleting people works good 
} 

} 

Le XHTML

<a4j:status onstart="#{rich:component('statPane')}.show()" onstop="#{rich:component('statPane')}.hide()" /> 
    <h:form id="formProjekty"> 
     <rich:dataTable value="#{administrator.osobyITelefony}" 
         var="pr" 
         iterationStatusVar="ite" 
         id="table" 
         rows="8" > 

      <rich:column width="auto"> 
       <f:facet name="header">Imię</f:facet> 
       <h:outputText value="#{pr.imie}" /> 
      </rich:column> 

      <rich:column> 
       <a4j:commandLink styleClass="no-decor" 
           render="editGrid" 
           execute="@this" 
           oncomplete="#{rich:component('editPane')}.show()"> 
        <h:graphicImage library="img" name="edit.gif" alt="Edycja"/> 
        <a4j:param value="#{ite.index}" 
           assignTo="#{administrator.wybranaOsoba}" /> 
        <f:setPropertyActionListener target="#{administrator.edytujOsobe}" 
               value="#{pr}" /> 
       </a4j:commandLink> 
       <a4j:commandLink styleClass="no-decor" 
           execute="@this" 
           render="@none" 
           oncomplete="#{rich:component('confirmPane')}.show()"> 
        <h:graphicImage library="img" name="delete.gif" alt="Usuń"/> 
        <a4j:param value="#{ite.index}" 
           assignTo="#{administrator.wybranaOsoba}" /> 
        <f:setPropertyActionListener target="#{administrator.edytujOsobe}" 
               value="#{pr}" /> 
       </a4j:commandLink> 
      </rich:column> 

      <f:facet name="footer"> 
       <rich:dataScroller page="#{administrator.numerStrony}" /> 
      </f:facet> 
     </rich:dataTable> 

     <a4j:jsFunction name="remove" 
         action="#{administrator.usunOsobe()}" 
         render="table" 
         execute="@this" 
         oncomplete="#{rich:component('confirmPane')}.hide();" /> 

     <a4j:jsFunction name="edycja" 
         action="#{administrator.aktualizacjaWybranejOsoby()}" 
         render="table" 
         execute="@this" 
         oncomplete="#{rich:component('editPane')}.hide();" /> 


     <rich:popupPanel id="statPane" autosized="true"> 
      <h:graphicImage library="img" name="ai.gif" alt="Czekaj"/> 
      Proszę czekać... 
     </rich:popupPanel> 

     <rich:popupPanel id="confirmPane" autosized="true"> 
      Czy na pewno usunać? 
      <a4j:commandButton value="Tak" onclick="remove(); 
        return false;" /> 
      <a4j:commandButton value="Nie" 
           onclick="#{rich:component('confirmPane')}.hide(); 
        return false;" /> 
     </rich:popupPanel> 

     <rich:popupPanel header="Edycja Osoby" 
         id="editPane" 
         domElementAttachment="parent" width="180" height="420"> 

        <h:panelGrid columns="1" id="editGrid"> 
         <h:panelGroup > 
          <h:outputText value="Imię" /><br /> 
          <h:inputText value="#{administrator.edytujOsobe.imie}" > 
           <f:validateLength maximum="32" minimum="3"/> 
          </h:inputText> 
         </h:panelGroup> 

        </h:panelGrid><br/> 
        <a4j:commandButton value="Aktualizuj" 
             onclick="edycja(); return false;"/> 
        <a4j:commandButton value="Anuluj" 
             onclick="#{rich:component('editPane')}.hide(); 
        return false;" /> 

     </rich:popupPanel> 
    </h:form> 

Répondre

0

si vous pouvez changer alors faire votre Aktualizuj a4j-lien un peu plus facile. Juste essayer:

<a4j:commandButton value="Aktualizuj" 
        onclick="#{rich:component('editPane')}.hide();" 
        action="#{administrator.aktualizacjaWybranejOsoby()}" render="table"/> 

et mettre a4j: région de votre inputText et votre lien pour envoyer uniquement les valeurs requises:

<rich:popupPanel header="Edycja Osoby" 
        id="editPane" 
        domElementAttachment="parent" width="180" height="420"> 
      <a4j:region> 
       <h:panelGrid columns="1" id="editGrid"> 
        <h:panelGroup > 
         <h:outputText value="Imię" /><br /> 
         <h:inputText value="#{administrator.edytujOsobe.imie}" > 
          <f:validateLength maximum="32" minimum="3"/> 
         </h:inputText> 
        </h:panelGroup> 

       </h:panelGrid><br/> 
       <a4j:commandButtonvalue="Aktualizuj" onclick="# {rich:component('editPane')}.hide();"action="#{administrator.aktualizacjaWybranejOsoby()}" render="table"/> 
       <a4j:commandButton value="Anuluj" 
            onclick="#{rich:component('editPane')}.hide(); 
       return false;" /> 
       </a4j:region> 
    </rich:popupPanel> 

ajouter également un rendu = "table" à l'Aktualizuj a4j: lien pour mettre à jour la valeur dans le datatable