@atlaskit/editor-plugin-layout
Version:
Layout plugin for @atlaskit/editor-core
409 lines (406 loc) • 22 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.selectIntoLayoutSection = exports.layoutPlugin = void 0;
var _react = _interopRequireDefault(require("react"));
var _adfSchema = require("@atlaskit/adf-schema");
var _schema = require("@atlaskit/adf-schema/schema");
var _analytics = require("@atlaskit/editor-common/analytics");
var _blockMenu = require("@atlaskit/editor-common/block-menu");
var _messages = require("@atlaskit/editor-common/messages");
var _quickInsert = require("@atlaskit/editor-common/quick-insert");
var _state = require("@atlaskit/editor-prosemirror/state");
var _utils = require("@atlaskit/editor-prosemirror/utils");
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
var _actions = require("./pm-plugins/actions");
var _keymap = _interopRequireDefault(require("./pm-plugins/keymap"));
var _main = _interopRequireDefault(require("./pm-plugins/main"));
var _pluginKey = require("./pm-plugins/plugin-key");
var _resizing = _interopRequireDefault(require("./pm-plugins/resizing"));
var _globalStyles = require("./ui/global-styles");
var _LayoutBlockMenuItem = require("./ui/LayoutBlockMenuItem");
var _LayoutColumnMenu = require("./ui/LayoutColumnMenu");
var _components = require("./ui/LayoutColumnMenu/components");
var _toolbar = require("./ui/toolbar");
var LAYOUT_SECTION_NODE_NAME = 'layoutSection';
/**
* This function is used to set the selection into
* the first paragraph of the first column of a layout section.
* This function is only intended to be used after inserting a new layout section.
* @param tr - transaction
* @returns - transaction with the selection set to the first paragraph of the first column
*/
var selectIntoLayoutSection = exports.selectIntoLayoutSection = function selectIntoLayoutSection(tr) {
var _nodeWithPos$node$fir;
if (!(0, _experiments.editorExperiment)('single_column_layouts', true)) {
return tr;
}
var _tr$doc$type$schema$n = tr.doc.type.schema.nodes,
layoutSection = _tr$doc$type$schema$n.layoutSection,
paragraph = _tr$doc$type$schema$n.paragraph;
var nodeWithPos = (0, _utils.findParentNode)(function (node) {
return node.type === layoutSection;
})(tr.selection);
if (!nodeWithPos || !nodeWithPos.node || nodeWithPos.node.type.name !== 'layoutSection' || ((_nodeWithPos$node$fir = nodeWithPos.node.firstChild) === null || _nodeWithPos$node$fir === void 0 || (_nodeWithPos$node$fir = _nodeWithPos$node$fir.firstChild) === null || _nodeWithPos$node$fir === void 0 ? void 0 : _nodeWithPos$node$fir.type) !== paragraph) {
return tr;
}
// set text selection at the beginning of the layout section
// will set the selection to the first column
tr.setSelection(_state.TextSelection.create(tr.doc, nodeWithPos.pos));
return tr;
};
var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
var _api$analytics2;
var _ref$config = _ref.config,
options = _ref$config === void 0 ? {} : _ref$config,
api = _ref.api;
var allowAdvancedSingleColumnLayout = (0, _experiments.editorExperiment)('advanced_layouts', true) && (0, _experiments.editorExperiment)('single_column_layouts', true, {
exposure: true
});
if ((0, _experiments.editorExperiment)('platform_editor_block_menu', true)) {
var _api$blockMenu;
api === null || api === void 0 || (_api$blockMenu = api.blockMenu) === null || _api$blockMenu === void 0 || _api$blockMenu.actions.registerBlockMenuComponents([{
type: 'block-menu-item',
key: _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key,
parent: {
type: 'block-menu-section',
key: _blockMenu.TRANSFORM_STRUCTURE_MENU_SECTION.key,
rank: _blockMenu.TRANSFORM_STRUCTURE_MENU_SECTION_RANK[_blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key]
},
component: (0, _LayoutBlockMenuItem.createLayoutBlockMenuItem)(api),
isHidden: function isHidden() {
var _api$blockMenu2;
return Boolean(api === null || api === void 0 || (_api$blockMenu2 = api.blockMenu) === null || _api$blockMenu2 === void 0 ? void 0 : _api$blockMenu2.actions.isTransformOptionDisabled(LAYOUT_SECTION_NODE_NAME));
}
}]);
}
if ((0, _expValEquals.expValEquals)('platform_editor_layout_column_menu', 'isEnabled', true)) {
var _api$uiControlRegistr;
api === null || api === void 0 || (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 || _api$uiControlRegistr.actions.register((0, _components.getLayoutColumnMenuComponents)({
api: api
}));
}
return {
name: 'layout',
nodes: function nodes() {
return [{
name: 'layoutSection',
node: (0, _experiments.editorExperiment)('advanced_layouts', true) ? (0, _platformFeatureFlags.fg)('platform_editor_adf_with_localid') ? _schema.layoutSectionWithSingleColumnLocalId : _schema.layoutSectionWithSingleColumn : (0, _platformFeatureFlags.fg)('platform_editor_adf_with_localid') ? _adfSchema.layoutSectionWithLocalId : _adfSchema.layoutSection
}, {
name: 'layoutColumn',
node: (0, _platformFeatureFlags.fg)('platform_editor_adf_with_localid') ? _adfSchema.layoutColumnWithLocalId : _adfSchema.layoutColumn
}];
},
pmPlugins: function pmPlugins() {
var plugins = [{
name: 'layout',
plugin: function plugin() {
var _api$analytics;
return (0, _main.default)(options, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions);
}
}];
if ((0, _expValEquals.expValEquals)('platform_editor_layout_column_menu', 'isEnabled', true)) {
plugins.push({
name: 'layoutKeymap',
plugin: function plugin() {
return (0, _keymap.default)({
api: api
});
}
});
}
if ((options.editorAppearance === 'full-page' || options.editorAppearance === 'full-width' || options.editorAppearance === 'max' && (0, _experiments.editorExperiment)('platform_editor_layout_column_resize_handle', true)) && api && (0, _experiments.editorExperiment)('advanced_layouts', true)) {
plugins.push({
name: 'layoutResizing',
plugin: function plugin(_ref2) {
var portalProviderAPI = _ref2.portalProviderAPI,
eventDispatcher = _ref2.eventDispatcher,
getIntl = _ref2.getIntl;
return (0, _resizing.default)(options, api, portalProviderAPI, eventDispatcher, getIntl());
}
});
}
return plugins;
},
actions: {
insertLayoutColumns: (0, _actions.insertLayoutColumnsWithAnalytics)(api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions)
},
pluginsOptions: {
floatingToolbar: function floatingToolbar(state, intl) {
var layoutState = _pluginKey.pluginKey.getState(state);
if (!layoutState) {
return undefined;
}
var pos = layoutState.pos,
allowBreakout = layoutState.allowBreakout,
addSidebarLayouts = layoutState.addSidebarLayouts,
allowSingleColumnLayout = layoutState.allowSingleColumnLayout,
isResizing = layoutState.isResizing;
var shouldHideToolbar = isResizing && (0, _experiments.editorExperiment)('single_column_layouts', true);
if (pos !== null && !shouldHideToolbar) {
return (0, _toolbar.buildToolbar)(state, intl, pos, allowBreakout, addSidebarLayouts, allowSingleColumnLayout, allowAdvancedSingleColumnLayout, api);
}
return undefined;
},
quickInsert: function quickInsert(_ref3) {
var formatMessage = _ref3.formatMessage;
var withInsertLayoutAnalytics = function withInsertLayoutAnalytics(tr, columnCount) {
var _api$analytics3;
api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 || (_api$analytics3 = _api$analytics3.actions) === null || _api$analytics3 === void 0 || _api$analytics3.attachAnalyticsEvent({
action: _analytics.ACTION.INSERTED,
actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT,
attributes: {
inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT,
columnCount: columnCount
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
return tr;
};
if ((0, _experiments.editorExperiment)('advanced_layouts', true)) {
var advancedSingleColumnOption = allowAdvancedSingleColumnLayout ? [{
id: 'onecolumnlayout',
title: formatMessage(_messages.layoutMessages.singleColumnAdvancedLayout),
description: formatMessage(_messages.toolbarInsertBlockMessages.singleColumnsDescriptionAdvancedLayout),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', 'single column'] : ['layout', 'column', 'section', 'single column'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconOneColumnLayout, null);
},
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, 1));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, 1);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
}] : [];
if ((0, _expValEquals.expValEquals)('platform_editor_layout_typeahead_reorder', 'isEnabled', true)) {
var createAdvancedColumnLayoutOption = function createAdvancedColumnLayoutOption(_ref4) {
var columnCount = _ref4.columnCount,
descriptionColumnCount = _ref4.descriptionColumnCount,
Icon = _ref4.icon,
id = _ref4.id,
keyword = _ref4.keyword,
title = _ref4.title;
return {
id: id,
title: title,
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescriptionAdvancedLayout, {
numberOfColumns: descriptionColumnCount
}),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', keyword] : ['layout', 'column', 'section', keyword],
priority: 1100,
icon: Icon,
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, columnCount));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, columnCount);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
};
};
return [createAdvancedColumnLayoutOption({
columnCount: 2,
descriptionColumnCount: 'two',
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconTwoColumnLayout, null);
},
id: 'twocolumnslayout',
keyword: 'two column',
title: formatMessage(_messages.layoutMessages.twoColumnsAdvancedLayout)
})].concat(advancedSingleColumnOption, [createAdvancedColumnLayoutOption({
columnCount: 3,
descriptionColumnCount: 'three',
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconThreeColumnLayout, null);
},
id: 'threecolumnslayout',
keyword: 'three column',
title: formatMessage(_messages.layoutMessages.threeColumnsAdvancedLayout)
}), createAdvancedColumnLayoutOption({
columnCount: 4,
descriptionColumnCount: 'four',
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconFourColumnLayout, null);
},
id: 'fourcolumnslayout',
keyword: 'four column',
title: formatMessage(_messages.layoutMessages.fourColumns)
}), createAdvancedColumnLayoutOption({
columnCount: 5,
descriptionColumnCount: 'five',
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconFiveColumnLayout, null);
},
id: 'fivecolumnslayout',
keyword: 'five column',
title: formatMessage(_messages.layoutMessages.fiveColumns)
})]);
}
return [].concat(advancedSingleColumnOption, [{
id: 'twocolumnslayout',
title: formatMessage(_messages.layoutMessages.twoColumnsAdvancedLayout),
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescriptionAdvancedLayout, {
numberOfColumns: 'two'
}),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', 'two column'] : ['layout', 'column', 'section', 'two column'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconTwoColumnLayout, null);
},
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, 2));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, 2);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
}, {
id: 'threecolumnslayout',
title: formatMessage(_messages.layoutMessages.threeColumnsAdvancedLayout),
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescriptionAdvancedLayout, {
numberOfColumns: 'three'
}),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', 'three column'] : ['layout', 'column', 'section', 'three column'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconThreeColumnLayout, null);
},
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, 3));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, 3);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
}, {
id: 'fourcolumnslayout',
title: formatMessage(_messages.layoutMessages.fourColumns),
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescriptionAdvancedLayout, {
numberOfColumns: 'four'
}),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', 'four column'] : ['layout', 'column', 'section', 'four column'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconFourColumnLayout, null);
},
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, 4));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, 4);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
}, {
id: 'fivecolumnslayout',
title: formatMessage(_messages.layoutMessages.fiveColumns),
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescriptionAdvancedLayout, {
numberOfColumns: 'five'
}),
keywords: (0, _expValEquals.expValEquals)('platform_editor_layout_keywords', 'isEnabled', true) ? ['layout', 'column', 'section', 'col', 'five column'] : ['layout', 'column', 'section', 'five column'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconFiveColumnLayout, null);
},
action: function action(insert, state) {
var tr = insert((0, _actions.createMultiColumnLayoutSection)(state, 5));
if ((0, _platformFeatureFlags.fg)('platform_editor_column_count_analytics')) {
withInsertLayoutAnalytics(tr, 5);
} else {
withInsertLayoutAnalytics(tr);
}
selectIntoLayoutSection(tr);
return tr;
}
}]);
} else {
return [{
id: 'layout',
title: formatMessage(_messages.toolbarInsertBlockMessages.columns),
description: formatMessage(_messages.toolbarInsertBlockMessages.columnsDescription),
keywords: ['column', 'section'],
priority: 1100,
icon: function icon() {
return /*#__PURE__*/_react.default.createElement(_quickInsert.IconLayout, null);
},
action: function action(insert, state) {
var _api$analytics4;
var tr = insert((0, _actions.createDefaultLayoutSection)(state));
api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 || (_api$analytics4 = _api$analytics4.actions) === null || _api$analytics4 === void 0 || _api$analytics4.attachAnalyticsEvent({
action: _analytics.ACTION.INSERTED,
actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT,
attributes: {
inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
},
eventType: _analytics.EVENT_TYPE.TRACK
})(tr);
return tr;
}
}];
}
}
},
contentComponent: function contentComponent(_ref5) {
var editorView = _ref5.editorView,
popupsMountPoint = _ref5.popupsMountPoint,
popupsBoundariesElement = _ref5.popupsBoundariesElement,
popupsScrollableElement = _ref5.popupsScrollableElement;
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _experiments.editorExperiment)('advanced_layouts', true) ? /*#__PURE__*/_react.default.createElement(_globalStyles.GlobalStylesWrapper, null) : null, (0, _expValEquals.expValEquals)('platform_editor_layout_column_menu', 'isEnabled', true) && editorView ? /*#__PURE__*/_react.default.createElement(_LayoutColumnMenu.LayoutColumnMenu, {
api: api,
editorView: editorView,
mountTo: popupsMountPoint,
boundariesElement: popupsBoundariesElement,
scrollableElement: popupsScrollableElement
}) : null);
},
getSharedState: function getSharedState(editorState) {
if (!editorState) {
return undefined;
}
return _pluginKey.pluginKey.getState(editorState);
},
commands: {
deleteLayoutColumn: function deleteLayoutColumn(options) {
var _api$analytics5;
return (0, _actions.deleteLayoutColumn)(options, api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions, api);
},
distributeLayoutColumns: function distributeLayoutColumns(options) {
var _api$analytics6;
return (0, _actions.distributeLayoutColumns)(api === null || api === void 0 || (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 ? void 0 : _api$analytics6.actions, api)(options);
},
insertLayoutColumn: function insertLayoutColumn(options) {
var _api$analytics7;
return (0, _actions.insertLayoutColumn)(options, api === null || api === void 0 || (_api$analytics7 = api.analytics) === null || _api$analytics7 === void 0 ? void 0 : _api$analytics7.actions, api);
},
setLayoutColumnDangerPreview: _actions.setLayoutColumnDangerPreview,
setLayoutColumnValign: function setLayoutColumnValign(options) {
var _api$analytics8;
return (0, _actions.setLayoutColumnValign)(options, api === null || api === void 0 || (_api$analytics8 = api.analytics) === null || _api$analytics8 === void 0 ? void 0 : _api$analytics8.actions, api);
},
toggleLayoutColumnMenu: _actions.toggleLayoutColumnMenu
}
};
};