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.