Colocar uma subgrid disabled in CRM 2013

by Pedro Azevedo 23. August 2014 01:24

Boas pessoal,

Há algum tempo nos fóruns de discussão surgiu a dúvida de como colocar uma grid readonly criei um script na altura e foram surgindo várias dúvidas e eu fui complementando o script. Por isso estou aqui para explicar e partilhar o script. Este post será atualizado sempre que surgir problemas de não funcionar ou quando falhar numa atualização da Microsoft.

Este script não está no seu código mais atualizado mas espero que num futuro próximo espero melhorar muito. Por exemplo uma coisa que não gosto é misturar Javascript puro como JQuery.

Para começar e como primeira alternativa foi tentar usar o seguinte código:

document.getElementById(gridName).disabled = "true";

Mas este código não tem qualquer efeito na grid, pelo menos no CRM Online. Por isso o meu primeiro objetivo foi prevenir que o utilizador pudesse abrir um registo na grid, para isso apliquei o seguinte código:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		var subgridTable = subgridArea.childNodes[0].childNodes[1];
                              
		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;
			}
		}
	}
}

Este código retirei desta thread num fórum de discussão mas este não funciona totalmente pois a primeira coluna ficava sem dados, a thread era especifica para a versão 2011. Para além disso não tratava do double-click.

Com base nesse código fiz a minha própria versão para que este comportamento não acontecesse e tratar do double-click:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		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;

				if (e.stopPropagation) {
					e.stopPropagation();
				}
				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") {
					var node = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].childNodes[0];
					subgridTable.rows[i].cells[j].childNodes[0].removeChild(subgridTable.rows[i].cells[j].childNodes[0].childNodes[0]);
					subgridTable.rows[i].cells[j].childNodes[0].appendChild(node);
				}
			}
		}
	}
}

 

Este código funciona muito bem, só que tem um problema quando ordenamos ele voltava a recarregar a lista e tanto o link com o double-click passavam a funcionar:

Aqui a minha primeira opção era apanhar o reload da sub-grid mas não conseguir por isso a minha solução foi desativar a funcionalidade de ordenar, com este código em JQuery:

$("#" + gridName + " .ms-crm-List-Sortable").bind("click", function(event){
	event.stopPropagation();
});

Com este código aplicado ele não consegue ordenar logo fica tudo bem J não é a melhor opção mas por agora funciona. Agora só faltava desabilitar os botões de adicionar e de mostrar o detalhe dos registos, aqui também recorri ao JQuery:

$("#" + gridName + "_addImageButtonImage").bind("click", function(event){
	event.stopPropagation();
});

$("#" + gridName + "_openAssociatedGridViewImageButtonImage").bind("click", function(event){
	event.stopPropagation();
});

Et voilà tornamos a nossa subgrid totalmente disabled. Vejam o código completo usado, onde também tentei tornar o mais dinâmico possível para isso bastando passar o nome da sub-grid:

disableSubgrid = function(gridName) {
	var subgridArea = document.getElementById(gridName + "_divDataArea");
	if (subgridArea != null) {
		$("#" + gridName + " .ms-crm-List-Sortable").bind("click", function(event){
			event.stopPropagation();
		});
		
		$("#" + gridName + "_addImageButtonImage").bind("click", function(event){
			event.stopPropagation();
		});

		$("#" + gridName + "_openAssociatedGridViewImageButtonImage").bind("click", function(event){
			event.stopPropagation();
		});

		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;

				if (e.stopPropagation) {
					e.stopPropagation();
				}
				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") {
					var node = subgridTable.rows[i].cells[j].childNodes[0].childNodes[0].childNodes[0];
					subgridTable.rows[i].cells[j].childNodes[0].removeChild(subgridTable.rows[i].cells[j].childNodes[0].childNodes[0]);
					subgridTable.rows[i].cells[j].childNodes[0].appendChild(node);
				}
			}
		}
	}
	else {
		setTimeout("disableSubgrid('" + gridName + "');", 1500);
	}
}

function onload() {
	setTimeout("disableSubgrid('Contacts');", 1500);
	setTimeout("disableSubgrid('accountopportunitiesgrid');", 1500);
}

 

 

PS: Se tiverem problemas coloquem nos comentários ou coloquem a dúvida no fórum de discussão.

 

Até a próxima

Tags: , , , ,

Comments (1) -

Cameron Barris
Cameron Barris United States
7/9/2015 6:02:07 AM #

I couldn't resist commenting. Exceptionally well written!|

Reply

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List