From 5cbac62de3adb84cb89352dd5688fb215ce4ec7e Mon Sep 17 00:00:00 2001 From: Aljaz Grilc Date: Wed, 16 Apr 2025 09:27:20 +0200 Subject: [PATCH] Fix BesQuillService when pasting a simple block of text --- service.js | 51 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/service.js b/service.js index 5de09fc..1643692 100644 --- a/service.js +++ b/service.js @@ -1857,6 +1857,7 @@ class BesQuillService extends BesTreeService { onChangeData(delta) { let index = 0 let reproofNeeded = false + const affectedBlocks = new Set() delta.ops.forEach(op => { if (op.retain) { @@ -1866,11 +1867,12 @@ class BesQuillService extends BesTreeService { } } else if (op.insert) { reproofNeeded = true - index += op.insert.length + index += typeof op.insert === 'string' ? op.insert.length : 1 // Handle string or embed } else if (op.delete) { reproofNeeded = true } }) + if (reproofNeeded) { const editorLength = this.quillInstance.getLength() const clampedIndex = Math.min(index, editorLength - 1) @@ -1879,22 +1881,55 @@ class BesQuillService extends BesTreeService { if (leaf) { let domElement = leaf.domNode + // Traverse up to find the block element while (domElement && !this.isBlockElement(domElement)) { domElement = domElement.parentNode } - if (domElement) { - this.clearProofing(domElement) - setTimeout(() => { - this.redrawAllMistakeMarkup() - this.scheduleProofing(1000) - }, 0) - } + if (domElement) affectedBlocks.add(domElement) } else { console.warn( 'Leaf is null. The index might be out of bounds or the editor content is empty.' ) } + + // Handle pasted content spanning multiple blocks + const selection = this.quillInstance.getSelection() + if (selection) { + const [startLeaf] = this.quillInstance.getLeaf(selection.index) + const [endLeaf] = this.quillInstance.getLeaf( + selection.index + selection.length + ) + + if (startLeaf && endLeaf) { + let startElement = startLeaf.domNode + let endElement = endLeaf.domNode + + while (startElement && !this.isBlockElement(startElement)) { + startElement = startElement.parentNode + } + while (endElement && !this.isBlockElement(endElement)) { + endElement = endElement.parentNode + } + + if (startElement && endElement) { + let currentElement = startElement + while (currentElement) { + affectedBlocks.add(currentElement) + if (currentElement === endElement) break + currentElement = currentElement.nextElementSibling + } + } + } + } + + // Clear proofing for all affected blocks + affectedBlocks.forEach(block => this.clearProofing(block)) + + // Schedule proofing for all affected blocks + setTimeout(() => { + this.scheduleProofing(1000) + }, 0) } }