UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

59 lines (58 loc) 2.3 kB
import { NodeSelection, Selection, TextSelection } from '@atlaskit/editor-prosemirror/state'; import { GapCursorSelection } from '../selection'; /** * Compute the new selection offsets after list items have been moved/indented/outdented. * * Uses the content start offsets computed during fragment rebuild to map each * selection endpoint to its new absolute position, accounting for the change * in the list structure. */ export function computeSelectionOffsets(_ref) { var items = _ref.items, startIndex = _ref.startIndex, endIndex = _ref.endIndex, originalFrom = _ref.originalFrom, originalTo = _ref.originalTo, contentStartOffsets = _ref.contentStartOffsets, rootListStart = _ref.rootListStart, docSize = _ref.docSize; // +1 shifts from the outer edge of the list item node to the start of the content within var fromContentStart = items[startIndex].pos + 1; var toContentStart = items[endIndex].pos + 1; var fromOffset = originalFrom - fromContentStart; var toOffset = originalTo - toContentStart; var clamp = function clamp(pos) { return Math.min(Math.max(0, pos), docSize); }; return { from: clamp(rootListStart + contentStartOffsets[startIndex] + fromOffset), to: clamp(rootListStart + contentStartOffsets[endIndex] + toOffset) }; } /** * Restore the transaction's selection after a list structural change * (indent/outdent of list items or task list items). * * Uses the content start offsets computed during fragment rebuild to * map each selection endpoint to its new absolute position. * * Handles NodeSelection, GapCursorSelection, and TextSelection. */ export function restoreSelection(_ref2) { var tr = _ref2.tr, originalSelection = _ref2.originalSelection, from = _ref2.from, to = _ref2.to; var maxPos = tr.doc.content.size; if (originalSelection instanceof NodeSelection) { try { tr.setSelection(NodeSelection.create(tr.doc, Math.min(from, maxPos - 1))); } catch (_unused) { tr.setSelection(Selection.near(tr.doc.resolve(from))); } } else if (originalSelection instanceof GapCursorSelection) { tr.setSelection(new GapCursorSelection(tr.doc.resolve(from), originalSelection.side)); } else { tr.setSelection(TextSelection.create(tr.doc, from, to)); } }