UNPKG

@atlaskit/editor-plugin-alignment

Version:

Alignment plugin for @atlaskit/editor-core

195 lines (192 loc) • 8.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isAlignable = exports.changeAlignmentTr = exports.changeAlignment = void 0; var _enums = require("@atlaskit/editor-common/analytics/types/enums"); var _commands = require("@atlaskit/editor-common/commands"); var _withAnalytics = require("@atlaskit/editor-common/withAnalytics"); var _state = require("@atlaskit/editor-prosemirror/state"); var _cellSelection = require("@atlaskit/editor-tables/cell-selection"); var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled"); /** * Iterates over the commands one after the other, * passes the tr through and dispatches the cumulated transaction */ function cascadeCommands(cmds) { return function (state, dispatch) { var baseTr = state.tr; var shouldDispatch = false; var onDispatchAction = function onDispatchAction(tr) { var selectionJSON = tr.selection.toJSON(); baseTr.setSelection(_state.Selection.fromJSON(baseTr.doc, selectionJSON)); tr.steps.forEach(function (st) { baseTr.step(st); }); shouldDispatch = true; }; cmds.forEach(function (cmd) { return cmd(state, onDispatchAction); }); if (dispatch && shouldDispatch) { dispatch(baseTr); return true; } return false; }; } var isAlignable = exports.isAlignable = function isAlignable(align) { return function (state, dispatch) { var _state$schema = state.schema, _state$schema$nodes = _state$schema.nodes, paragraph = _state$schema$nodes.paragraph, heading = _state$schema$nodes.heading, alignment = _state$schema.marks.alignment; if (!dispatch && state.selection instanceof _cellSelection.CellSelection && (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_improve_inp_batch_2')) { if (!align) { return false; } // toggleBlockMark returns the result of the last cell, rather than // combining results. Preserve that behavior without building a transaction. // CellSelection moves the head range first, leaving the rest in document // order. Compare both ends to find the final cell visited by forEachCell. var ranges = state.selection.ranges; var firstRange = ranges[0]; var lastRange = ranges[ranges.length - 1]; var lastCellRange = firstRange.$from.pos > lastRange.$from.pos ? firstRange : lastRange; var lastCell = lastCellRange.$from.parent; var _hasAlignableBlock = function hasAlignableBlock(parent) { for (var index = 0; index < parent.childCount; index++) { var node = parent.child(index); if (!node.isBlock) { continue; } if ((node.type === paragraph || node.type === heading) && parent.type.allowsMarkType(alignment)) { return true; } if (_hasAlignableBlock(node)) { return true; } } return false; }; return _hasAlignableBlock(lastCell); } return (0, _commands.toggleBlockMark)(alignment, function () { return !align ? undefined : align === 'start' ? false : { align: align }; }, [paragraph, heading])(state, dispatch); }; }; var changeBlockAlignmentWithAnalytics = function changeBlockAlignmentWithAnalytics(editorAnalyticsApi, align, inputMethod) { return function (state, dispatch) { var _state$schema2 = state.schema, _state$schema2$nodes = _state$schema2.nodes, paragraph = _state$schema2$nodes.paragraph, heading = _state$schema2$nodes.heading, alignment = _state$schema2.marks.alignment; return (0, _withAnalytics.withAnalytics)(editorAnalyticsApi, { eventType: _enums.EVENT_TYPE.TRACK, actionSubject: _enums.ACTION_SUBJECT.ALIGNMENT, action: _enums.ACTION.UPDATED, actionSubjectId: _enums.ACTION_SUBJECT_ID.TEXT, attributes: { alignmentType: align, inputMethod: inputMethod } })((0, _commands.toggleBlockMark)(alignment, function () { return !align ? undefined : align === 'start' ? false : { align: align }; }, [paragraph, heading]))(state, dispatch); }; }; var changeBlockAlignmentWithAnalyticsTr = function changeBlockAlignmentWithAnalyticsTr(api, align, inputMethod) { return function (_ref) { var tr = _ref.tr; var _tr$doc$type$schema = tr.doc.type.schema, _tr$doc$type$schema$n = _tr$doc$type$schema.nodes, paragraph = _tr$doc$type$schema$n.paragraph, heading = _tr$doc$type$schema$n.heading, alignment = _tr$doc$type$schema.marks.alignment; var alignmentApplied = (0, _commands.toggleBlockMarkNext)(alignment, function () { return !align ? undefined : align === 'start' ? false : { align: align }; }, [paragraph, heading])(tr); if (alignmentApplied) { var _api$analytics; api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.attachAnalyticsEvent({ eventType: _enums.EVENT_TYPE.TRACK, actionSubject: _enums.ACTION_SUBJECT.ALIGNMENT, action: _enums.ACTION.UPDATED, actionSubjectId: _enums.ACTION_SUBJECT_ID.TEXT, attributes: { alignmentType: align, inputMethod: inputMethod } })(tr); } return tr; }; }; var changeImageAlignmentWithAnalytics = function changeImageAlignmentWithAnalytics(editorAnalyticsApi, align, inputMethod) { return function (state, dispatch) { return (0, _withAnalytics.withAnalytics)(editorAnalyticsApi, { eventType: _enums.EVENT_TYPE.TRACK, actionSubject: _enums.ACTION_SUBJECT.ALIGNMENT, action: _enums.ACTION.UPDATED, actionSubjectId: _enums.ACTION_SUBJECT_ID.MEDIA_SINGLE, attributes: { alignmentType: align, inputMethod: inputMethod } })((0, _commands.changeImageAlignment)(align))(state, dispatch); }; }; var changeImageAlignmentWithAnalyticsTr = function changeImageAlignmentWithAnalyticsTr(api, align, inputMethod) { return function (_ref2) { var tr = _ref2.tr; var alignmentApplied = (0, _commands.changeImageAlignmentNext)(align)(tr); if (alignmentApplied) { var _api$analytics2; api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || _api$analytics2.actions.attachAnalyticsEvent({ eventType: _enums.EVENT_TYPE.TRACK, actionSubject: _enums.ACTION_SUBJECT.ALIGNMENT, action: _enums.ACTION.UPDATED, actionSubjectId: _enums.ACTION_SUBJECT_ID.MEDIA_SINGLE, attributes: { alignmentType: align, inputMethod: inputMethod } })(tr); } return tr; }; }; // eslint-disable-next-line @repo/internal/deprecations/deprecation-ticket-required /** * Command-based alignment used by the legacy primary/floating toolbars and alignment keymap. * The new toolbar uses changeAlignmentTr. * * @deprecated use changeAlignmentTr instead */ var changeAlignment = exports.changeAlignment = function changeAlignment(align, api, inputMethod) { return function (state, dispatch) { var _api$analytics3, _api$analytics4; return cascadeCommands([changeImageAlignmentWithAnalytics(api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions, align, inputMethod), changeBlockAlignmentWithAnalytics(api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions, align, inputMethod)])(state, dispatch); }; }; var changeAlignmentTr = exports.changeAlignmentTr = function changeAlignmentTr(api, align, inputMethod) { return function (_ref3) { var tr = _ref3.tr; changeBlockAlignmentWithAnalyticsTr(api, align, inputMethod)({ tr: tr }); changeImageAlignmentWithAnalyticsTr(api, align, inputMethod)({ tr: tr }); return tr; }; };