UNPKG

@atlaskit/editor-plugin-indentation

Version:

Indentation plugin for @atlaskit/editor-core

134 lines (128 loc) 4.97 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.removeIndentation = exports.isIndentationAllowed = exports.getOutdentCommand = exports.getIndentCommand = void 0; var _analytics = require("@atlaskit/editor-common/analytics"); var _commands = require("@atlaskit/editor-common/commands"); var _indentation = require("@atlaskit/editor-common/indentation"); var _getAttrsWithChangesRecorder = _interopRequireDefault(require("./getAttrsWithChangesRecorder")); var _utils = require("./utils"); var isIndentationAllowed = exports.isIndentationAllowed = function isIndentationAllowed(schema, node) { var _schema$nodes = schema.nodes, paragraph = _schema$nodes.paragraph, heading = _schema$nodes.heading, alignment = schema.marks.alignment; if ([paragraph, heading].indexOf(node.type) > -1) { if (alignment) { var hasAlignment = node.marks.filter(function (mark) { return mark.type === alignment; })[0]; return !hasAlignment; } return true; } return false; }; /** * Create new indentation command (Either indent or outdent depend of getArgsFn) * @param getNewIndentationAttrs Function to handle new indentation level */ function createIndentationCommand(getNewIndentationAttrs) { return function (state, dispatch) { var indentation = state.schema.marks.indentation; return (0, _commands.toggleBlockMark)(indentation, getNewIndentationAttrs, isIndentationAllowed)(state, dispatch); }; } function createIndentationCommandWithAnalytics(_ref) { var getNewIndentationAttrs = _ref.getNewIndentationAttrs, direction = _ref.direction, inputMethod = _ref.inputMethod, editorAnalyticsAPI = _ref.editorAnalyticsAPI; // Create a new getAttrs function to record the changes var _getAttrsWithChangesR = (0, _getAttrsWithChangesRecorder.default)(getNewIndentationAttrs, { direction: direction }), getAttrs = _getAttrsWithChangesR.getAttrs, getAndResetAttrsChanges = _getAttrsWithChangesR.getAndResetAttrsChanges; // Use new getAttrs wrapper var indentationCommand = createIndentationCommand(getAttrs); // Return a new command where we change dispatch for our analytics dispatch return function (state, dispatch) { return indentationCommand(state, (0, _utils.createAnalyticsDispatch)({ getAttrsChanges: getAndResetAttrsChanges, inputMethod: inputMethod, editorAnalyticsAPI: editorAnalyticsAPI, state: state, dispatch: dispatch })); }; } /** * Get new level for outdent * @param oldAttr Old attributes for the mark, undefined if the mark doesn't exit * @returns - undefined; No change required * - false; Remove the mark * - object; Update attributes */ var getIndentAttrs = function getIndentAttrs(oldAttr) { if (!oldAttr) { return { level: 1 }; // No mark exist, create a new one with level 1 } var level = oldAttr.level; if (level >= _indentation.MAX_INDENTATION_LEVEL) { return undefined; // Max indentation level reached, do nothing. } return { level: level + 1 }; // Otherwise, increase the level by one }; var getIndentCommand = exports.getIndentCommand = function getIndentCommand(editorAnalyticsAPI) { return function () { var inputMethod = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _analytics.INPUT_METHOD.KEYBOARD; return createIndentationCommandWithAnalytics({ getNewIndentationAttrs: getIndentAttrs, direction: _analytics.INDENT_DIRECTION.INDENT, inputMethod: inputMethod, editorAnalyticsAPI: editorAnalyticsAPI }); }; }; /** * Get new level for outdent * @param oldAttr Old attributes for the mark, undefined if the mark doesn't exit * @returns - undefined; No change required * - false; Remove the mark * - object; Update attributes */ var getOutdentAttrs = function getOutdentAttrs(oldAttr) { if (!oldAttr) { return undefined; // Do nothing; } var level = oldAttr.level; if (level <= 1) { return false; // Remove the mark } return { level: level - 1 }; // Decrease the level on other cases }; var getOutdentCommand = exports.getOutdentCommand = function getOutdentCommand(editorAnalyticsAPI) { return function () { var inputMethod = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _analytics.INPUT_METHOD.KEYBOARD; return createIndentationCommandWithAnalytics({ getNewIndentationAttrs: getOutdentAttrs, direction: _analytics.INDENT_DIRECTION.OUTDENT, inputMethod: inputMethod, editorAnalyticsAPI: editorAnalyticsAPI }); }; }; var removeIndentation = exports.removeIndentation = function removeIndentation(state, dispatch) { return (0, _commands.toggleBlockMark)(state.schema.marks.indentation, function () { return false; })(state, dispatch); };