| Current Path : /var/www/html/manish/ |
| Current File : /var/www/html/manish/test.html |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drag and Drop Rows with Numbering</title>
<style>
.container {
width: 70%;
margin: auto;
border: 1px solid #000;
padding: 3px;
}
.row {
padding: 3px;
margin: 5px 0;
cursor: move;
display: flex;
justify-content: space-between;
}
.row.dragging {
opacity: 0.5;
}
.row span {
margin-right: 3px;
}
.row .number {
margin-right: 20px;
font-weight: bold;
}
</style>
</head>
<body>
<h2>Drag and Drop to Reorder Rows (with Numbering)</h2>
<div class="container" id="rowContainer">
<div class="row" draggable="true">
<span class="number">1</span>
<span>Name: John Doe</span>
<span>Age: 30</span>
</div>
<div class="row" draggable="true">
<span class="number">2</span>
<span>Name: Jane Smith</span>
<span>Age: 25</span>
</div>
<div class="row" draggable="true">
<span class="number">3</span>
<span>Name: Bob Johnson</span>
<span>Age: 40</span>
</div>
<div class="row" draggable="true">
<span class="number">4</span>
<span>Name: Alice Brown</span>
<span>Age: 35</span>
</div>
</div>
<script>
const rows = document.querySelectorAll('.row');
let draggedRow = null;
let isTextSelected = false;
// Detect if user is selecting text (prevents drag-and-drop if true)
document.addEventListener('selectionchange', () => {
const selection = window.getSelection().toString();
isTextSelected = selection.length > 0;
});
// Add event listeners for drag and drop
rows.forEach(row => {
row.addEventListener('dragstart', function (e) {
if (isTextSelected) {
e.preventDefault(); // Prevent dragging if text is being selected
return;
}
draggedRow = row;
setTimeout(() => row.classList.add('dragging'), 0);
});
row.addEventListener('dragend', function () {
setTimeout(() => {
row.classList.remove('dragging');
draggedRow = null;
updateRowNumbers(); // Update row numbers after drag end
}, 0);
});
row.addEventListener('dragover', function (e) {
e.preventDefault();
const container = document.getElementById('rowContainer');
const afterElement = getDragAfterElement(container, e.clientY);
if (afterElement == null) {
container.appendChild(draggedRow);
} else {
container.insertBefore(draggedRow, afterElement);
}
});
});
// Helper function to determine the element to insert after
function getDragAfterElement(container, y) {
const draggableElements = [...container.querySelectorAll('.row:not(.dragging)')];
return draggableElements.reduce((closest, child) => {
const box = child.getBoundingClientRect();
const offset = y - box.top - box.height / 2;
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
}
// Function to update row numbers
function updateRowNumbers() {
const rows = document.querySelectorAll('.row');
rows.forEach((row, index) => {
row.querySelector('.number').textContent = index + 1;
});
}
</script>
</body>
</html>