Criar uma lista dinâmica + painel de detalhes

.html ››
Parent Previous Next

Criar uma lista dinâmica + painel de detalhes


Este tutorial vai ensinar a criar uma lista dinâmica de itens que, quando você selecionar um dos itens desta lista, exibe um painel detalhando as informações sobre o item selecionado.

É recomendado você ler Criar uma lista dinâmica na ficha antes, pois este tutorial utiliza a mesma ideia.



Dois arquivos Lua Form (extensão ".LFM")

Utilizaremos a tag recordList neste tutorial, portanto, você deve possuir dois arquivos ".lfm":


Neste tutorial, chamaremos o arquivo Lua Form Principal de "MinhaFicha.lfm" e o arquivo Lua Form Template dos Itens de "ItemDaLista.lfm"


Imagens








Sobre a implementação

A ideia para criar esta lista dinâmica com painel de detalhes é bem simples. Existem dois componentes chaves nesta ideia:


Quando o usuário escolher um item no recordList (evento "onSelect" da tag recordList), fazemos com que os componentes que estão dentro do dataScopeBox passem a salvar/carregar dados neste item ao alterar o escopo de dados das tags que estão dentro. Caso tenha dúvida sobre escopo de dados, veja Escopo de Dados no Lua Form







Código Fonte


Arquivo “MinhaFicha.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmFTeste" theme="dark" padding="{left=4, top=4, right=4, bottom=4}">       

        <!-- Botão de inserir novo item à lista -->
        <layout align="top" height="30" margins="{bottom=4}">
                <button text="Criar Novo Item" width="150" align="left">
                        <event name="onClick">
                                -- Usuário clicou no botão de criar novo item.
                                -- Vamos inserir um novo item no nosso recordList                              
                                self.rclListaDosItens:append();
                        </event>
                </button>
        </layout>       

        <!-- recordList, representando a lista -->
        <recordList name="rclListaDosItens" field="campoDosItens" templateForm="frmItemDaLista"
                                align="client" selectable="true">                              

                <event name="onSelect">
                        --[[
                        Este evento é chamado quando o usuário selecionar/deselecionar itens da lista. Quando o usuário selecionar, vamos fazer nosso dataScopeBox (e todas as tag dentro dele) salvar e carregar dados no   objeto Nodo (NodeDatabase) do item selecionado.

  1.                   --]]                      
  2.                   local node = self.rclListaDosItens.selectedNode;  
                              self.boxDetalhesDoItem.node = node;                       
  3.                   -- a caixa de detalhe só ficará visível se houver item selecionado
                              self.boxDetalhesDoItem.visible = (node ~= nil);
                    </event>
            </recordList>       

        <!-- dataScopeBox representando a nossa caixa de detalhes -->  
        <dataScopeBox name="boxDetalhesDoItem" visible="false" align="right" 
                      width="400" margins="{left=4, right=4}">
                <!-- Faça um layout "bonito" para sua caixa de detalhes =). Utilize a propriedade "field" nas tags aqui dentro   -->       

                <rectangle align="top" color="black" xradius="10" yradius="10"
                                   height="180" padding="{top=3, left=3, right=3, bottom=3}">
                                   

                        <layout align="top" height="30" margins="{bottom=4}">
                                <label align="left" text="Titulo do Item:" autoSize="true"/>
                                <edit align="client" field="campoTitulo"/>
                        </layout>                       

                        <layout align="top" height="130">              
                                <image align="left" editable="true" field="campoURLImagem" width="130"/>                               

                                <layout align="client" margins="{left=2}">
                                        <edit align="top" field="campoSubTitulo" height="30"/>
                                        <textEditor align="top" field="campoTextoGrande" height="100"/>
                                </layout>                      
                        </layout>
                </rectangle>
        </dataScopeBox>
</form>




Arquivo “ItemDaLista.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmItemDaLista" height="50" theme="dark"> 

        <layout align="client" margins="{left=4, right=4, top=4, bottom=4}">
                <!-- Botão para apagar o item da lista -->
                <button align="left" width="32" text="X" onClick="ndb.deleteNode(sheet);"/>               

                <!-- O título do item que aparece na lista -->
                <label align="client" text="Teste de label" field="campoTitulo" margins="{left=4}"/>
        </layout>
