Operação Drag and Drop no Formulário

Neste tutorial, vou mostrar como implementar uma operação Drag and Drop no Formulário Dinâmico.

O objetivo é mover mover alguns elementos de uma <div> para outra. Você pode conferir este exemplo em funcionamento clicando aqui.

Estrutura do Formulário

Campos

  • elmDraggableElements: Campo do tipo HtmlElement que vai conter os elementos que podem ser arrastados. Informe o código abaixo na propriedade Template Html:

    <div id="draggableElements">
    	<div draggable="true" id="div1" ondragstart="drag(event)">Div 1</div>
    	<div draggable="true" id="div2" ondragstart="drag(event)">Div 2</div>
    	<div draggable="true" id="div3" ondragstart="drag(event)">Div 3</div>
    </div>
    
  • elmDropArea:Campo do tipo HtmlElement onde será possível “soltar” os elementos arrastados. Será a área de destino da operação Drag-and-Drop. Informe o código abaixo na propriedade Template Html:

    <div id="dropArea" style="width:100%;height:100%"
    	ondrop="drop(event)"
    	ondragover="allowDrop(event)">
    </div>
    
  • btnFakeButton: Campo do tipo Button. Este será um botão “falso”. Ele não precisa ser exibido no Formulário. Ele será usado apenas como gatilho para realizar a operação no lado do servidor. Ao concluir a operação Drag-and-Drop, vamos disparar o evento Click deste botão para conseguirmos processar a informação nos procedimentos do Formulário.

Procedimentos

  • btnFakeButton_Click: Procedimento que será chamado no evento Click do botão btnFakeButton. Adicione um parâmetro chamado items no procedimento. Neste parâmetro receberemos um texto com o conteúdo de todos os items arrastados, separados por vírgula.
    Adicione uma instrução Mostrar Mensagem para exibir o valor deste parâmetro. O procedimento deve ficar assim:

Arquivos JavaScript

Adicione um arquivo JavaScript no Formulário. Neste exemplo, o arquivo chama-se demo-drag-and-drop.js, mas você pode usar o nome de sua preferência.

No arquivo JavaScript, informe o código abaixo:

function allowDrop(ev) {
	ev.preventDefault();
}

function drag(ev) {
	ev.dataTransfer.setData("Text", ev.target.id);
}

function drop(ev) {
	let data = ev.dataTransfer.getData("Text");
	ev.target.appendChild(document.getElementById(data));
	ev.preventDefault();
	
	// Dispara evento no servidor
	let arguments = { items: getDraggedItems().join(', ') }
	sendData(arguments);
}

function getDraggedItems() {
	let arr = [];
	let i; 
	let draggedElements = document.getElementById('dropArea').children;
	
	for(i = 0; i < draggedElements.length; i++) {
		arr.push(draggedElements[i].innerHTML);
	}
	return arr;
}

function sendData(jsonData) {
	
	// Obtém instância do Form Dinâmico
	let form = latromi.formManager.getFormInstance();
	
	// Dispara o evento click do botão "Fake", passando JSON como argumento
	form.raiseFieldEvent('btnFakeButton', 'Click', jsonData );
}

Layout

Use o Layout Absoluto para conseguir dispor os Campos mais ou menos dessa forma:

Executando no Navegador

Pronto, o objetivo de arrastar as <div> foi cumprido! Para testar, clique no link “Abrir no Navegador” e arraste os objetos de um lado para outro.

DragAndDrop

1 curtida

Boa tarde Daniel.

Implementamos o drag and drop aqui, mas estamos com problemas na função sendData. Quando ela é executada via link externo (tracking) é retornado o erro Bad Request.

A implementação já havia sido feita, porém com divs fixas de componentes do Latromi, agora estamos criando as divs dinamicamente.

No link direto do servidor está funcionando perfeitamente.

Erros na aba Rede.
image

image

Olá @augustonegromonte!

Por favor, compartilhe o código JS que você está utilizando.

Segue códigos JS e C# abaixo.

Javascript público:

function allowDrop(ev) {
    ev.preventDefault();
}

function drag(ev) {
    ev.dataTransfer.setData("Text", ev.target.id);
}

function dropEtp(ev,etp) {
    let data = ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
    ev.preventDefault();
    console.log(ev);
    // Dispara evento no servidor
    let arguments = { items: getDraggedItems().join(', ') }
    let Ids = { items: getIdEtapa(etp).join(',') }

    sendData(Ids,"btnFakeButton");

}

