none
Travar SubGrid Com Javascript

    Pergunta

  • Boa tarde,

    Estou tentando travar o SubGrid com javascript a partir de uma condição qualquer, porem sem sucesso.

    Já usei esse código abaixo:

    var subGrid = document.getElementById(subgridName + “_span”);

    if (subGrid) {

    subGrid.disabled = “true”;

    }

    }

    Ele deixa o subGrid com o cor cinza, dando a impressão de estar bloqueado porem ainda é possível realizar todas as funcionalidades do mesmo.

    Gostaria de bloquear tudo, não deixar o usuário clicar e abrir o registro associado, não mostrar o botão de delete (sem bloquear nos direitos de acesso).

    Alguma ideia ?

    sexta-feira, 1 de agosto de 2014 19:40

Respostas

  • Boas Rafael,

    Eu experimentei no CRM Online e experimentei este código e funcionou:

    disableSubgridHyperlinkColumns = function(gridName)
    {
    	var subgridArea = document.getElementById(gridName + "_divDataArea");
    	if (subgridArea != null)
    	{
            document.getElementById(gridName).disabled = "true";
    
    		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                                  
    		for(i = 1; i < subgridTable.rows.length; i++)
    		{
    			subgridTable.rows[i].ondblclick=function(e){
    				if (!e)
    					e = window.event;
    
    				//IE9 & Other Browsers
    				if (e.stopPropagation) {
    					e.stopPropagation();
    				}
    				//IE8 and Lower
    				else {
    					e.cancelBubble = true;
    				}
    			};
    			
    			for(j = 1; j < subgridTable.rows[i].cells.length; j++)
    			{ 
    				if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A")
    				{
    					subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].outerHTML = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].innerText;
    				}
    			}
    		}
    	}
    }
    
    function onload() {
     setTimeout("disableSubgridHyperlinkColumns('Contacts');", 1500);
     setTimeout("disableSubgridHyperlinkColumns('accountopportunitiesgrid');", 1500);
    }

    Modifiquei o código, principalmente os índices de vários elementos. Também coloquei um parâmetro na função para receber o nome da Grid.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 20 de agosto de 2014 23:01
    • Marcado como Resposta Rafael Pétrus sexta-feira, 29 de agosto de 2014 17:28
    quarta-feira, 20 de agosto de 2014 23:01

