UNPKG

@atlaskit/editor-plugin-block-controls

Version:

Block controls plugin for @atlaskit/editor-core

70 lines (69 loc) 2.9 kB
import { TextSelection } from '@atlaskit/editor-prosemirror/state'; import { findParentNodeOfType } from '@atlaskit/editor-prosemirror/utils'; export var getNestedNodePosition = function getNestedNodePosition(_ref) { var selection = _ref.selection, schema = _ref.schema, resolve = _ref.resolve; var nestedNodePos = selection.$from.before(1); if (selection instanceof TextSelection) { nestedNodePos = selection.$from.before(); var $pos = resolve(nestedNodePos); if ($pos.depth < 1) { return nestedNodePos; } var parentNodeOfSpecificTypes = findParentNodeOfType([schema.nodes.bulletList, schema.nodes.orderedList, schema.nodes.blockquote, schema.nodes.taskList, schema.nodes.decisionList])(selection); if (parentNodeOfSpecificTypes) { var parentNodeType = parentNodeOfSpecificTypes.node.type.name; nestedNodePos = ['bulletList', 'orderedList'].includes(parentNodeType) ? $pos.before($pos.depth - 1) : ['blockquote', 'taskList', 'decisionList'].includes(parentNodeType) ? $pos.before() : nestedNodePos; } } else { nestedNodePos = selection.$from.pos; } return nestedNodePos; }; /** * * @returns starting position of nested node that drag handle can be shown next to */ export var getNestedNodeStartingPosition = function getNestedNodeStartingPosition(_ref2) { var selection = _ref2.selection, schema = _ref2.schema, resolve = _ref2.resolve; var nestedNodePos = selection.$from.before(1); if (selection instanceof TextSelection) { nestedNodePos = selection.$from.before(); var $pos = resolve(nestedNodePos); if ($pos.depth < 1) { return nestedNodePos; } var _schema$nodes = schema.nodes, bulletList = _schema$nodes.bulletList, orderedList = _schema$nodes.orderedList, taskList = _schema$nodes.taskList, decisionList = _schema$nodes.decisionList, caption = _schema$nodes.caption; var isInList = findParentNodeOfType([bulletList, orderedList, taskList])(selection); var isInNodeWithoutDragHandle = findParentNodeOfType([caption, decisionList])(selection); if (isInList) { // Only show drag handle at outermost list parent nestedNodePos = _getOutermostListPos($pos, resolve); } else if (isInNodeWithoutDragHandle) { // return the position of their parent if there should be no drag handle before the node nestedNodePos = $pos.before(); } } else { nestedNodePos = selection.$from.pos; } return nestedNodePos; }; var _getOutermostListPos = function getOutermostListPos($pos, resolve) { if ($pos.depth === 0) { return $pos.pos; } var parentPos = $pos.before(); var parentNode = $pos.parent; if (parentNode && ['bulletList', 'listItem', 'orderedList', 'taskList', 'taskItem'].includes(parentNode.type.name)) { return _getOutermostListPos(resolve(parentPos), resolve); } return $pos.pos; };