diff --git a/packages/slate/src/changes/at-current-range.js b/packages/slate/src/changes/at-current-range.js
index 0fc894638..6a996d23a 100644
--- a/packages/slate/src/changes/at-current-range.js
+++ b/packages/slate/src/changes/at-current-range.js
@@ -150,12 +150,17 @@ Changes.insertFragment = (change, fragment) => {
const { startText, endText, startInline } = value
const lastText = fragment.getLastText()
const lastInline = fragment.getClosestInline(lastText.key)
+ const firstChild = fragment.nodes.first()
+ const lastChild = fragment.nodes.last()
const keys = document.getTexts().map(text => text.key)
const isAppending =
!startInline ||
selection.hasEdgeAtStartOf(startText) ||
selection.hasEdgeAtEndOf(endText)
+ const isInserting =
+ fragment.hasBlocks(firstChild.key) || fragment.hasBlocks(lastChild.key)
+
change.insertFragmentAtRange(selection, fragment)
value = change.value
document = value.document
@@ -163,7 +168,7 @@ Changes.insertFragment = (change, fragment) => {
const newTexts = document.getTexts().filter(n => !keys.includes(n.key))
const newText = isAppending ? newTexts.last() : newTexts.takeLast(2).first()
- if (newText && lastInline) {
+ if ((newText && lastInline) || isInserting) {
change.select(selection.collapseToEndOf(newText))
} else if (newText) {
change.select(
diff --git a/packages/slate/src/changes/at-range.js b/packages/slate/src/changes/at-range.js
index cc008d829..ca5e5bc11 100644
--- a/packages/slate/src/changes/at-range.js
+++ b/packages/slate/src/changes/at-range.js
@@ -698,6 +698,8 @@ Changes.insertFragmentAtRange = (change, range, fragment, options = {}) => {
const parent = document.getParent(startBlock.key)
const index = parent.nodes.indexOf(startBlock)
const blocks = fragment.getBlocks()
+ const firstChild = fragment.nodes.first()
+ const lastChild = fragment.nodes.last()
const firstBlock = blocks.first()
const lastBlock = blocks.last()
@@ -709,13 +711,8 @@ Changes.insertFragmentAtRange = (change, range, fragment, options = {}) => {
// If the fragment starts or ends with single nested block, (e.g., table),
// do not merge this fragment with existing blocks.
- if (
- firstBlock != lastBlock &&
- Block.isBlock(fragment.nodes.first()) &&
- Block.isBlock(fragment.nodes.last()) &&
- (firstBlock != fragment.nodes.first() || lastBlock != fragment.nodes.last())
- ) {
- fragment.nodes.reverse().forEach((node) => {
+ if (fragment.hasBlocks(firstChild.key) || fragment.hasBlocks(lastChild.key)) {
+ fragment.nodes.reverse().forEach(node => {
change.insertBlockAtRange(range, node, options)
})
return
diff --git a/packages/slate/src/models/node.js b/packages/slate/src/models/node.js
index 002c502ce..db52bce49 100644
--- a/packages/slate/src/models/node.js
+++ b/packages/slate/src/models/node.js
@@ -1662,6 +1662,32 @@ class Node {
return !!this.getChild(key)
}
+ /**
+ * Check if a node has block node children.
+ *
+ * @param {String} key
+ * @return {Boolean}
+ */
+
+ hasBlocks(key) {
+ const node = this.assertNode(key)
+ return !!(node.nodes && node.nodes.find(n => n.object === 'block'))
+ }
+
+ /**
+ * Check if a node has inline node children.
+ *
+ * @param {String} key
+ * @return {Boolean}
+ */
+
+ hasInlines(key) {
+ const node = this.assertNode(key)
+ return !!(
+ node.nodes && node.nodes.find(n => Inline.isInline(n) || Text.isText(n))
+ )
+ }
+
/**
* Recursively check if a child node exists by `key`.
*
diff --git a/packages/slate/test/changes/at-current-range/insert-fragment/fragment-nested-blocks.js b/packages/slate/test/changes/at-current-range/insert-fragment/fragment-nested-blocks.js
index d169ef4ba..6247a6735 100644
--- a/packages/slate/test/changes/at-current-range/insert-fragment/fragment-nested-blocks.js
+++ b/packages/slate/test/changes/at-current-range/insert-fragment/fragment-nested-blocks.js
@@ -26,12 +26,14 @@ export const input = (
export const output = (
- woone
+ wo
-
- tword
-
+ one
+ two
+
+ rd
+
)
diff --git a/packages/slate/test/changes/at-current-range/insert-fragment/nested-block-fragment-nested-blocks.js b/packages/slate/test/changes/at-current-range/insert-fragment/nested-block-fragment-nested-blocks.js
index 1278c9ff0..4b44fc20c 100644
--- a/packages/slate/test/changes/at-current-range/insert-fragment/nested-block-fragment-nested-blocks.js
+++ b/packages/slate/test/changes/at-current-range/insert-fragment/nested-block-fragment-nested-blocks.js
@@ -29,12 +29,14 @@ export const output = (
- woone
+ wo
-
- tword
-
+ one
+ two
+
+ rd
+