Spaces:
Sleeping
Sleeping
Commit
·
d4b9975
1
Parent(s):
dcc8bc7
Resolved blocks not sorting correctly after trash event by always reordering by block-id which is static
Browse files- scripts.js +96 -77
scripts.js
CHANGED
|
@@ -109,7 +109,6 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 109 |
|
| 110 |
// Store initial positions of the blocks
|
| 111 |
function storeInitialPositions() {
|
| 112 |
-
initialPositions = []; // Clear initialPositions before updating
|
| 113 |
const blocks = blockContainer.querySelectorAll('.block-item');
|
| 114 |
blocks.forEach((block, index) => {
|
| 115 |
const blockId = block.getAttribute('data-block-id');
|
|
@@ -123,6 +122,80 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 123 |
});
|
| 124 |
console.log('Initial positions:', initialPositions);
|
| 125 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
function insertHtmlBlocks(blocks) {
|
| 128 |
console.log('blockContainerPage = ', blockContainerPage)
|
|
@@ -155,7 +228,6 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 155 |
el.style.height = 'auto';
|
| 156 |
el.style.height = (el.scrollHeight) + 'px';
|
| 157 |
}
|
| 158 |
-
console.log('Original height:', el.style.height);
|
| 159 |
}
|
| 160 |
|
| 161 |
function initializeTextareaResizing() {
|
|
@@ -170,13 +242,8 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 170 |
|
| 171 |
classes.forEach(className => {
|
| 172 |
const textareas = document.querySelectorAll(`.${className}`);
|
| 173 |
-
console.log(`Textareas found for ${className}:`, textareas.length); // Debugging line
|
| 174 |
textareas.forEach(textarea => {
|
| 175 |
-
|
| 176 |
-
console.log('clientHeight:', textarea.clientHeight);
|
| 177 |
-
console.log('offsetHeight:', textarea.offsetHeight);
|
| 178 |
-
console.log('Computed line-height:', window.getComputedStyle(textarea).lineHeight);
|
| 179 |
-
|
| 180 |
// Adjust height on page load
|
| 181 |
adjustTextareaHeight(textarea);
|
| 182 |
// Adjust height on input
|
|
@@ -326,9 +393,14 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 326 |
|
| 327 |
function handleDragOver(e) {
|
| 328 |
e.preventDefault();
|
| 329 |
-
e.dataTransfer.dropEffect = 'move';
|
| 330 |
console.log('Drag over event');
|
| 331 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
const targetPage = e.target.closest('.page');
|
| 333 |
if (targetPage) {
|
| 334 |
targetPage.classList.add('highlight-page'); // Add highlight class for pages
|
|
@@ -350,13 +422,19 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 350 |
|
| 351 |
function handleDrop(e) {
|
| 352 |
e.preventDefault();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
const blockId = e.dataTransfer.getData('block-id');
|
| 354 |
const originalPageId = e.dataTransfer.getData('data-page-id');
|
| 355 |
const innerHTML = e.dataTransfer.getData('text/plain');
|
| 356 |
console.log(`Drop event for block ID: ${blockId} from page ID: ${originalPageId}`);
|
| 357 |
|
| 358 |
// Ensure we are not dropping into a textarea or another block
|
| 359 |
-
if (
|
| 360 |
console.log('Cannot drop block inside another block or textarea');
|
| 361 |
return;
|
| 362 |
}
|
|
@@ -610,7 +688,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 610 |
const newPage = document.querySelector(`[data-page-id="${newPageId}"] .block-container`);
|
| 611 |
newPage.appendChild(block);
|
| 612 |
}
|
| 613 |
-
|
| 614 |
// Handle the drop event on the trash area
|
| 615 |
function handleTrashDrop(e) {
|
| 616 |
e.preventDefault();
|
|
@@ -640,16 +718,6 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 640 |
console.log(`Removed duplicate block with ID: ${blockId} from block-container`);
|
| 641 |
}
|
| 642 |
|
| 643 |
-
// Create a new block-item to be placed back in the block-container
|
| 644 |
-
const newBlock = document.createElement('div');
|
| 645 |
-
newBlock.classList.add('block-item');
|
| 646 |
-
newBlock.setAttribute('data-block-id', blockId);
|
| 647 |
-
newBlock.setAttribute('data-page-id', 'block-container');
|
| 648 |
-
newBlock.innerHTML = innerHTML;
|
| 649 |
-
newBlock.setAttribute('draggable', true);
|
| 650 |
-
newBlock.addEventListener('dragstart', handleDragStart);
|
| 651 |
-
newBlock.addEventListener('dragend', handleDragEnd);
|
| 652 |
-
|
| 653 |
// Ensure the block is appended to the page wrapper inside blockContainer
|
| 654 |
let pageWrapper = blockContainer.querySelector('.page');
|
| 655 |
if (!pageWrapper) {
|
|
@@ -659,46 +727,12 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 659 |
blockContainer.appendChild(pageWrapper);
|
| 660 |
}
|
| 661 |
|
| 662 |
-
//
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
| 666 |
-
// Find the original position to insert the new block
|
| 667 |
-
const originalPosition = initialPositions.find(pos => pos.id === blockId);
|
| 668 |
-
console.log('Original position:', originalPosition);
|
| 669 |
-
|
| 670 |
-
if (originalPosition) {
|
| 671 |
-
const blocks = pageWrapper.querySelectorAll('.block-item');
|
| 672 |
-
console.log('Blocks in pageWrapper:', blocks);
|
| 673 |
-
console.log('Inserting at position:', originalPosition.index);
|
| 674 |
-
|
| 675 |
-
if (originalPosition.index < blocks.length) {
|
| 676 |
-
const referenceNode = blocks[originalPosition.index];
|
| 677 |
-
if (referenceNode && referenceNode.parentNode === pageWrapper) {
|
| 678 |
-
console.log('Inserting before block at index:', originalPosition.index);
|
| 679 |
-
pageWrapper.insertBefore(newBlock, referenceNode);
|
| 680 |
-
console.log(`Moved block back to original position ${originalPosition.index} in block-container`);
|
| 681 |
-
} else {
|
| 682 |
-
console.warn('Reference node does not belong to pageWrapper, appending to the end');
|
| 683 |
-
pageWrapper.appendChild(newBlock);
|
| 684 |
-
console.log('Appended block to the end of block-container');
|
| 685 |
-
}
|
| 686 |
-
} else {
|
| 687 |
-
console.log('Appending block to the end of pageWrapper');
|
| 688 |
-
pageWrapper.appendChild(newBlock);
|
| 689 |
-
console.log('Appended block to the end of block-container');
|
| 690 |
-
}
|
| 691 |
} else {
|
| 692 |
-
console.log('
|
| 693 |
-
pageWrapper.appendChild(newBlock);
|
| 694 |
-
console.log('Appended block to the end of block-container');
|
| 695 |
}
|
| 696 |
-
|
| 697 |
-
console.log(`Restored block with ID: ${blockId}`);
|
| 698 |
-
} else {
|
| 699 |
-
console.log('No data transferred');
|
| 700 |
-
}
|
| 701 |
-
|
| 702 |
// Remove the "over" class and reset the background image
|
| 703 |
trashArea.classList.remove('over');
|
| 704 |
trashArea.style.backgroundImage = "url('./closed-mimic-trashcan.png')";
|
|
@@ -758,23 +792,8 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
| 758 |
initialPositions.forEach(pos => {
|
| 759 |
const blockData = allBlocks.find(block => block.id === pos.id);
|
| 760 |
if (blockData) {
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
newBlock.setAttribute('data-block-id', blockData.id);
|
| 764 |
-
newBlock.setAttribute('data-page-id', 'block-container');
|
| 765 |
-
newBlock.innerHTML = blockData.innerHTML;
|
| 766 |
-
newBlock.setAttribute('draggable', true);
|
| 767 |
-
newBlock.addEventListener('dragstart', handleDragStart);
|
| 768 |
-
newBlock.addEventListener('dragend', handleDragEnd);
|
| 769 |
-
|
| 770 |
-
const blocks = pageWrapper.querySelectorAll('.block-item');
|
| 771 |
-
if (pos.index < blocks.length) {
|
| 772 |
-
pageWrapper.insertBefore(newBlock, blocks[pos.index]);
|
| 773 |
-
console.log(`Moved block back to original position ${pos.index} in block-container`);
|
| 774 |
-
} else {
|
| 775 |
-
pageWrapper.appendChild(newBlock);
|
| 776 |
-
console.log('Appended block to the end of block-container');
|
| 777 |
-
}
|
| 778 |
}
|
| 779 |
});
|
| 780 |
createNewPage();
|
|
|
|
| 109 |
|
| 110 |
// Store initial positions of the blocks
|
| 111 |
function storeInitialPositions() {
|
|
|
|
| 112 |
const blocks = blockContainer.querySelectorAll('.block-item');
|
| 113 |
blocks.forEach((block, index) => {
|
| 114 |
const blockId = block.getAttribute('data-block-id');
|
|
|
|
| 122 |
});
|
| 123 |
console.log('Initial positions:', initialPositions);
|
| 124 |
}
|
| 125 |
+
|
| 126 |
+
function sortBlocksById() {
|
| 127 |
+
// Select all blocks inside the block-container
|
| 128 |
+
const blocks = Array.from(pageWrapper.querySelectorAll('.block-item'));
|
| 129 |
+
|
| 130 |
+
// Sort the blocks based on their block-id attribute
|
| 131 |
+
blocks.sort((a, b) => {
|
| 132 |
+
const idA = parseInt(a.getAttribute('data-block-id'), 10);
|
| 133 |
+
const idB = parseInt(b.getAttribute('data-block-id'), 10);
|
| 134 |
+
return idA - idB; // Ascending order
|
| 135 |
+
});
|
| 136 |
+
|
| 137 |
+
// Clear the block-container before re-appending the sorted blocks
|
| 138 |
+
pageWrapper.innerHTML = '';
|
| 139 |
+
|
| 140 |
+
// Re-append the blocks in the sorted order
|
| 141 |
+
blocks.forEach(block => pageWrapper.appendChild(block));
|
| 142 |
+
|
| 143 |
+
console.log('Blocks have been sorted and re-appended based on block-id');
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
function reinsertBlock(pageWrapper, blockId, innerHTML) {
|
| 147 |
+
const originalPosition = initialPositions.find(pos => pos.id === blockId);
|
| 148 |
+
console.log('Original position:', originalPosition);
|
| 149 |
+
|
| 150 |
+
if (originalPosition) {
|
| 151 |
+
const blocks = pageWrapper.querySelectorAll('.block-item');
|
| 152 |
+
console.log('Blocks in pageWrapper:', blocks);
|
| 153 |
+
|
| 154 |
+
// Adding debugging output for index details
|
| 155 |
+
console.log(`Attempting to insert block with ID: ${blockId} at original index: ${originalPosition.index}`);
|
| 156 |
+
|
| 157 |
+
const newBlock = document.createElement('div');
|
| 158 |
+
newBlock.classList.add('block-item');
|
| 159 |
+
newBlock.setAttribute('data-block-id', blockId);
|
| 160 |
+
newBlock.setAttribute('data-page-id', 'block-container');
|
| 161 |
+
newBlock.innerHTML = innerHTML;
|
| 162 |
+
newBlock.setAttribute('draggable', true);
|
| 163 |
+
newBlock.addEventListener('dragstart', handleDragStart);
|
| 164 |
+
newBlock.addEventListener('dragend', handleDragEnd);
|
| 165 |
+
|
| 166 |
+
if (originalPosition.index < blocks.length) {
|
| 167 |
+
const referenceNode = blocks[originalPosition.index];
|
| 168 |
+
|
| 169 |
+
// Debugging output to ensure the correct reference node is identified
|
| 170 |
+
console.log(`Reference node index: ${originalPosition.index}, Node:`, referenceNode);
|
| 171 |
+
|
| 172 |
+
if (referenceNode && referenceNode.parentNode === pageWrapper) {
|
| 173 |
+
console.log(`Inserting before block at index: ${originalPosition.index}`);
|
| 174 |
+
pageWrapper.insertBefore(newBlock, referenceNode);
|
| 175 |
+
} else {
|
| 176 |
+
console.warn('Reference node does not belong to pageWrapper, appending to the end');
|
| 177 |
+
pageWrapper.appendChild(newBlock);
|
| 178 |
+
}
|
| 179 |
+
} else {
|
| 180 |
+
console.log('Original index exceeds current blocks, appending block to the end');
|
| 181 |
+
pageWrapper.appendChild(newBlock);
|
| 182 |
+
}
|
| 183 |
+
} else {
|
| 184 |
+
console.warn('Original position not found, appending block to the end of pageWrapper');
|
| 185 |
+
const newBlock = document.createElement('div');
|
| 186 |
+
newBlock.classList.add('block-item');
|
| 187 |
+
newBlock.setAttribute('data-block-id', blockId);
|
| 188 |
+
newBlock.setAttribute('data-page-id', 'block-container');
|
| 189 |
+
newBlock.innerHTML = innerHTML;
|
| 190 |
+
newBlock.setAttribute('draggable', true);
|
| 191 |
+
newBlock.addEventListener('dragstart', handleDragStart);
|
| 192 |
+
newBlock.addEventListener('dragend', handleDragEnd);
|
| 193 |
+
|
| 194 |
+
pageWrapper.appendChild(newBlock);
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
console.log(`Restored block with ID: ${blockId}`);
|
| 198 |
+
}
|
| 199 |
|
| 200 |
function insertHtmlBlocks(blocks) {
|
| 201 |
console.log('blockContainerPage = ', blockContainerPage)
|
|
|
|
| 228 |
el.style.height = 'auto';
|
| 229 |
el.style.height = (el.scrollHeight) + 'px';
|
| 230 |
}
|
|
|
|
| 231 |
}
|
| 232 |
|
| 233 |
function initializeTextareaResizing() {
|
|
|
|
| 242 |
|
| 243 |
classes.forEach(className => {
|
| 244 |
const textareas = document.querySelectorAll(`.${className}`);
|
|
|
|
| 245 |
textareas.forEach(textarea => {
|
| 246 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
// Adjust height on page load
|
| 248 |
adjustTextareaHeight(textarea);
|
| 249 |
// Adjust height on input
|
|
|
|
| 393 |
|
| 394 |
function handleDragOver(e) {
|
| 395 |
e.preventDefault();
|
|
|
|
| 396 |
console.log('Drag over event');
|
| 397 |
+
// Check if the drop target is a TEXTAREA or any other non-droppable area
|
| 398 |
+
if (e.target.tagName === 'TEXTAREA' || e.target.closest('.block-item')) {
|
| 399 |
+
e.dataTransfer.dropEffect = 'none'; // Indicate that drop is not allowed
|
| 400 |
+
return;
|
| 401 |
+
}
|
| 402 |
+
e.dataTransfer.dropEffect = 'move'; // Indicate that drop is allowed
|
| 403 |
+
|
| 404 |
const targetPage = e.target.closest('.page');
|
| 405 |
if (targetPage) {
|
| 406 |
targetPage.classList.add('highlight-page'); // Add highlight class for pages
|
|
|
|
| 422 |
|
| 423 |
function handleDrop(e) {
|
| 424 |
e.preventDefault();
|
| 425 |
+
|
| 426 |
+
// Ensure we are not dropping into a textarea or another block
|
| 427 |
+
if (e.target.classList.contains('block-item', 'block-content') || e.target.tagName === 'TEXTAREA') {
|
| 428 |
+
console.log('Cannot drop block inside another block or textarea');
|
| 429 |
+
return;
|
| 430 |
+
}
|
| 431 |
const blockId = e.dataTransfer.getData('block-id');
|
| 432 |
const originalPageId = e.dataTransfer.getData('data-page-id');
|
| 433 |
const innerHTML = e.dataTransfer.getData('text/plain');
|
| 434 |
console.log(`Drop event for block ID: ${blockId} from page ID: ${originalPageId}`);
|
| 435 |
|
| 436 |
// Ensure we are not dropping into a textarea or another block
|
| 437 |
+
if (r.target.classList.contains('block-item', 'block-content') || event.target.tagName === 'TEXTAREA') {
|
| 438 |
console.log('Cannot drop block inside another block or textarea');
|
| 439 |
return;
|
| 440 |
}
|
|
|
|
| 688 |
const newPage = document.querySelector(`[data-page-id="${newPageId}"] .block-container`);
|
| 689 |
newPage.appendChild(block);
|
| 690 |
}
|
| 691 |
+
|
| 692 |
// Handle the drop event on the trash area
|
| 693 |
function handleTrashDrop(e) {
|
| 694 |
e.preventDefault();
|
|
|
|
| 718 |
console.log(`Removed duplicate block with ID: ${blockId} from block-container`);
|
| 719 |
}
|
| 720 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 721 |
// Ensure the block is appended to the page wrapper inside blockContainer
|
| 722 |
let pageWrapper = blockContainer.querySelector('.page');
|
| 723 |
if (!pageWrapper) {
|
|
|
|
| 727 |
blockContainer.appendChild(pageWrapper);
|
| 728 |
}
|
| 729 |
|
| 730 |
+
// Reinsert the block using the refactored function
|
| 731 |
+
reinsertBlock(pageWrapper, blockId, innerHTML);
|
| 732 |
+
sortBlocksById();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 733 |
} else {
|
| 734 |
+
console.log('No data transferred');
|
|
|
|
|
|
|
| 735 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 736 |
// Remove the "over" class and reset the background image
|
| 737 |
trashArea.classList.remove('over');
|
| 738 |
trashArea.style.backgroundImage = "url('./closed-mimic-trashcan.png')";
|
|
|
|
| 792 |
initialPositions.forEach(pos => {
|
| 793 |
const blockData = allBlocks.find(block => block.id === pos.id);
|
| 794 |
if (blockData) {
|
| 795 |
+
reinsertBlock(pageWrapper, blockData.id, blockData.innerHTML);
|
| 796 |
+
sortBlocksById();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 797 |
}
|
| 798 |
});
|
| 799 |
createNewPage();
|