Criar um botão que esconde itens de uma lista dinâmica

.html ››
Parent Previous Next

Criar um botão que esconde itens de uma lista dinâmica de alguns usuários.


Atenção: Este é um tópico avançado e requer o conhecimento de como criar uma lista dinâmica.


Este tipo de funcionalidade é útil quando em uma ficha ou em uma janela acoplável é necessário esconder certos itens de certos usuários, por exemplo:



Começando....


Vamos supor que você já tenha implementado em seu código uma lista dinâmica com a seguinte aparência:



e com o seguinte código:


Arquivo Principal “ficha.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmFichaTeste">        

        <layout align="top" height="30">
                <button align="left" text="Novo" onClick="self.rclLista:append();"/>
        </layout>       

        <recordList name="rclLista" align="client" field="itens" 
                    templateForm="frmItem"/>
</form>



Arquivo Secundário “item.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmItem" height="30" margins="{top=2,bottom=2}">       

    <edit align="client" field="descricao" margins="{right=2}"/>
 

    <button align="right" text="Apagar" width="80"
           onClick="ndb.deleteNode(sheet);"/>
</form>


Próximos passos

Para adicionar a funcionalidade de esconder item, você deverá fazer as seguintes alterações em seu arquivo equivalente ao "item.lfm" (aquele que repete para cada item na lista):

<imageCheckBox name="cbxInvisivel" align="right" width="25" 
               margins="{left=2, right=2}" 
               checkedImage="images/invisivel.png"     
               uncheckedImage="images/visivel.png"
               autoChange="false"
               onClick="self:alternarVisibilidade();" />


Esta é a imagem "images/invisivel.png":
Esta é a imagem "images/visivel.png:
Note que a propriedade autoChange foi setada para false para que a tag não mude automaticamente sua propriedade "checked".

Note também que ao clicar no imageCheckBox, será invocada a função "self:alternarVisibilidade"




<script>
        function self:alternarVisibilidade()
                if self.cbxInvisivel.checked then
                        -- o imageCheckbox está marcando como invisivel..
                        -- Vamos mudar as permissões para tornar visivel então..
                    
                        -- resetar as permissões de read dos jogadores e espectadores
                        ndb.setPermission(sheet, "group", "jogadores", "read", nil);
                        ndb.setPermission(sheet, "group", "espectadores", "read", nil;
                else
                        -- o imageCheckbox está marcando como visível
                        -- Vamos mudar as permissões para tornar invisível então...
                       
                        -- negar as permissões de read dos jogadores e espectadores
                        ndb.setPermission(sheet, "group", "jogadores", "read", "deny");
                        ndb.setPermission(sheet, "group", "espectadores", "read", "deny");
                end;
        end;
</script>



<script>
        function self:atualizarCbxInvisivel()
                -- Esta função é chamada em vários pontos para atualizar o estado do checkbox de invisibilidade
              

                -- Marcar o checkbox se existir uma permissão "read deny" para jogadores ou para espectadores
                self.cbxInvisivel.checked = ndb.getPermission(sheet, "group", "espectadores", "read") == "deny" or
                                            ndb.getPermission(sheet, "group", "jogadores", "read") == "deny";                                                                       

                -- Permitir o click no checkbox apenas se o usuário atual possuir a permissão "writePermissions"
                self.cbxInvisivel.enabled = ndb.testPermission(sheet, "writePermissions");
        end;
</script>


Veja também:





<event name="onScopeNodeChanged">
        if self.observer ~= nil then
                -- Já tinhamos criado um observer, vamos desativá-lo.               

                self.observer.enabled = false;
                self.observer = nil;
        end;       

        if sheet ~= nil then
                -- O form foi ligado a um NodeDatabase!
                -- Vamos criar um NodeObserver para este nodo.               

                self.observer = ndb.newObserver(sheet);               

                self.observer.onPermissionListChanged =
                        function(node)
                                -- Esta função será chamada quando
                                -- as definições de permissões de sheet mudarem
                               
                                self:atualizarCbxInvisivel();
                        end;                       

                self.observer.onFinalPermissionsCouldBeChanged =
                        function(node)
                                -- Esta função será chamada quando
                                -- minhas permissões em sheet puderem
                                -- ter sido afetadas por alterações de permissões
                                -- no NodeDatabase ou porque me tornei 
                                -- mestre/jogador/espectador
                               

                                self:atualizarCbxInvisivel();
                        end;                      

                -- Devemos atualizar o checkbox agora também  
                self:atualizarCbxInvisivel();  
        end;
</event>




Resultado final

O que aparece para os Mestres da mesa:



O que os Jogadores e Espectadores da mesa veem:




Código fonte final (sem os comentários)

Arquivo Principal “ficha.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmFichaTeste">        

        <layout align="top" height="30">
                <button align="left" text="Novo" onClick="self.rclLista:append();"/>
        </layout>       

        <recordList name="rclLista" align="client" field="itens" 
                    templateForm="frmItem"/>
</form>



Arquivo Secundário “item.lfm”

<?xml version="1.0" encoding="UTF-8"?>
<form name="frmItem" height="30" margins="{top=2,bottom=2}">       

    <script>
         function self:alternarVisibilidade()
             if self.cbxInvisivel.checked then
                  ndb.setPermission(sheet, "group", "jogadores", "read", nil);
                  ndb.setPermission(sheet, "group", "espectadores", "read", nil);
             else
                  ndb.setPermission(sheet, "group", "jogadores", "read", "deny");
                  ndb.setPermission(sheet, "group", "espectadores", "read", "deny");
             end;
         end; 

         function self:atualizarCbxInvisivel()          
             self.cbxInvisivel.checked = ndb.getPermission(sheet, "group", "espectadores", "read") == "deny" or
                                         ndb.getPermission(sheet, "group", "jogadores", "read") == "deny"                                                                                    

              self.cbxInvisivel.enabled = ndb.testPermission(sheet, "writePermissions");
         end;
    </script> 

    <edit align="client" field="descricao" margins="{right=2}"/>       

    <imageCheckBox name="cbxInvisivel" align="right" width="25" margins="{left=2, right=2}"
                   checkedImage="images/invisivel.png" 
                   uncheckedImage="images/visivel.png"
                   autoChange="false"
                   onClick="self:alternarVisibilidade();" />       

    <button align="right" text="Apagar" width="80" onClick="ndb.deleteNode(sheet);"/>                       

    <event name="onScopeNodeChanged">
            if self.observer ~= nil then   
                    self.observer.enabled = false;
                    self.observer = nil;
            end;
              

            if sheet ~= nil then   
                    self.observer = ndb.newObserver(sheet);

                    self.observer.onPermissionListChanged =
                            function(node)                 
                                    self:atualizarCbxInvisivel();
                            end;                               

                    self.observer.onFinalPermissionsCouldBeChanged =
                            function(node)
                                    self:atualizarCbxInvisivel();
                            end;                               

                    self:atualizarCbxInvisivel();  
            end;
    </event>
</form>

Created with the Personal Edition of HelpNDoc: Maximize Your Productivity with HelpNDoc's Efficient User Interface