Todas as Respostas

  • Tente através do Unbind na função de clique

    subGrid.off("click");

    ou

    subGrid.unbind();


    Se a sugestão resolver o problema, favor marcar como Resposta.

    sexta-feira, 1 de agosto de 2014 19:54
  • segunda-feira, 4 de agosto de 2014 13:12
  • Com puro javascript


    var subGrid = document.getElementById(subgridName + "_span");
    subGrid.addEventListener("click",function(e){
        subGrid.disabled = "true";
    },false);



    Se a sugestão resolver o problema, favor marcar como Resposta.

    segunda-feira, 4 de agosto de 2014 23:20
  • Não funcionou
    quarta-feira, 6 de agosto de 2014 14:55
  • Boas Rafael,

    Espero que já tenhas resolvido o teu problema, caso não tenhas tens aqui um exemplo a funcionar:

    disableSubgridHyperlinkColumns = function()
    {
    	var subgridArea = document.getElementById("accountContactsGrid_divDataArea");
    	if (subgridArea != null)
    	{
            document.getElementById("accountContactsGrid").disabled = "true";
    
    		var subgridTable = subgridArea.childNodes[0].childNodes[0];
                                  
    		for(i = 1; i < subgridTable.rows.length; i++)
    		{
    			subgridTable.rows[i].ondblclick=function(e){
    				if (!e)
    					e = window.event;
    
    				//IE9 & Other Browsers
    				if (e.stopPropagation) {
    					e.stopPropagation();
    				}
    				//IE8 and Lower
    				else {
    					e.cancelBubble = true;
    				}
    			};
    			
    			for(j = 2; j < subgridTable.rows[i].cells.length; j++)
    			{
    				if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A")
    				{
    					subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].outerHTML = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].innerText;
    				}
    			}
    		}
    	}
    }

    Agora basta chamares no onload do formulário:

    setTimeout("disableSubgridHyperlinkColumns();", 1500);

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP segunda-feira, 18 de agosto de 2014 10:07
    segunda-feira, 18 de agosto de 2014 10:07
  • Olá !

    Primeiramente, obrigado pela resposta.

    Tentei executar o script porem

    A linha:

    var subgridTable = subgridArea.childNodes[0].childNodes[0];

    retorna um [Object text]

    e a linha
    for(i = 1; i < subgridTable.rows.length; i++)
    retorna um erro:

    <Message>Não é possível obter valor da propriedade 'length': o objeto é nulo ou não definido</Message>


    terça-feira, 19 de agosto de 2014 18:47
  • Boas Rafael,

    Esqueci-me de referir que é necessário modificares os nomes das grids, nestas duas linhas de código:

    ...
    var subgridArea = document.getElementById("accountContactsGrid_divDataArea");
    	if (subgridArea != null)
    	{
            document.getElementById("accountContactsGrid").disabled = "true";
    
    ...

    Basicamente é descobrires o nome da grid e substuituires a string accountContactsGrid pelo nome que queres aplicar, por exemplo eu apliquei este código no formulário do cliente sobre a Grid dos contactos.

    Outra coisa importante é dizeres qual é o teu ambiente, ou seja, versão do dynamics crm e o rollup.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP terça-feira, 19 de agosto de 2014 22:18
    terça-feira, 19 de agosto de 2014 22:18
  • Eu troquei o nome da grids.

    O objeto subgridTable é encontrado porem não possui propriedade lengh.

    Estou utilizando CRM 2013, rollup 3.

    quarta-feira, 20 de agosto de 2014 14:50
  • Boas Rafael,

    Eu experimentei no CRM Online e experimentei este código e funcionou:

    disableSubgridHyperlinkColumns = function(gridName)
    {
    	var subgridArea = document.getElementById(gridName + "_divDataArea");
    	if (subgridArea != null)
    	{
            document.getElementById(gridName).disabled = "true";
    
    		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                                  
    		for(i = 1; i < subgridTable.rows.length; i++)
    		{
    			subgridTable.rows[i].ondblclick=function(e){
    				if (!e)
    					e = window.event;
    
    				//IE9 & Other Browsers
    				if (e.stopPropagation) {
    					e.stopPropagation();
    				}
    				//IE8 and Lower
    				else {
    					e.cancelBubble = true;
    				}
    			};
    			
    			for(j = 1; j < subgridTable.rows[i].cells.length; j++)
    			{ 
    				if (subgridTable.rows[i].cells[j].childNodes[0].childNodes[0] != null && subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].nodeName == "A")
    				{
    					subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].outerHTML = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].innerText;
    				}
    			}
    		}
    	}
    }
    
    function onload() {
     setTimeout("disableSubgridHyperlinkColumns('Contacts');", 1500);
     setTimeout("disableSubgridHyperlinkColumns('accountopportunitiesgrid');", 1500);
    }

    Modifiquei o código, principalmente os índices de vários elementos. Também coloquei um parâmetro na função para receber o nome da Grid.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quarta-feira, 20 de agosto de 2014 23:01
    • Marcado como Resposta Rafael Pétrus sexta-feira, 29 de agosto de 2014 17:28
    quarta-feira, 20 de agosto de 2014 23:01
  • Esse novo código funcionou, no primeiro momento quando a página é carregada realmente todos os itens são bloqueados, porem quando há a interação com o usuário e ele clica nos headers da subgrid, o mesmo desbloqueia.

    quinta-feira, 21 de agosto de 2014 12:13
  • Boas Rafael,

    Depois até me esqueci de colocar aqui o link para um post que eu escrevi sobre este assunto, resolvo esse problema da ordenação. Fica atento nele que eu vou atualizando para resolver problemas e melhorar o código.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    sexta-feira, 10 de outubro de 2014 11:46