3
respostas

Atualizar datatable após exclusão com p:confirmDialog

Olá, tenho um .xhtml que possui um p:dataTable um dialog que servem para incluir e atualizar os dados de minha p:dataTable e um confirmdialog que seria para remover seus registros.

Com os dialog de incluir/alterar, tudo funciona direitinho, o problema está quando eu vou excluir. Acontece que o p:confirmDialog realmente chama o método do meu bean, porém não atualiza os dados do p:datatable.

Comparando os dois dialogs, não consigo ver a diferença que causa tal comportamente diferente.

Seguem trechos do código:

Datatable(que contem os commandButtom que chamam os dialogs de alterar e exluir):

<h:form id="form">
            <p:dataTable value="#{usuarioBean.usuarios}" var="usuario"
                paginator="true" rows="10"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="5,10,15" id="usuarioTable"
                emptyMessage="Registro não encontrado">

                <p:column headerText="Nome"
                    sortBy="#{usuario.pessoaFisica.noPessoa}"
                    filterBy="#{usuario.pessoaFisica.noPessoa}"
                    filterMatchMode="contains">
                    <h:outputText value="#{usuario.pessoaFisica.noPessoa}" />
                </p:column>
                <p:column headerText="Matricula"
                    sortBy="#{usuario.pessoaFisica.nrMatricula}"
                    filterBy="#{usuario.pessoaFisica.nrMatricula}">
                    <h:outputText value="#{usuario.pessoaFisica.nrMatricula}" />
                </p:column>
                <p:column headerText="Email"
                    sortBy="#{usuario.pessoaFisica.dsEmail}"
                    filterBy="#{usuario.pessoaFisica.dsEmail}">
                    <h:outputText value="#{usuario.pessoaFisica.dsEmail}" />
                </p:column>
                <p:column headerText="Cargo" sortBy="#{usuario.noCargo}"
                    filterBy="#{usuario.noCargo}" filterMatchMode="contains">
                    <h:outputText value="#{usuario.noCargo}" />
                </p:column>
                <p:column headerText="Orgão" sortBy="#{usuario.orgao.noOrgao}"
                    filterBy="#{usuario.orgao.noOrgao}" filterMatchMode="contains">
                    <h:outputText value="#{usuario.orgao.noOrgao}" />
                </p:column>
                <p:column style="width:52px;text-align: center">
                    <p:commandButton update="formDetalheUsuario:detalheUsuario"
                        oncomplete="PF('usuarioDialog').show()" icon="fa fa-search-plus"
                        title="Visualisar">
                        <f:setPropertyActionListener value="#{usuario}"
                            target="#{usuarioBean.usuario}" />
                    </p:commandButton>
                </p:column>

                <p:column style="width:52px;text-align: center">
                    <p:commandButton update="formManterUsuario:manterUsuario"
                        oncomplete="PF('manterDialog').show()" icon="fa fa-edit"
                        title="Editar">
                        <f:setPropertyActionListener value="#{usuario}"
                            target="#{usuarioBean.usuario}" />
                    </p:commandButton>
                </p:column>
                <p:column style="width:52px;text-align: center">
                    <p:commandButton
                        update="formVisualizarPerfisUsuario:visualizarPerfil"
                        action="#{usuarioBean.perfisAssociados}"
                        oncomplete="PF('perfisDialog').show()" icon="fa fa-tag"
                        title="Editar Perfis Vinculados">
                        <f:setPropertyActionListener value="#{usuario}"
                            target="#{usuarioBean.usuario}" />
                    </p:commandButton>
                </p:column>
                <p:column style="width:52px;text-align: center">
                    <p:commandButton onclick="PF('confirmation').show()"
                        icon="fa fa-trash" title="Remover Usuario">
                        <f:setPropertyActionListener value="#{usuario}"
                            target="#{usuarioBean.usuario}" />
                    </p:commandButton>
                </p:column>
            </p:dataTable>
        </h:form>
  • Dialog que funciona e adiciona/altera o usuario e depois atualiza o datatable:
    <h:form id="formManterUsuario">
            <p:dialog header="Usuário" widgetVar="manterDialog" modal="true"
                showEffect="fade" hideEffect="fade" resizable="false">
                <p:outputPanel id="manterUsuario" style="text-align:center;">
                    <p:panelGrid columns="3"
                        rendered="#{not empty usuarioBean.usuario}"
                        columnClasses="label,value">

                        <p:outputLabel value="Nome:" for="nome" />
                        <p:inputText value="#{usuarioBean.usuario.pessoaFisica.noPessoa}"
                            id="nome" required="true"
                            requiredMessage="O campo Nome é obrigatório." />
                        <p:message for="nome" />

                        <p:outputLabel value="CPF:" for="cpf" />
                        <p:inputMask id="cpf" mask="999.999.999-99"
                            value="#{usuarioBean.usuario.pessoaFisica.nrCpf}"
                            converter="cpfCnpjConverter" required="true"
                            requiredMessage="O campo CPF é obrigatório."
                            validator="CPFValidator" />
                        <p:message for="cpf" />

                        <p:outputLabel value="Email:" for="email" />
                        <p:inputText value="#{usuarioBean.usuario.pessoaFisica.dsEmail}"
                            id="email" required="true"
                            requiredMessage="O campo Email é obrigatório."
                            validator="EmailValidator" />
                        <p:message for="email" />

                        <p:outputLabel value="Matricula:" for="matricula" />
                        <p:inputText id="matricula"
                            value="#{usuarioBean.usuario.pessoaFisica.nrMatricula}"
                            required="true"
                            requiredMessage="O campo Matricula é obrigatório." />
                        <p:message for="matricula" />

                        <p:outputLabel value="Cargo:" for="cargo" />
                        <p:inputText id="cargo" value="#{usuarioBean.usuario.noCargo}"
                            required="true" requiredMessage="O campo Cargo é obrigatório." />
                        <p:message for="cargo" />

                        <p:outputLabel value="Login" for="login" />
                        <p:inputText id="login" value="#{usuarioBean.usuario.noLogin}"
                            required="true" requiredMessage="O campo Login é obrigatório." />
                        <p:message for="login" />

                        <p:outputLabel value="Orgao" for="orgao" />
                        <p:selectOneMenu value="#{usuarioBean.usuario.orgao.idOrgao}"
                            id="orgao" required="true"
                            requiredMessage="O campo Orgao é obrigatório.">
                            <f:selectItems value="#{usuarioBean.orgaos}" var="orgao"
                                itemLabel="#{orgao.noOrgao}" itemValue="#{orgao.idOrgao}" />
                        </p:selectOneMenu>
                        <p:message for="orgao" />

                        <p:outputLabel for="isAtivo" value="Ativo:" />
                        <p:selectOneRadio id="isAtivo"
                            value="#{usuarioBean.usuario.isAtivo}">
                            <f:selectItem itemLabel="Sim" itemValue="true" />
                            <f:selectItem itemLabel="Não" itemValue="false" />
                        </p:selectOneRadio>
                        <p:message for="isAtivo" />

                        <p:outputLabel for="isAdmin" value="Administrador:" />
                        <p:selectOneRadio id="isAdmin"
                            value="#{usuarioBean.usuario.isAdmin}">
                            <f:selectItem itemLabel="Sim" itemValue="true" />
                            <f:selectItem itemLabel="Não" itemValue="false" />
                        </p:selectOneRadio>
                        <p:message for="isAdmin" />

                        <h:inputHidden value="#{usuarioBean.usuario.idUsuario}" />
                        <p:commandButton
                            value="#{usuarioBean.usuario.idUsuario != 0 ? 'Alterar' : 'Incluir'}"
                            id="alterarUsuario" action="#{usuarioBean.salvar}"
                            icon="fa fa-save" process="@form"
                            update="manterUsuario form:usuarioTable" />
                    </p:panelGrid>
                </p:outputPanel>
            </p:dialog>
        </h:form>
  • Aqui está o problema: confirmDialog que não atualiza o datatable
              <p:confirmDialog message="Deseja excluir o resgistro?"
                  showEffect="fade" hideEffect="fade" header="Excluir Usuário"
                  severity="alert" widgetVar="confirmation">
                  <h:form id="formExcluir">
                      <p:commandButton value="Sim" action="#{usuarioBean.remover}"
                          immediate="true" oncomplete="PF('confirmation').hide()"
                          process="@form" update=":form:usuarioTable" />
                      <p:commandButton value="Não" onclick="PF('confirmation').hide()"
                          type="button" />
                  </h:form>
              </p:confirmDialog>

