@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
145 lines • 5.76 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var prosemirror_1 = require("../../prosemirror");
var tableBaseCommands = require("../../prosemirror/prosemirror-tables");
var _1 = require("./");
var utils_1 = require("./utils");
var analytics_1 = require("../../analytics");
var TAB_FORWARD_DIRECTION = 1;
var TAB_BACKWARD_DIRECTION = -1;
var createTable = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
if (pluginState.tableDisabled || pluginState.tableElement) {
return false;
}
pluginState.focusEditor();
var table = utils_1.createTableNode(3, 3, state.schema);
var tr = state.tr.replaceSelectionWith(table);
tr.setSelection(prosemirror_1.Selection.near(tr.doc.resolve(state.selection.from)));
dispatch(tr.scrollIntoView());
return true;
};
};
var goToNextCell = function (direction) {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
if (!pluginState.tableNode) {
return false;
}
var offset = pluginState.tableStartPos();
if (!offset) {
return false;
}
var map = prosemirror_1.TableMap.get(pluginState.tableNode);
var start = pluginState.getCurrentCellStartPos();
var firstCellPos = map.positionAt(0, 0, pluginState.tableNode) + offset + 1;
var lastCellPos = map.positionAt(map.height - 1, map.width - 1, pluginState.tableNode) + offset + 1;
var event = direction === TAB_FORWARD_DIRECTION ? 'next_cell' : 'previous_cell';
analytics_1.analyticsService.trackEvent("atlassian.editor.format.table." + event + ".keyboard");
if (firstCellPos === start && direction === TAB_BACKWARD_DIRECTION) {
pluginState.insertRow(0);
return true;
}
if (lastCellPos === start && direction === TAB_FORWARD_DIRECTION) {
pluginState.insertRow(map.height);
return true;
}
if (!pluginState.view.hasFocus()) {
pluginState.view.focus();
}
var result = tableBaseCommands.goToNextCell(direction)(state, dispatch);
// cancel text selection that is created by default
if (result) {
var latestState = pluginState.view.state;
dispatch(latestState.tr.setSelection(prosemirror_1.Selection.near(latestState.selection.$from)));
}
return result;
};
};
var cut = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
pluginState.closeFloatingToolbar();
return true;
};
};
var copy = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
pluginState.closeFloatingToolbar();
return true;
};
};
var paste = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
pluginState.closeFloatingToolbar();
return true;
};
};
var emptyCells = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
if (!pluginState.cellSelection) {
return false;
}
pluginState.resetHoverSelection();
pluginState.emptySelectedCells();
var _a = state.selection.$head, pos = _a.pos, parentOffset = _a.parentOffset;
var newPos = pos - parentOffset;
pluginState.moveCursorInsideTableTo(newPos);
analytics_1.analyticsService.trackEvent('atlassian.editor.format.table.delete_content.keyboard');
return true;
};
};
var moveCursorBackward = function () {
return function (state, dispatch) {
var pluginState = _1.stateKey.getState(state);
var $cursor = state.selection.$cursor;
// if cursor is in the middle of a text node, do nothing
if (!$cursor || (pluginState.view ? !pluginState.view.endOfTextblock('backward', state) : $cursor.parentOffset > 0)) {
return false;
}
// find the node before the cursor
var before;
var cut;
if (!utils_1.isIsolating($cursor.parent)) {
for (var i = $cursor.depth - 1; !before && i >= 0; i--) {
if ($cursor.index(i) > 0) {
cut = $cursor.before(i + 1);
before = $cursor.node(i).child($cursor.index(i) - 1);
}
if (utils_1.isIsolating($cursor.node(i))) {
break;
}
}
}
// if the node before is not a table node - do nothing
if (!before || before.type !== state.schema.nodes.table) {
return false;
}
var tr = state.tr;
var lastCellPos = cut - 4;
// need to move cursor inside the table to be able to calculate table's offset
tr.setSelection(new prosemirror_1.TextSelection(state.doc.resolve(lastCellPos)));
var $from = tr.selection.$from;
var start = $from.start(-1);
var pos = start + $from.parent.nodeSize - 1;
// move cursor to the last cell
// it doesn't join node before (last cell) with node after (content after the cursor)
// due to ridiculous amount of PM code that would have been required to overwrite
dispatch(tr.setSelection(new prosemirror_1.TextSelection(state.doc.resolve(pos))));
return true;
};
};
exports.default = {
createTable: createTable,
goToNextCell: goToNextCell,
cut: cut,
copy: copy,
paste: paste,
moveCursorBackward: moveCursorBackward,
emptyCells: emptyCells
};
//# sourceMappingURL=commands.js.map