diff --git a/packages/slate/src/changes/at-range.js b/packages/slate/src/changes/at-range.js index 28f7c85e1..7c549eb76 100644 --- a/packages/slate/src/changes/at-range.js +++ b/packages/slate/src/changes/at-range.js @@ -671,7 +671,11 @@ Changes.insertFragmentAtRange = (change, range, fragment, options = {}) => { // If the range is expanded, delete it first. if (range.isExpanded) { change.deleteAtRange(range, { normalize: false }) - range = range.collapseToStart() + if (change.value.document.getDescendant(range.startKey)) { + range = range.collapseToStart() + } else { + range = range.collapseTo(range.endKey, 0) + } } // If the fragment is empty, there's nothing to do after deleting. diff --git a/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js b/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js new file mode 100644 index 000000000..e75eae19e --- /dev/null +++ b/packages/slate/test/changes/at-current-range/insert-fragment/hanging-selection-single-block.js @@ -0,0 +1,44 @@ +/** @jsx h */ + +import h from '../../../helpers/h' + +const fragment = ( + + fragment zero + fragment one + fragment two + +) +export default function(change) { + change.insertFragment(fragment) +} + +export const input = ( + + + zero + + one + + + two + + + +) + +// The cursor position of insertFragment has some problems; +// If you submit PR to fixed cursor position restore in insertFragment; +// Please change this test as well +export const output = ( + + + zero + fragment zero + fragment one + + fragment twotwo + + + +)