function getDraggedItems() {
    let arr = [];
    let i; 
    let draggedElements = document.getElementById('Etapa01').children;
    
    for(i = 0; i < draggedElements.length; i++) {
        arr.push(draggedElements[i].innerHTML);
    }
    return arr;
}

function getIdEtapa(etp) {
    let arr = [];
    let i; 
    
    let draggedElements = document.getElementById('Etapa0'+ etp).children;
    
    for(i = 0; i < draggedElements.length; i++) {
        arr.push('{"carga":"' + document.getElementById('Etapa0' + etp).children[i].id + '", "status" : "'+ etp +'"}');
    }
    console.log(etp);
    return arr;
}

function sendData(jsonData, btn) {
    try{
        var form = latromi.formManager.getFormInstance();
        form.raiseFieldEvent(btn, 'Click', jsonData);   
    }catch (err){
        alert(err);
    }
}

function acaobtn(carga,acao,etapa){
    let argument = {carga: carga, acao: acao, etapa: etapa}
    
    if (acao == 1){
        sendData(argument,"btnAssinatura");
    }else if (acao == 2){
        sendData(argument,"btnAnotacoes");
    }else if (acao == 3){    
        sendData(argument,"btnChecklist");
    }else if (acao == 4){    
        sendData(argument,"btnAddNotaFiscal");
    }else if (acao == 5){    
        sendData(argument,"btnArquivar");
    }else if (acao == 6){   
        sendData(argument,"btnUpdateCarga");    
    }else if (acao == 7){    
        sendData(argument,"btnRusumoCarga");       
    }else if (acao == 8){    
        sendData(argument,"btnMover"); 
    }else if (acao == 9){    
        sendData(argument,"btnExcluir"); 
    } else {
    
    }
    
}

Javascript para criação das divs no formulário:

try {
    var form = latromi.formManager.getFormInstance();
    var labelEtapa = form.getVariableValue('vDescricaoEtapa');
    var labelCores = form.getVariableValue('vCores');
    var labelCoresttl = form.getVariableValue('vCoresttl');
    
    var Etapas = labelEtapa.split(',');
    var Cores = labelCores.split(',');
    var ttl = labelCoresttl.split(',');

        for(let i = 0 ; i <= Etapas.length - 1;i++){
            const novoelm = document.createElement("div");
            
            const novottl = document.createElement("div");
            novottl.id = "ttl0"+ (i + 1);
            novottl.style.height = "2.7em";
            novottl.style.display = "block";
            novottl.style.marginRight = "0.25em";

            const novaetapa = document.createElement("div");
            novaetapa.id = "Etapa00"+ (i + 1);
            novaetapa.style.width = "29em";
            novaetapa.style.height = "90%";
            novaetapa.style.backgroundColor = "rgba(0, 51, 105, 50%)";
            novaetapa.style.display = "block";
            novaetapa.style.marginRight = "0.25em";

            novottl.innerHTML = '<div id="ttl" style = "background-color: '+ Cores[i] +';height: 100%;"><a style="color: '+ ttl[i] +'">'  + Etapas[i] + '</a></div>' 
 
            const parent = document.getElementById('ctl00_Conteudo_frm_f304253');
            parent.style.display = '-webkit-inline-box'
            novoelm.appendChild(novottl);
            novoelm.appendChild(novaetapa);
            parent.appendChild(novoelm);
            
        }
}catch (e) {
    alert("Atenção.\nVerifique as configurações para a execução do sistema.\n\n- Conta cadastrada para o usuário.\n-Cadastro das etapas para a conta.")
    let button = document.getElementsByTagName("button");
    
    for(let i = 0 ; i <= button.length - 1; i++){
        button[i].disabled = true;
    }    
}      

Dentro das divs Etapa00X é criada outra div Etapa01, com c# abastacendo a variável e o Javascript populando a div. Tentei colocar as funções ondragover e ondrop com javascript no código acima mas não consegui.

Variables["Etapa01"].Value = "<div id= 'Etapa01' ondragover='allowDrop(event)' ondrop='dropEtp(event,1)' style='width: 100%; height: 100%;background-color: rgba(0, 51, 105, 50%); display:block;'>" + elmEtapa01 + "</div>";

Depois abastece a div Etapa0X com os dados da variável abastecida acima.

    var etapa = document.getElementById('Etapa00'+i);
    var dados = myForm.getVariableValue('Etapa0'+i);
    etapa.innerHTML = dados;