Alguma ideia do que possa ser?

3 respostas

Oi Edmilson, olhando as xhtmls eu não vi nada de errado.. os updates apontando para os ids corretos e tudo mais. No método de remoção do bean, você atualiza o estado da lista para que isso seja refletido na segunda renderização?

Faço sim, o mais interessante é que fiz semelhante, até utilizei com "ctrl+c" e "ctrl + v" em outra página para outra entidade, e funcionou... Deve ser algum detalhe muito besta que não estou conseguindo exergar.

Quando encontrar o problema, se for algo que valha a pena eu posto aqui para compartilhar.

Obrigado.

Olá Edmilson,

Você poderia postar aqui o código completo da sua página?

Notei que no dialog do adicionar/alterar, no commandButton o update tá referenciando o elemento form:usuarioTable. Já no dialog de excluir, o update tá referenciando :form:usuarioTable.

A diferença das duas formas é que quando começamos a referência com o :, estamos referenciando o componente de forma absoluta a partir do body da página. Já quando colocamos a referência sem o : no começo, estamos referenciando o componente a partir do primeiro UINamingContainer que o for encontrado na hierarquia a partir do seu componente que faz a referência. Um UINamingContainer pode ser um form ou um dataTable, por exemplo. Isso pode estar interferindo na hora de referenciar a tabela correta.

Faça um teste e tente tirar o : na referência do commandButton da exclusão e depois conta pra gente se deu certo.