DataTable with RowExpansion Editable not from Update - PrimeFaces

1

I have a DataTable that expands the line to an editable%, in the expansion it is possible to add items, by the "+ Item" button, everything is working correctly, but I can not update the table, added an item, it is already available for editing within DataTable .

The way the user has to click the amount of times he wants in "+ Item", save, reload and then the items appear to be edited.

Another problem I have is that one of the columns in the expansion is a RowExpansion , and it is not visible, just when I click on the cell to edit does it appear. p>

Bean

@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ProcessamentoBean implements Serializable{

    private OrdemDeServico selectedODS;
    private Item item;
    private List<Produto> produtos;
    private List<OrdemDeServico> listaODS;
    private List<Item> listaItens;


    public OrdemDeServico getSelectedODS() {
        return selectedODS;
    }
    public void setSelectedODS(OrdemDeServico selectedODS) {
        this.selectedODS = selectedODS;
    }
    public Item getItem() {
        return item;
    }
    public void setItem(Item item) {
        this.item = item;
    }
    public List<Produto> getProdutos() {
        return produtos;
    }
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
    public List<OrdemDeServico> getListaODS() {
        return listaODS;
    }
    public void setListaODS(List<OrdemDeServico> listaODS) {
        this.listaODS = listaODS;
    }
    public List<Item> getListaItens() {
        return listaItens;
    }
    public void setListaItens(List<Item> listaItens) {
        this.listaItens = listaItens;
    }

    @PostConstruct
    public void listar(){
        try {
            OrdemDeServicoDAO odsDAO = new OrdemDeServicoDAO();
            listaODS = odsDAO.buscarProcessamneto();

        }catch (RuntimeException erro){
            Messages.addGlobalError("Ocorreu um erro ao listar as Ordens de Serviço");
            erro.printStackTrace();
        }
    }

    public void onRowToggle(ToggleEvent event) {

        selectedODS = (OrdemDeServico) event.getData();
        listaItens = new ArrayList<Item>();

        ItemDAO itemDAO = new ItemDAO();
        listaItens = itemDAO.buscarPorODS(selectedODS.getCodigo());        

        ProdutoDAO produtoDAO = new ProdutoDAO();
        produtos = produtoDAO.buscarPorODS(selectedODS.getCliente());              
    }

    public void maisItem() {
        try{
            item = new Item();
            item.setOdsID(selectedODS);
            item.setItemNum(listaItens.size()+1);
            item.setMultiplicador(1);
            item.setProdutoID(produtos.get(0));
            if (item.getProdutoID().getImpresso()){
                item.setImpresso('N');
            } else{
                item.setImpresso('-');              
            }
            if (item.getProdutoID().getEnvelopado()){
                item.setEnvelopado('N');
            } else{
                item.setEnvelopado('-');                
            }
            if (item.getProdutoID().getGrampeado()){
                item.setGrampeado('N');;
            } else{
                item.setGrampeado('-');             
            }       

            listaItens.add(item);           
        }catch (RuntimeException erro){
            Messages.addGlobalError("Selecione uma ordem de serviço.");
            erro.printStackTrace();
        }           
    }   

    public void menosItem() {
        try{    
            listaItens.remove(listaItens.lastIndexOf(item));            
        }catch (RuntimeException erro){
            Messages.addGlobalError("Não há itens para serem removidos.");
            erro.printStackTrace();
        }
    }       

    public void itemSalvar() {
        try{
            ItemDAO itemDAO = new ItemDAO();

            for (Item i:listaItens){
                itemDAO.merge(i);               
            }

            listaItens = new ArrayList<Item>();

            Messages.addGlobalInfo("Itens salvos com sucesso!");
        }catch (RuntimeException erro){
            Messages.addGlobalError("Ocorreu um erro ao salvar os itens.");
            erro.printStackTrace();
        }
    }   
}

xHtml

