@atlaskit/editor-plugin-block-controls
Version:
Block controls plugin for @atlaskit/editor-core
70 lines (69 loc) • 2.9 kB
JavaScript
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;
};