Criar uma lista dinâmica + painel de detalhes¶
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":
- O arquivo Lua Form principal que contém a tag recordList
- O arquivo Lua Form Template dos Itens do Record List: Este form vai ser instanciado 1 vez para cada item na lista.
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:
- Você precisa de um recordList que funcionará como uma lista onde o usuário possa escolher o item.
- Você precisará de um dataScopeBox que conterá as tags que são apresentadas no painel de detalhes.
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. --]] local node = self.rclListaDosItens.selectedNode; self.boxDetalhesDoItem.node = node; -- 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. --]] local node = self.rclListaDosItens.selectedNode; self.boxDetalhesDoItem.node = node; -- 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