1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Move elements from one div to another to modify a map

Discussão em 'Angular' iniciado por Marco mmd, Setembro 12, 2024.

  1. Marco mmd

    Marco mmd Guest

    Its a page of a project with Blazor, .NET and JS.

    I am trying to modify a map based on the positions of each element, and my problem is that when I try to move from the "drawing-list" element (it is a div where there are three elements that you can drag and move it to the main div to add more elements to the map if you wish.) nothing happens, but then when modifying it is not draggable within the main div, and all dragging elements are blocked.

    The code (script) of a drawing-list:

    window.initializeSortableForDrawings = () => {
    const mapContainer = document.querySelector('.map-container');
    const drawingList = document.querySelector('.drawing-list');

    if (mapContainer && drawingList) {
    Sortable.create(drawingList, {
    group: {
    name: "drawings",
    pull: "clone",
    put: false
    },
    sort: false
    });

    Sortable.create(mapContainer, {
    group: "drawings",
    onAdd: function (evt) {
    const itemEl = evt.item;
    const dibujoId = itemEl.id.replace('dibujo-list-', '');

    // Clonar el elemento arrastrado
    var clonedElement = itemEl.cloneNode(true);
    clonedElement.id = `dibujo-${dibujoId}`;
    clonedElement.removeAttribute('draggable');
    clonedElement.style.position = 'absolute';

    // Obtener las coordenadas del evento de arrastre y soltar
    const containerRect = evt.target.getBoundingClientRect();
    clonedElement.style.left = `${evt.clientX}px`;
    clonedElement.style.top = `${evt.clientY}px`;

    // Añadir el elemento clonado al zoom-container
    evt.target.appendChild(clonedElement);

    // Eliminar el original para evitar duplicación
    evt.from.removeChild(itemEl);

    console.log(`Dibujo ${dibujoId} añadido al mapa.`);

    // Verifica si dotNetRef está definido antes de llamar a invokeMethodAsync
    if (dotNetRef) {
    dotNetRef.invokeMethodAsync('ActualizarMapa')
    .then(() => {
    console.log('Mapa actualizado.');
    })
    .catch(error => console.error('Error al actualizar el mapa:', error));
    } else {
    console.error('dotNetRef no está definido.');
    }
    }
    });
    }
    };

    // Permite que el contenedor acepte elementos arrastrados
    function allowDrop(ev) {
    ev.preventDefault();
    }

    // Llamado cuando se inicia el arrastre
    function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.dataset.dibujoId); // Guardar el ID del dibujo
    }

    // Llamado mientras se está arrastrando
    function dragging(ev) {
    ev.preventDefault();
    var dibujoId = ev.dataTransfer.getData("text");
    var dibujoElement = document.getElementById('dibujo-list-' + dibujoId);

    // Crear una versión visual mientras se arrastra
    var previewElement = document.getElementById('drag-preview');
    if (!previewElement) {
    previewElement = dibujoElement.cloneNode(true);
    previewElement.id = 'drag-preview';
    previewElement.style.position = 'fixed';
    previewElement.style.pointerEvents = 'none'; // Evita interacciones con el elemento mientras se arrastra
    previewElement.style.zIndex = '1000';
    document.body.appendChild(previewElement);
    }

    // Actualiza la posición del preview mientras se arrastra
    previewElement.style.left = ev.clientX + 'px';
    previewElement.style.top = ev.clientY + 'px';
    }

    // Llamado cuando se suelta el elemento
    function drop(ev) {
    ev.preventDefault();
    var dibujoId = ev.dataTransfer.getData("text"); // Obtener el ID del dibujo
    var dibujoElement = document.getElementById('dibujo-list-' + dibujoId);

    // Clonar el elemento arrastrado y agregarlo al contenedor del mapa (zoom-container)
    var clonedElement = dibujoElement.cloneNode(true);
    clonedElement.removeAttribute('draggable'); // No permitir arrastrar el elemento nuevamente
    clonedElement.style.position = 'absolute'; // Posicionar el elemento en el mapa

    // Posicionarlo en las coordenadas donde se suelta
    const containerRect = ev.target.getBoundingClientRect();
    clonedElement.style.left = (ev.clientX - containerRect.left) + 'px';
    clonedElement.style.top = (ev.clientY - containerRect.top) + 'px';

    // Agregar el elemento clonado al contenedor de zoom
    ev.target.appendChild(clonedElement);

    // Eliminar el preview del arrastre
    var previewElement = document.getElementById('drag-preview');
    if (previewElement) {
    previewElement.remove();
    }

    // RE-RENDERIZADO
    clonedElement.style.display = 'none';
    requestAnimationFrame(() => {
    clonedElement.style.display = '';
    });

    dotNetRef.invokeMethodAsync('ActualizarMapa')
    .then(() => {
    logMessage('Mapa actualizado en Blazor.');
    })
    .catch(error => {
    logMessage('Error al actualizar el mapa:', error);
    });
    }


    The code of the main div:

    window.initializeSortable = () => {
    const tryInitialize = () => {
    const container = document.querySelector('.zoom-container');
    if (container) {
    logMessage('Contenedor encontrado:', container);

    Sortable.create(container, {
    animation: 150,
    onStart: (evt) => {
    const element = evt.item;
    element.classList.add("dragging");
    logMessage(`Iniciando arrastre para: ${element.id}`);
    DotNet.invokeMethodAsync('RMSuit_v2', 'SetDraggingState', true)
    .catch(error => logMessage(`Error al actualizar estado de arrastre: ${error}`));
    },
    onEnd: (evt) => {
    const element = evt.item;
    element.classList.remove("dragging");
    const elementId = evt.item.id.replace('dibujo-', '');

    const rect = element.getBoundingClientRect();

    const container = document.querySelector('.map-container');
    const containerRect = container.getBoundingClientRect();

    const newX = Math.round(rect.left - containerRect.left);
    const newY = Math.round(rect.top - containerRect.top);

    logMessage(`Elemento ${elementId} movido a X: ${newX}, Y: ${newY}`);

    dotNetRef.invokeMethodAsync('UpdateElementPositionAsync', parseInt(elementId), newX, newY)
    .catch(error => logMessage(`Error al actualizar la posición: ${error}`));

    DotNet.invokeMethodAsync('RMSuit_v2', 'SetDraggingState', false)
    .catch(error => logMessage(`Error al actualizar estado de arrastre: ${error}`));
    },
    onMove: (evt) => {
    const element = evt.dragged;
    const container = document.querySelector('.map-container');
    const containerRect = container.getBoundingClientRect();

    // Usamos el evento original del mouse para obtener las coordenadas correctas
    const mouseEvent = evt.originalEvent;
    const newX = Math.round(mouseEvent.clientX - containerRect.left - element.offsetWidth / 2);
    const newY = Math.round(mouseEvent.clientY - containerRect.top - element.offsetHeight / 2);

    // Actualizar la posición del elemento en tiempo real
    element.style.left = `${newX}px`;
    element.style.top = `${newY}px`;

    logMessage(`Moviendo elemento: ${element.id}, X: ${newX}, Y: ${newY}`);
    }
    });
    } else {
    logMessage('Sortable: el contenedor no se encontró, reintentando...');
    setTimeout(tryInitialize, 100); // Reintento después de 100ms
    }
    };

    tryInitialize();
    };


    The complete code is here:

    https://github.com/MarcomedSoltel/Problem/commit/b384ca942e2858774706d69dda74b01226bf4ead

    Try to solve it by debugging to see what could happen. I also try to give a unique id to each new element, but all I can think of is that the changes are not updated well visually or why the positions are 1,1 instead of dragging it correctly on the map. I'm a little stuck on this, and I don't really know how to move forward.

    Continue reading...

Compartilhe esta Página