</form>



Lista Dinâmica + Painel de Detalhes alternativo



Código Fonte Alternativo


Arquivo “MinhaFicha.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmFTeste" theme="dark" padding="{left=4, top=4, right=4, bottom=4}">
        <!-- Botão de inserir novo item à lista -->

        <layout align="top" height="30" margins="{bottom=4}">
                <button text="Criar Novo Item" width="150" align="left">
                        <event name="onClick">
                                -- Usuário clicou no botão de criar novo item.
                                -- Vamos inserir um novo item no nosso recordList                              
                                self.rclListaDosItens:append();
                        </event>
                </button>
        </layout>       

        <!-- recordList, representando a lista -->
        <recordList name="rclListaDosItens" field="campoDosItens" templateForm="frmItemDaLista" align="top" selectable="true" layout="horizontal" height="40">                       

                <event name="onSelect">
                        --[[
                        Este evento é chamado quando o usuário selecionar/deselecionar itens da lista. Quando o usuário selecionar, vamos fazer nosso dataScopeBox (e todas as tag dentro dele) salvar e carregar dados no   objeto Nodo (NodeDatabase) do item selecionado.

  1.                   --]]                      
  2.                   local node = self.rclListaDosItens.selectedNode;  
                              self.boxDetalhesDoItem.node = node;                       
  3.                   -- a caixa de detalhe só ficará visível se houver item selecionado
                              self.boxDetalhesDoItem.visible = (node ~= nil);

                </event>
        </recordList>                     

        <!-- dataScopeBox representando a nossa caixa de detalhes -->  

        <dataScopeBox name="boxDetalhesDoItem" visible="false" align="client"
                      margins="{left=4, right=4, top=2}">
                <!-- Faça um layout "bonito" para sua caixa de detalhes =). Utilize a propriedade "field" nas tags aqui dentro   -->      

                <rectangle align="client" color="black" xradius="10" yradius="10"
                           padding="{top=3, left=3, right=3, bottom=3}">                                   

                         <layout align="top" height="30" margins="{bottom=4}">
                                <label align="left" text="Titulo do Item:" autoSize="true"/>
                                <edit align="client" field="campoTitulo"/>
                                                               

                               <!-- Botão de apagar o item -->
                               <button align="right" text="Apagar!" 
                                       margins="{left=4, right=4, top=2, bottom=2}" width="150"
                                       onClick="ndb.deleteNode(self.boxDetalhesDoItem.node);" />

                        </layout>                       

                        <layout align="top" height="130">              
                                <image align="left" editable="true" field="campoURLImagem" width="130"/>                               

                                <layout align="client" margins="{left=2}">
                                        <edit align="top" field="campoSubTitulo" height="30"/>
                                        <textEditor align="top" field="campoTextoGrande" height="100"/>
                                </layout>                      
                        </layout>
                </rectangle>
        </dataScopeBox>
</form>




Arquivo “ItemDaLista.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmItemDaLista" height="50" width="100">
        <!-- O título do item que aparece na lista -->

        <label align="client" text="Teste de label" field="campoTitulo" 
               margins="{left=4, right=4, top=4, bottom=4}"/>       

        <!-- Adicionar um valor padrão para o campoTitulo caso esteja vazio.
                Isto é especialmente útil em novos itens -->
        <dataLink field="campoTitulo" defaultValue="Titulo Aqui"/>
</form>



Incrementando o código: Selecionar o primeiro item ao carregar os dados


Trate o evento "onEndEnumeration" da tag recordList com o seguinte código:


<event name="onEndEnumeration">
        if self.rclListaDosItens.selectedNode == nil and sheet ~= nil then
                local nodes = ndb.getChildNodes(sheet.campoDosItens);               

                if #nodes > 0 then
                        self.rclListaDosItens.selectedNode = nodes[1];
                end;
        end;
</event>




Veja Tratando eventos do Lua Form.

Created with the Personal Edition of HelpNDoc: Powerful and User-Friendly Help Authoring Tool for Markdown Documents