fix: code block backspace error and task list error (#919)

* fix: code block backspace error

* fix: #738 remove task list item error

* debug codes

* remove cross-env

* fix comment issue
This commit is contained in:
Ran Luo 2019-04-12 23:57:54 +08:00 committed by Felix Häusler
parent d7eccc005b
commit 52237bfe74
3 changed files with 60 additions and 28 deletions

View File

@ -147,8 +147,7 @@ const backspaceCtrl = ContentState => {
} }
return this.partialRender() return this.partialRender()
} }
// fix: #67 problem 1
if (startBlock.icon) return event.preventDefault()
// fix: unexpect remove all editor html. #67 problem 4 // fix: unexpect remove all editor html. #67 problem 4
if (startBlock.type === 'figure' && !startBlock.preSibling) { if (startBlock.type === 'figure' && !startBlock.preSibling) {
event.preventDefault() event.preventDefault()
@ -171,12 +170,8 @@ const backspaceCtrl = ContentState => {
return this.render() return this.render()
} }
if (startBlock.functionType === 'languageInput' && start.offset === 0) {
return event.preventDefault()
}
// If select multiple paragraph or multiple characters in one paragraph, just let // If select multiple paragraph or multiple characters in one paragraph, just let
// updateCtrl to handle this case. // inputCtrl to handle this case.
if (start.key !== end.key || start.offset !== end.offset) { if (start.key !== end.key || start.offset !== end.offset) {
return return
} }

View File

@ -82,6 +82,7 @@ const inputCtrl = ContentState => {
if (!start || !end) { if (!start || !end) {
return return
} }
const { start: oldStart, end: oldEnd } = this.cursor const { start: oldStart, end: oldEnd } = this.cursor
const key = start.key const key = start.key
const block = this.getBlock(key) const block = this.getBlock(key)
@ -92,9 +93,20 @@ const inputCtrl = ContentState => {
if (oldStart.key !== oldEnd.key) { if (oldStart.key !== oldEnd.key) {
const startBlock = this.getBlock(oldStart.key) const startBlock = this.getBlock(oldStart.key)
const startOutmostBlock = this.findOutMostBlock(startBlock)
const endBlock = this.getBlock(oldEnd.key) const endBlock = this.getBlock(oldEnd.key)
const endOutmostBlock = this.findOutMostBlock(endBlock)
this.removeBlocks(startBlock, endBlock) if (
// fix #918.
startBlock.functionType === 'languageInput' &&
startOutmostBlock === endOutmostBlock &&
!endBlock.nextSibling
) {
this.removeBlocks(startBlock, endBlock, false)
endBlock.text = ''
} else {
this.removeBlocks(startBlock, endBlock)
}
if (this.blocks.length === 1) { if (this.blocks.length === 1) {
needRenderAll = true needRenderAll = true
} }

View File

@ -439,9 +439,43 @@ class Selection {
getCursorRange () { getCursorRange () {
let { anchorNode, anchorOffset, focusNode, focusOffset } = this.doc.getSelection() let { anchorNode, anchorOffset, focusNode, focusOffset } = this.doc.getSelection()
// when the first paragraph is task list, press ctrl + a, then press backspace will cause bug
// use code bellow to fix the bug
const findFirstTextNode = anchor => {
if (anchor.nodeType === 3) return anchor
// if it's a empty line, just return the span element.
if (
anchor.nodeType === 1 &&
anchor.nodeName === 'SPAN' &&
anchor.textContent === '' &&
anchor.classList.contains('ag-line')
) {
return anchor
}
const children = anchor.childNodes
for (const node of children) {
if (
/input/i.test(node.nodeName) ||
node.nodeType === 1 && node.getAttribute('contenteditable') === 'false'
) {
continue
}
return findFirstTextNode(node)
}
}
let needFix = false
if (anchorNode.nodeName === 'LI') {
needFix = true
anchorNode = findFirstTextNode(anchorNode)
}
if (focusNode.nodeName === 'LI') {
needFix = true
focusNode = findFirstTextNode(focusNode)
}
let startParagraph = findNearestParagraph(anchorNode) let startParagraph = findNearestParagraph(anchorNode)
let endParagraph = findNearestParagraph(focusNode) let endParagraph = findNearestParagraph(focusNode)
if (!startParagraph || !endParagraph) { if (!startParagraph || !endParagraph) {
return { return {
start: null, start: null,
@ -449,21 +483,6 @@ class Selection {
} }
} }
// when the first paragraph is task list, press ctrl + a, then press backspace will cause bug
// use code bellow to fix the bug
const findFirstTextNode = anchor => {
if (anchor.nodeType === 3) return anchor
const children = anchor.childNodes
for (const node of children) {
if (node.nodeName !== 'INPUT') {
return findFirstTextNode(node)
}
}
}
if (anchorNode.nodeName === 'LI') {
anchorNode = findFirstTextNode(anchorNode)
}
const getOffsetOfParagraph = (node, paragraph) => { const getOffsetOfParagraph = (node, paragraph) => {
let offset = 0 let offset = 0
let preSibling = node let preSibling = node
@ -481,11 +500,13 @@ class Selection {
: offset + getOffsetOfParagraph(node.parentNode, paragraph) : offset + getOffsetOfParagraph(node.parentNode, paragraph)
} }
let result = null
if (startParagraph === endParagraph) { if (startParagraph === endParagraph) {
const key = startParagraph.id const key = startParagraph.id
const offset1 = getOffsetOfParagraph(anchorNode, startParagraph) + anchorOffset const offset1 = getOffsetOfParagraph(anchorNode, startParagraph) + anchorOffset
const offset2 = getOffsetOfParagraph(focusNode, endParagraph) + focusOffset const offset2 = getOffsetOfParagraph(focusNode, endParagraph) + focusOffset
return { result = {
start: { key, offset: Math.min(offset1, offset2) }, start: { key, offset: Math.min(offset1, offset2) },
end: { key, offset: Math.max(offset1, offset2) } end: { key, offset: Math.max(offset1, offset2) }
} }
@ -503,11 +524,15 @@ class Selection {
} }
} }
if (order) { if (order) {
return rawCursor result = rawCursor
} else { } else {
return { start: rawCursor.end, end: rawCursor.start } result = { start: rawCursor.end, end: rawCursor.start }
} }
} }
if (needFix) {
this.setCursorRange(result)
}
return result
} }
// topOffset is the line counts above cursor, and bottomOffset is line counts bellow cursor. // topOffset is the line counts above cursor, and bottomOffset is line counts bellow cursor.