Datatable page two deletes List

Asked

Viewed 21 times

1

I’m using Primefaces 6.2 with Hibernate 4.3 without JPA or Spring. I need to show data on the screen, where I have a Dialog and inside it a Datatable with a button that will open another Dialog. I actually have two problems, but I’ll focus on the first one. When clicking to open the first Dialog, it opens, but when clicking on page 2 it "deletes" the data from the list. If you close and open the dialog again, it opens on page 2 with everything loaded correctly. The second problem is the button in the first dialog. commandButton does not run actionListener resulting in a second dialog displaying null data. Below is Bean and XHTML. If anyone can help me, I’d really appreciate it!

Java bean.

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;

import com.sysnutriweb.dao.AlimentoXDietaDAO;
import com.sysnutriweb.dao.DietaDAO;
import com.sysnutriweb.domain.Alimento;
import com.sysnutriweb.domain.AlimentoXDieta;
import com.sysnutriweb.domain.Dieta;

@ManagedBean(name = "MBDiet")
@SessionScoped
public class DietaBean implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<Dieta> listDiets;
    private Dieta diet = new Dieta();
    private DietaDAO dDao;
    private List<AlimentoXDieta> foods = new ArrayList<>();
    private Alimento food = new Alimento();

@PostConstruct
public void begin() {
    dDao = new DietaDAO();
    listDiets = dDao.loadAll();
    System.out.println("Chamou o begin aqui! Comidas: " + foods.size());
}

public void getDietSelected(ActionEvent e) {
    diet = (Dieta) e.getComponent().getAttributes().get("selectedDiet");
    List<AlimentoXDieta> axd = new AlimentoXDietaDAO().loadAll();
    for (int i = 0; i < axd.size(); i++) {
        if (axd.get(i).getDietId().getId() == diet.getId())
            foods.add(axd.get(i));
    }
    System.out.println("Chamou o getSelected aqui! Comidas: " + foods.size());
}

public void getFoodSelected(ActionEvent e) {
    food = (Alimento) e.getComponent().getAttributes().get("selectedFood");
    System.out.println("Called getFoodSelected: " + food.toStringSys());
}

Index.xhtml

<p:layoutUnit position="center">
        <h:form id="formTable">
            <p:dataTable emptyMessage="Nenhum dado cadastrado!"
                paginator="false" id="tbAllDiets" value="#{MBDiet.listDiets}"
                var="diet">
                <p:column headerText="Nome" id="nome">
                    <p:outputLabel value="#{diet.nomeDieta}" />
                </p:column>

                <p:column headerText="Descrição da dieta" id="descricao">
                    <p:outputLabel value="#{diet.descricaoDieta}" />
                </p:column>

                <p:column headerText="Ações" id="acoes" width="10%">
                    <center>
                        <p:commandButton immediate="false" icon="ui-icon-info"
                            id="btnInfo" update=":formInfoTable"
                            actionListener="#{MBDiet.getDietSelected}"
                            oncomplete="PF('dlgFoods').show()">
                            <f:attribute name="selectedDiet" value="#{diet}" />
                        </p:commandButton>
                        <p:tooltip id="toolTipBtnInfo" for="btnInfo"
                            value="Clique para ver os alimentos presentes nesta dieta"
                            position="top" />
                    </center>
                </p:column>
            </p:dataTable>
        </h:form>
    </p:layoutUnit>

</p:layout>

<!--  Dialogs -->
<!--  Diet info -->
<p:dialog header="Alimentos da dieta selecionada" widgetVar="dlgFoods"
    closable="true" modal="true" showEffect="explode" id="dialogFoods"
    resizable="false" draggable="false" appendTo="@(body)">
    <h:form id="formInfoTable">
        <center>
            <p:outputLabel id="diet" value="Dieta #{MBDiet.diet.nomeDieta}"
                style="font-weight: bold;" />
        </center>
        <p:dataTable emptyMessage="Nenhum dado cadastrado!" paginator="true"
            id="tbFoodsDiet" value="#{MBDiet.foods}" var="food" rows="5"
            paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15">
            <p:column headerText="Nome" id="nome" width="10px">
                <p:outputLabel value="#{food.foodId.nome}" />
            </p:column>

            <p:column headerText="Hora para consumir" id="descricao" width="40%">
                <p:outputLabel value="#{food.hora}" />
            </p:column>

            <p:column headerText="Ações" id="acoes" width="10%">
                <center>
                    <p:commandButton immediate="false" icon="ui-icon-info"
                        id="btnInfo" update=":formInfo"
                        actionListener="#{MBDiet.getFoodSelected}"
                        oncomplete="PF('dlgFoodInfo').show()">
                        <f:attribute name="selectedFood" value="#{food}" />
                    </p:commandButton>
                    <p:tooltip id="toolTipBtnInfo" for="btnInfo"
                        value="Clique para ver os alimentos presentes nesta dieta"
                        position="top" />
                </center>
            </p:column>
        </p:dataTable>
    </h:form>
</p:dialog>

If you want and have time, the code is on Github. https://github.com/SakamotoLfe/SysNutriWebV0

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.