<ui:define name="conteudo">
    <h:form id="formODS">
        <p:growl id="msgs" showDetail="true" />
        <p:dataTable id="tabela" emptyMessage="Não há nada para ser processado."
            value="#{processamentoBean.listaODS}" var="ods" 
            rowKey="#{ods.codigo}" rowExpandMode="single" widgetVar="processamento">

            <p:ajax event="rowToggle" listener="#{processamentoBean.onRowToggle}" update="formODS:tabela"/>

            <f:facet name="header">
                <p:commandButton value="+ Item" actionListener="#{processamentoBean.maisItem()}"
                    update=":mensagem formODS:tabela:expanded"/>

                <p:commandButton value="- Item" actionListener="#{processamentoBean.menosItem}"
                    update=":mensagem :formODS:tabela">
                </p:commandButton>

                <p:commandButton value="Salvar" actionListener="#{processamentoBean.itemSalvar}"
                update=":mensagem :formODS:tabela">
                </p:commandButton>
            </f:facet>

            <p:column width="2">
                <p:rowToggler/>
            </p:column>

            <p:column headerText="OS Nº" width="10" style="text-align:center">
                <h:outputText value="#{ods.codigo}" />
            </p:column>

            <p:column headerText="Entrada" width="15" style="text-align:center">
                <h:outputText value="#{ods.dataEntradaFormatada}" />
            </p:column>

            <p:column headerText="Cliente" width="30" style="text-align:center">
                <h:outputText value="#{ods.cliente.nomeInterno}" />
            </p:column>

            <p:column headerText="Produto" width="20" style="text-align:center">
                <h:outputText value="#{ods.produto}" />
            </p:column>

            <p:column headerText="Quantidade" width="20" style="text-align:center">
                <h:outputText value="#{ods.quantidadeFormatada}" />
            </p:column>

            <p:column headerText="Multiplicador" width="20" style="text-align:center">
                <h:outputText value="" />
            </p:column>             

            <p:column headerText="Observações" width="100">
                <h:outputText value="#{ods.observacao}" />
            </p:column>

            <p:rowExpansion>
                <p:dataTable id="expanded" emptyMessage="Clique em + Item para adicionar itens" editable="true" editMode="cell" 
                    value="#{processamentoBean.listaItens}" var="item" styleClass="processamentoExpanded" >

                    <p:column width="30" style="text-align:center">
                        <h:outputText value="#{item.itemFormatado}" />
                    </p:column>

                    <p:column headerText="Produto" width="20" style="text-align:center">
                       <p:cellEditor>
                           <f:facet name="output">
                                <h:outputText value="#{processamentoBean.item.produtoID.nomeProduto}"
                                converter="omnifaces.SelectItemsConverter" />
                           </f:facet>
                           <f:facet name="input">   
                                <h:selectOneMenu value="#{processamentoBean.item.produtoID.nomeProduto}" 
                                converter="omnifaces.SelectItemsConverter">
                                   <f:selectItems value="#{processamentoBean.produtos}" var="produto" 
                                   itemLabel="#{produto.nomeProduto}" itemValue="#{produto}" />
                               </h:selectOneMenu>
                           </f:facet>
                       </p:cellEditor>              
                    </p:column>

                    <p:column width="20" style="text-align:center">
                        <p:cellEditor>
                            <f:facet name="output"> <h:outputText value="#{item.quantidade}" /> </f:facet>
                            <f:facet name="input"> <p:inputText value="#{item.quantidade}" style="width:30%" /> </f:facet>
                        </p:cellEditor>
                    </p:column>

                    <p:column width="20" style="text-align:center">
                        <p:cellEditor>
                            <f:facet name="output"> <h:outputText value="#{item.multiplicador}" /> </f:facet>
                            <f:facet name="input"> <p:inputText value="#{item.multiplicador}" style="width:30%" /> </f:facet>
                        </p:cellEditor>
                    </p:column>
                </p:dataTable>              
            </p:rowExpansion>
        </p:dataTable>
    </h:form>

    <script type="text/javascript">
            $(document).ready(function() {
            rowExpansion(PF('processamento'));
         });

         function rowExpansion(dataTable) {
               var $this = dataTable;
               $this.tbody.children('tr').css('cursor', 'pointer')
               $this.tbody.off('dblclick.datatable-expansion', '> tr')
                  .on('dblclick.datatable-expansion', '> tr', null, function() {
                     $this.collapseAllRows();
                     $this.toggleExpansion($(this).find('div.ui-row-toggler'));
                   });
        }
    </script>   

</ui:define>

Can anyone help me?

    
asked by anonymous 26.09.2016 / 14:31

1 answer

1

Problems solved. I will leave the solution in case anyone has the same doubt.

To update the dataTable inside a rowExpansion inside another dataTable I did the following: Buttons:

    <f:facet name="header"> 
        <p:commandButton value="+ Item" actionListener="#{processamentoBean.maisItem}" oncomplete="rc()"/>
        <p:commandButton value="- Item" actionListener="#{processamentoBean.menosItem}" oncomplete="rc()"/>
        <p:commandButton value="Salvar" actionListener="#{processamentoBean.itemSalvar}" update="formODS"/>     
    </f:facet>

And within the rowExpansion I put the following:

<p:remoteCommand name="rc" update="expanded"/>

As for the problem of selectOneMenu the code that worked this way:

<p:column width="20" style="text-align:center">
    <h:selectOneMenu id="produtoMenu" value="#{item.produtoID}" converter="omnifaces.SelectItemsConverter">
        <f:selectItems value="#{processamentoBean.produtos}" var="produto" itemLabel="#{produto.nomeProduto}" itemValue="#{produto}" />
    </h:selectOneMenu>      
</p:column>
    
20.10.2016 / 15:19