@atlaskit/editor-plugin-list
Version:
List plugin for @atlaskit/editor-core
131 lines (130 loc) • 6.18 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.indentListItemsSelected = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _lists = require("@atlaskit/editor-common/lists");
var _selection = require("@atlaskit/editor-common/selection");
var _utils = require("@atlaskit/editor-common/utils");
var _model = require("@atlaskit/editor-prosemirror/model");
var _state = require("@atlaskit/editor-prosemirror/state");
var _find = require("../utils/find");
var indentListItemsSelected = exports.indentListItemsSelected = function indentListItemsSelected(tr) {
var _currentListItem$cont;
var originalSelection = tr.selection;
var normalizedSelection = (0, _lists.normalizeListItemsSelection)({
selection: originalSelection,
doc: tr.doc
});
var $from = normalizedSelection.$from,
$to = normalizedSelection.$to;
var range = calculateRange({
selection: normalizedSelection
});
if (!range) {
return false;
}
var listItemsSelected = {
from: (0, _find.findFirstParentListItemNode)($from),
to: (0, _find.findFirstParentListItemNode)($to)
};
if (listItemsSelected.from === null || listItemsSelected.to === null) {
return null;
}
var resolvedPos = tr.doc.resolve(listItemsSelected.from.pos);
var listItemIndex = resolvedPos.index();
// @ts-ignore
var positionListItemPosition = resolvedPos.posAtIndex(listItemIndex - 1);
var currentListItemPosition = resolvedPos.posAtIndex(listItemIndex);
var previousListItem = tr.doc.nodeAt(positionListItemPosition);
var currentListItem = tr.doc.nodeAt(currentListItemPosition);
var currentListItemContent = currentListItem === null || currentListItem === void 0 || (_currentListItem$cont = currentListItem.content) === null || _currentListItem$cont === void 0 ? void 0 : _currentListItem$cont.content;
var hasLastItemExtension = currentListItemContent !== undefined && (currentListItemContent === null || currentListItemContent === void 0 ? void 0 : currentListItemContent.length) > 0 ? currentListItemContent[currentListItemContent.length - 1].type.name === 'extension' : false;
if (!previousListItem || !(0, _utils.isListItemNode)(previousListItem)) {
return null;
}
if ((0, _utils.isListItemNode)(previousListItem) && listItemIndex === 0) {
return null;
}
var listItemSelectedCommonParent = range.parent;
var previousNestedList = (0, _utils.isListNode)(previousListItem.lastChild) ? previousListItem.lastChild : null;
var listNodeType = previousNestedList ? previousNestedList.type : listItemSelectedCommonParent.type;
var nestedList = listItemsSelected.to.node.lastChild;
var nestedItemsOffset = nestedList && (0, _utils.isListNode)(nestedList) ? nestedList.nodeSize : 0;
var from = listItemsSelected.from.pos;
var to = listItemsSelected.to.pos + listItemsSelected.to.node.nodeSize - nestedItemsOffset;
var _createIndentedListIt = createIndentedListItemsSlice({
tr: tr,
listNodeType: listNodeType,
range: range,
from: from,
to: to,
hasLastItemExtension: hasLastItemExtension
}),
_createIndentedListIt2 = (0, _slicedToArray2.default)(_createIndentedListIt, 2),
sliceSelected = _createIndentedListIt2[0],
nestedListItemsLeftover = _createIndentedListIt2[1];
var hasPreviousNestedList = Boolean(previousNestedList);
var start = from - 1;
tr.replaceRange(hasPreviousNestedList ? start - 1 : start, range.end, sliceSelected);
var leftoverContentPosition = tr.mapping.map(to) - 2;
if (nestedListItemsLeftover.openStart === 0) {
tr.insert(leftoverContentPosition, nestedListItemsLeftover.content);
} else {
tr.replace(leftoverContentPosition - nestedListItemsLeftover.openStart, leftoverContentPosition - nestedListItemsLeftover.openStart, nestedListItemsLeftover);
}
var nextSelection = calculateNewSelection({
originalSelection: originalSelection,
normalizedSelection: normalizedSelection,
tr: tr,
hasPreviousNestedList: hasPreviousNestedList
});
tr.setSelection(nextSelection);
};
var calculateRange = function calculateRange(_ref) {
var selection = _ref.selection;
var $from = selection.$from,
$to = selection.$to;
var range = $from.blockRange($to, _utils.isListNode);
if (!range) {
return null;
}
return range;
};
var calculateNewSelection = function calculateNewSelection(_ref2) {
var tr = _ref2.tr,
normalizedSelection = _ref2.normalizedSelection,
originalSelection = _ref2.originalSelection,
hasPreviousNestedList = _ref2.hasPreviousNestedList;
var offset = hasPreviousNestedList ? 2 : 0;
var $from = normalizedSelection.$from,
$to = normalizedSelection.$to;
if (normalizedSelection instanceof _selection.GapCursorSelection) {
var _nextSelectionFrom = tr.doc.resolve($from.pos - offset);
return new _selection.GapCursorSelection(_nextSelectionFrom, normalizedSelection.side);
}
if (originalSelection instanceof _state.NodeSelection) {
return _state.NodeSelection.create(tr.doc, $from.pos - offset);
}
var _Selection$near = _state.Selection.near(tr.doc.resolve($from.pos - offset)),
nextSelectionFrom = _Selection$near.$from;
var _Selection$near2 = _state.Selection.near(tr.doc.resolve($to.pos - offset), -1),
nextSelectionTo = _Selection$near2.$to;
return new _state.TextSelection(nextSelectionFrom, nextSelectionTo);
};
var createIndentedListItemsSlice = function createIndentedListItemsSlice(_ref3) {
var tr = _ref3.tr,
from = _ref3.from,
to = _ref3.to,
listNodeType = _ref3.listNodeType,
range = _ref3.range,
hasLastItemExtension = _ref3.hasLastItemExtension;
var listItemsSlice = tr.doc.slice(from, hasLastItemExtension ? to : to - 2);
var listFragment = _model.Fragment.from(listNodeType.create(null, listItemsSlice.content));
var nonSelectedListItemsSlice = tr.doc.slice(to, range.end - 2);
var openStart = tr.doc.slice(from - 1, range.end).openStart;
var slice = new _model.Slice(listFragment, openStart, 0);
return [slice, nonSelectedListItemsSlice];
};