@atlaskit/editor-plugin-layout 10.8.1 → 10.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/layoutPlugin.js +2 -5
  3. package/dist/cjs/pm-plugins/actions.js +71 -67
  4. package/dist/cjs/pm-plugins/utils/layout-column-selection.js +56 -98
  5. package/dist/cjs/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  6. package/dist/cjs/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +10 -5
  7. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  8. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  9. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  10. package/dist/cjs/ui/LayoutColumnMenu/index.js +1 -1
  11. package/dist/cjs/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +4 -3
  12. package/dist/cjs/ui/toolbar.js +70 -11
  13. package/dist/es2019/layoutPlugin.js +3 -6
  14. package/dist/es2019/pm-plugins/actions.js +50 -51
  15. package/dist/es2019/pm-plugins/utils/layout-column-selection.js +54 -94
  16. package/dist/es2019/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  17. package/dist/es2019/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +11 -5
  18. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  19. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  20. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  21. package/dist/es2019/ui/LayoutColumnMenu/index.js +1 -1
  22. package/dist/es2019/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +6 -4
  23. package/dist/es2019/ui/toolbar.js +68 -11
  24. package/dist/esm/layoutPlugin.js +3 -6
  25. package/dist/esm/pm-plugins/actions.js +71 -67
  26. package/dist/esm/pm-plugins/utils/layout-column-selection.js +55 -97
  27. package/dist/esm/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  28. package/dist/esm/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +10 -5
  29. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  30. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  31. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  32. package/dist/esm/ui/LayoutColumnMenu/index.js +1 -1
  33. package/dist/esm/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +5 -4
  34. package/dist/esm/ui/toolbar.js +71 -12
  35. package/dist/types/layoutPluginType.d.ts +2 -2
  36. package/dist/types/pm-plugins/actions.d.ts +9 -1
  37. package/dist/types/pm-plugins/utils/layout-column-selection.d.ts +8 -7
  38. package/dist/types-ts4.5/layoutPluginType.d.ts +2 -2
  39. package/dist/types-ts4.5/pm-plugins/actions.d.ts +9 -1
  40. package/dist/types-ts4.5/pm-plugins/utils/layout-column-selection.d.ts +8 -7
  41. package/package.json +3 -3
@@ -1,123 +1,81 @@
1
- import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
2
- import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
3
- var isLayoutColumn = function isLayoutColumn(node) {
4
- return (node === null || node === void 0 ? void 0 : node.type.name) === 'layoutColumn';
1
+ import { findChildrenByType, findParentNodeOfType } from '@atlaskit/editor-prosemirror/utils';
2
+ var findLayoutSectionFromSelection = function findLayoutSectionFromSelection(selection) {
3
+ return findParentNodeOfType(selection.$from.doc.type.schema.nodes.layoutSection)(selection);
5
4
  };
6
- var isLayoutSection = function isLayoutSection(node) {
7
- return (node === null || node === void 0 ? void 0 : node.type.name) === 'layoutSection';
8
- };
9
- var getLayoutColumnIndexAtPos = function getLayoutColumnIndexAtPos($pos) {
10
- for (var depth = $pos.depth; depth > 0; depth--) {
11
- if (isLayoutColumn($pos.node(depth)) && isLayoutSection($pos.node(depth - 1))) {
12
- return $pos.index(depth - 1);
13
- }
14
- }
15
- return undefined;
16
- };
17
- var getLayoutSectionDepth = function getLayoutSectionDepth(selection) {
18
- var $from = selection.$from,
19
- $to = selection.$to;
20
- var sharedDepth = $from.sharedDepth($to.pos);
21
- for (var depth = sharedDepth; depth > 0; depth--) {
22
- if (isLayoutSection($from.node(depth))) {
23
- return depth;
24
- }
25
- }
26
- return undefined;
27
- };
28
- export var getSelectedLayoutColumns = function getSelectedLayoutColumns(selection) {
29
- if (!selection) {
30
- return undefined;
31
- }
32
- if (selection instanceof NodeSelection && isLayoutColumn(selection.node)) {
33
- var _$from = selection.$from;
34
- var _layoutSectionNode = _$from.parent;
35
- if (!isLayoutSection(_layoutSectionNode)) {
36
- return undefined;
37
- }
38
- var selectedColumnIndex = _$from.index(_$from.depth);
5
+ var findLayoutColumnsFromLayoutSection = function findLayoutColumnsFromLayoutSection(layoutSectionNode) {
6
+ var layoutSectionPos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
7
+ return findChildrenByType(layoutSectionNode, layoutSectionNode.type.schema.nodes.layoutColumn).map(function (_ref) {
8
+ var node = _ref.node,
9
+ pos = _ref.pos;
39
10
  return {
40
- layoutSectionNode: _layoutSectionNode,
41
- layoutSectionPos: _$from.before(_$from.depth),
42
- selectedColumnIndices: [selectedColumnIndex],
43
- selectedColumns: [{
44
- index: selectedColumnIndex,
45
- node: selection.node,
46
- pos: selection.from
47
- }]
11
+ node: node,
12
+ pos: pos + layoutSectionPos + 1
48
13
  };
49
- }
50
- if (selection.empty) {
51
- return undefined;
52
- }
53
- if (!editorExperiment('platform_editor_block_menu', true)) {
14
+ });
15
+ };
16
+ export var getSelectedLayoutColumnsFromSelection = function getSelectedLayoutColumnsFromSelection(selection) {
17
+ var layoutSection = findLayoutSectionFromSelection(selection);
18
+ if (!layoutSection) {
54
19
  return undefined;
55
20
  }
56
- var layoutSectionDepth = getLayoutSectionDepth(selection);
57
- if (layoutSectionDepth === undefined) {
21
+ var layoutSectionNode = layoutSection.node,
22
+ layoutSectionPos = layoutSection.pos;
23
+ var allLayoutColumns = findLayoutColumnsFromLayoutSection(layoutSectionNode, layoutSectionPos);
24
+ if (!allLayoutColumns.length) {
58
25
  return undefined;
59
26
  }
60
- var $from = selection.$from,
61
- $to = selection.$to;
62
- var layoutSectionNode = $from.node(layoutSectionDepth);
63
- var layoutSectionPos = $from.before(layoutSectionDepth);
64
- var selectedColumns = [];
65
- var invalidSelection = false;
66
- layoutSectionNode.forEach(function (column, offset, index) {
67
- var columnStart = layoutSectionPos + 1 + offset;
68
- var columnEnd = columnStart + column.nodeSize;
69
- var intersectsColumn = selection.from < columnEnd && selection.to > columnStart;
70
- if (!intersectsColumn) {
71
- return;
27
+ var startIndex = -1;
28
+ var endIndex = -1;
29
+ var selectedLayoutColumns = allLayoutColumns.filter(function (_ref2, index) {
30
+ var node = _ref2.node,
31
+ pos = _ref2.pos;
32
+ var isSelected = selection.from <= pos && selection.to >= pos + node.nodeSize;
33
+ if (isSelected) {
34
+ if (startIndex === -1) {
35
+ startIndex = index;
36
+ }
37
+ endIndex = index;
72
38
  }
73
- if (!isLayoutColumn(column)) {
74
- invalidSelection = true;
75
- return;
76
- }
77
- selectedColumns.push({
78
- index: index,
79
- node: column,
80
- pos: columnStart
81
- });
39
+ return isSelected;
82
40
  });
83
-
84
- // TextSelection inside a single column is normal text editing, not a selected column set.
85
- if (invalidSelection || selectedColumns.length < 2) {
41
+ return {
42
+ layoutSectionNode: layoutSectionNode,
43
+ layoutSectionPos: layoutSectionPos,
44
+ selectedLayoutColumns: selectedLayoutColumns,
45
+ startIndex: startIndex,
46
+ endIndex: endIndex
47
+ };
48
+ };
49
+ export var getAllLayoutColumnsFromSelection = function getAllLayoutColumnsFromSelection(selection) {
50
+ var layoutSection = findLayoutSectionFromSelection(selection);
51
+ if (!layoutSection) {
86
52
  return undefined;
87
53
  }
88
- var firstColumn = selectedColumns[0];
89
- var lastColumn = selectedColumns[selectedColumns.length - 1];
90
- var startColumnIndex = getLayoutColumnIndexAtPos($from);
91
- var endColumnIndex = getLayoutColumnIndexAtPos($to);
92
- if (startColumnIndex !== undefined && startColumnIndex !== firstColumn.index || endColumnIndex !== undefined && endColumnIndex !== lastColumn.index) {
54
+ var layoutColumns = findLayoutColumnsFromLayoutSection(layoutSection.node, layoutSection.pos);
55
+ if (!(layoutColumns !== null && layoutColumns !== void 0 && layoutColumns.length)) {
93
56
  return undefined;
94
57
  }
95
58
  return {
96
- layoutSectionNode: layoutSectionNode,
97
- layoutSectionPos: layoutSectionPos,
98
- selectedColumnIndices: selectedColumns.map(function (_ref) {
99
- var index = _ref.index;
100
- return index;
101
- }),
102
- selectedColumns: selectedColumns
59
+ layoutSectionNode: layoutSection.node,
60
+ layoutSectionPos: layoutSection.pos,
61
+ selectedLayoutColumns: layoutColumns,
62
+ startIndex: 0,
63
+ endIndex: layoutColumns.length - 1
103
64
  };
104
65
  };
105
- export var getLayoutSectionColumnCount = function getLayoutSectionColumnCount(layoutSection) {
106
- return (layoutSection === null || layoutSection === void 0 ? void 0 : layoutSection.type.name) === 'layoutSection' ? layoutSection.childCount : 0;
107
- };
108
66
  export var getLayoutColumnValign = function getLayoutColumnValign(layoutColumn) {
109
- var _ref2;
110
- return layoutColumn ? (_ref2 = layoutColumn.attrs.valign) !== null && _ref2 !== void 0 ? _ref2 : 'top' : undefined;
67
+ var _ref3;
68
+ return layoutColumn ? (_ref3 = layoutColumn.attrs.valign) !== null && _ref3 !== void 0 ? _ref3 : 'top' : undefined;
111
69
  };
112
70
  export var getLayoutColumnMenuAnchorPos = function getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle) {
113
71
  var _clickedSelectedColum, _selectedLayoutColumn;
114
- var selectedLayoutColumns = getSelectedLayoutColumns(selection);
72
+ var selectedLayoutColumns = getSelectedLayoutColumnsFromSelection(selection);
115
73
  if (!selectedLayoutColumns) {
116
74
  return undefined;
117
75
  }
118
- var clickedSelectedColumn = selectedLayoutColumns.selectedColumns.find(function (_ref3) {
119
- var pos = _ref3.pos;
76
+ var clickedSelectedColumn = selectedLayoutColumns.selectedLayoutColumns.find(function (_ref4) {
77
+ var pos = _ref4.pos;
120
78
  return pos === anchorPosFromHandle;
121
79
  });
122
- return (_clickedSelectedColum = clickedSelectedColumn === null || clickedSelectedColumn === void 0 ? void 0 : clickedSelectedColumn.pos) !== null && _clickedSelectedColum !== void 0 ? _clickedSelectedColum : (_selectedLayoutColumn = selectedLayoutColumns.selectedColumns[0]) === null || _selectedLayoutColumn === void 0 ? void 0 : _selectedLayoutColumn.pos;
80
+ return (_clickedSelectedColum = clickedSelectedColumn === null || clickedSelectedColumn === void 0 ? void 0 : clickedSelectedColumn.pos) !== null && _clickedSelectedColum !== void 0 ? _clickedSelectedColum : (_selectedLayoutColumn = selectedLayoutColumns.selectedLayoutColumns[0]) === null || _selectedLayoutColumn === void 0 ? void 0 : _selectedLayoutColumn.pos;
123
81
  };
@@ -28,7 +28,7 @@ var DeleteColumnDropdownItem = function DeleteColumnDropdownItem(_ref) {
28
28
  if (selectedLayoutColumns === undefined) {
29
29
  return null;
30
30
  }
31
- var selectedColumnCount = selectedLayoutColumns.selectedColumns.length;
31
+ var selectedColumnCount = selectedLayoutColumns.selectedLayoutColumns.length;
32
32
  return /*#__PURE__*/React.createElement(ToolbarDropdownItem, {
33
33
  onClick: onClick
34
34
  }, formatMessage(layoutMessages.deleteColumn, {
@@ -1,5 +1,6 @@
1
1
  import React, { useCallback, useMemo } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
3
4
  import { layoutMessages } from '@atlaskit/editor-common/messages';
4
5
  import { ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
5
6
  import { isDistributedUniformly } from '../../pm-plugins/utils/layout-column-distribution';
@@ -8,12 +9,16 @@ export var DistributeColumnsDropdownItem = function DistributeColumnsDropdownIte
8
9
  var api = _ref.api;
9
10
  var _useIntl = useIntl(),
10
11
  formatMessage = _useIntl.formatMessage;
11
- var selectedLayoutColumns = useSelectedLayoutColumns(api);
12
+ var selectedLayoutColumnsResult = useSelectedLayoutColumns(api);
13
+ var _ref2 = selectedLayoutColumnsResult !== null && selectedLayoutColumnsResult !== void 0 ? selectedLayoutColumnsResult : {},
14
+ selectedLayoutColumns = _ref2.selectedLayoutColumns;
12
15
  var handleClick = useCallback(function () {
13
16
  var _api$core;
14
17
  api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (props) {
15
18
  var _api$layout, _api$layout2;
16
- var tr = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.distributeLayoutColumns(props);
19
+ var tr = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.distributeLayoutColumns({
20
+ inputMethod: INPUT_METHOD.LAYOUT_COLUMN_MENU
21
+ })(props);
17
22
  if (!tr) {
18
23
  return null;
19
24
  }
@@ -26,15 +31,15 @@ export var DistributeColumnsDropdownItem = function DistributeColumnsDropdownIte
26
31
  });
27
32
  }, [api]);
28
33
  var isAlreadyUniform = useMemo(function () {
29
- if (!selectedLayoutColumns || selectedLayoutColumns.selectedColumns.length < 2) {
34
+ if (!selectedLayoutColumns || selectedLayoutColumns.length < 2) {
30
35
  return false;
31
36
  }
32
- var selectedWidths = selectedLayoutColumns.selectedColumns.map(function (col) {
37
+ var selectedWidths = selectedLayoutColumns.map(function (col) {
33
38
  return col.node.attrs.width;
34
39
  });
35
40
  return isDistributedUniformly(selectedWidths);
36
41
  }, [selectedLayoutColumns]);
37
- if (selectedLayoutColumns === undefined || selectedLayoutColumns.selectedColumns.length < 2) {
42
+ if (selectedLayoutColumns === undefined || selectedLayoutColumns.length < 2) {
38
43
  return null;
39
44
  }
40
45
  return /*#__PURE__*/React.createElement(ToolbarDropdownItem, {
@@ -3,7 +3,6 @@ import { useIntl } from 'react-intl';
3
3
  import { layoutMessages } from '@atlaskit/editor-common/messages';
4
4
  import { TableColumnAddLeftIcon, TableColumnAddRightIcon, ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
5
5
  import { getEffectiveMaxLayoutColumns } from '../../pm-plugins/actions';
6
- import { getLayoutSectionColumnCount } from '../../pm-plugins/utils/layout-column-selection';
7
6
  import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
8
7
  var INSERT_COLUMN_OPTIONS = {
9
8
  left: {
@@ -18,6 +17,7 @@ var INSERT_COLUMN_OPTIONS = {
18
17
  }
19
18
  };
20
19
  export var InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
20
+ var _selectedLayoutColumn, _selectedLayoutColumn2;
21
21
  var api = _ref.api,
22
22
  side = _ref.side;
23
23
  var _useIntl = useIntl(),
@@ -26,7 +26,7 @@ export var InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
26
26
  Icon = _INSERT_COLUMN_OPTION.Icon,
27
27
  label = _INSERT_COLUMN_OPTION.label;
28
28
  var selectedLayoutColumns = useSelectedLayoutColumns(api);
29
- var columnCount = getLayoutSectionColumnCount(selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.layoutSectionNode);
29
+ var columnCount = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 || (_selectedLayoutColumn2 = selectedLayoutColumns.layoutSectionNode) === null || _selectedLayoutColumn2 === void 0 ? void 0 : _selectedLayoutColumn2.childCount) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : 0;
30
30
  var maxColumnCount = getEffectiveMaxLayoutColumns();
31
31
  var canInsertColumn = selectedLayoutColumns !== undefined && columnCount < maxColumnCount;
32
32
  var onClick = useCallback(function () {
@@ -12,7 +12,7 @@ export var VerticalAlignDropdownItem = function VerticalAlignDropdownItem(_ref)
12
12
  var _useIntl = useIntl(),
13
13
  formatMessage = _useIntl.formatMessage;
14
14
  var selectedLayoutColumns = useSelectedLayoutColumns(api);
15
- var isSelected = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns.every(function (_ref2) {
15
+ var isSelected = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedLayoutColumns.every(function (_ref2) {
16
16
  var node = _ref2.node;
17
17
  return getLayoutColumnValign(node) === value;
18
18
  })) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : false;
@@ -12,7 +12,7 @@ export var VerticalAlignNestedMenu = function VerticalAlignNestedMenu(_ref) {
12
12
  formatMessage = _useIntl.formatMessage;
13
13
  var selectedLayoutColumns = useSelectedLayoutColumns(api);
14
14
  var currentValign = useMemo(function () {
15
- var selectedColumns = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns;
15
+ var selectedColumns = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedLayoutColumns;
16
16
  var firstColumn = selectedColumns === null || selectedColumns === void 0 ? void 0 : selectedColumns[0];
17
17
  var firstValign = getLayoutColumnValign(firstColumn === null || firstColumn === void 0 ? void 0 : firstColumn.node);
18
18
  if (!firstValign || !(selectedColumns !== null && selectedColumns !== void 0 && selectedColumns.every(function (_ref2) {
@@ -18,7 +18,7 @@ var TOOLBAR_MENU_SELECTOR = '[data-toolbar-component="menu"]';
18
18
  */
19
19
  var getLayoutColumnMenuTarget = function getLayoutColumnMenuTarget(editorView, selection, anchorPosFromHandle) {
20
20
  var _columnDomRef$parentE;
21
- var anchorPos = getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle);
21
+ var anchorPos = selection && getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle);
22
22
  if (anchorPos === undefined) {
23
23
  return null;
24
24
  }
@@ -1,8 +1,9 @@
1
1
  import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
2
- import { getSelectedLayoutColumns } from '../../pm-plugins/utils/layout-column-selection';
2
+ import { getSelectedLayoutColumnsFromSelection } from '../../pm-plugins/utils/layout-column-selection';
3
3
  export var useSelectedLayoutColumns = function useSelectedLayoutColumns(api) {
4
- return useSharedPluginStateWithSelector(api, ['selection'], function (states) {
5
- var _states$selectionStat;
6
- return getSelectedLayoutColumns((_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection);
4
+ return useSharedPluginStateWithSelector(api, ['selection'], function (_ref) {
5
+ var selectionState = _ref.selectionState;
6
+ var selectedLayoutColumns = (selectionState === null || selectionState === void 0 ? void 0 : selectionState.selection) && getSelectedLayoutColumnsFromSelection(selectionState.selection);
7
+ return selectedLayoutColumns !== null && selectedLayoutColumns !== void 0 && selectedLayoutColumns.selectedLayoutColumns.length ? selectedLayoutColumns : undefined;
7
8
  });
8
9
  };
@@ -16,8 +16,11 @@ import LayoutThreeColumnsSidebarsIcon from '@atlaskit/icon/core/layout-three-col
16
16
  import LayoutTwoColumnsIcon from '@atlaskit/icon/core/layout-two-columns';
17
17
  import LayoutTwoColumnsSidebarLeftIcon from '@atlaskit/icon/core/layout-two-columns-sidebar-left';
18
18
  import LayoutTwoColumnsSidebarRightIcon from '@atlaskit/icon/core/layout-two-columns-sidebar-right';
19
+ import TableColumnsDistributeIcon from '@atlaskit/icon/core/table-columns-distribute';
20
+ import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
19
21
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
20
- import { deleteActiveLayoutNode, getPresetLayout, setPresetLayout } from '../pm-plugins/actions';
22
+ import { deleteActiveLayoutNode, distributeLayoutColumns, getPresetLayout, setPresetLayout } from '../pm-plugins/actions';
23
+ import { isDistributedUniformly } from '../pm-plugins/utils/layout-column-distribution';
21
24
  import { EditorLayoutFiveColumnsIcon, EditorLayoutFourColumnsIcon } from './icons/LayoutColumnsIcon';
22
25
  import { LayoutThreeWithLeftSidebarsIcon } from './icons/LayoutThreeWithLeftSidebars';
23
26
  import { LayoutThreeWithRightSidebarsIcon } from './icons/LayoutThreeWithRightSidebars';
@@ -56,7 +59,7 @@ var SIDEBAR_LAYOUT_TYPES = [{
56
59
  }];
57
60
 
58
61
  // These are used for advanced layout options
59
- var LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
62
+ var LAYOUT_WITH_TWO_COL_DISTRIBUTION_OLD = [{
60
63
  id: 'editor.layout.twoEquals',
61
64
  type: 'two_equal',
62
65
  title: toolbarMessages.twoColumns,
@@ -72,7 +75,7 @@ var LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
72
75
  title: toolbarMessages.leftSidebar,
73
76
  icon: LayoutTwoColumnsSidebarLeftIcon
74
77
  }];
75
- var LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
78
+ var LAYOUT_WITH_THREE_COL_DISTRIBUTION_OLD = [{
76
79
  id: 'editor.layout.threeEquals',
77
80
  type: 'three_equal',
78
81
  title: toolbarMessages.threeColumns,
@@ -95,6 +98,35 @@ var LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
95
98
  icon: LayoutThreeWithLeftSidebarsIcon,
96
99
  iconFallback: LayoutThreeWithLeftSidebarsIcon
97
100
  }];
101
+ var LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
102
+ id: 'editor.layout.twoRightSidebar',
103
+ type: 'two_right_sidebar',
104
+ title: toolbarMessages.rightSidebar,
105
+ icon: LayoutTwoColumnsSidebarRightIcon
106
+ }, {
107
+ id: 'editor.layout.twoLeftSidebar',
108
+ type: 'two_left_sidebar',
109
+ title: toolbarMessages.leftSidebar,
110
+ icon: LayoutTwoColumnsSidebarLeftIcon
111
+ }];
112
+ var LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
113
+ id: 'editor.layout.threeWithSidebars',
114
+ type: 'three_with_sidebars',
115
+ title: toolbarMessages.threeColumnsWithSidebars,
116
+ icon: LayoutThreeColumnsSidebarsIcon
117
+ }, {
118
+ id: 'editor.layout.threeRightSidebars',
119
+ type: 'three_right_sidebars',
120
+ title: toolbarMessages.threeColumnsWithRightSidebars,
121
+ icon: LayoutThreeWithRightSidebarsIcon,
122
+ iconFallback: LayoutThreeWithRightSidebarsIcon
123
+ }, {
124
+ id: 'editor.layout.threeLeftSidebars',
125
+ type: 'three_left_sidebars',
126
+ title: toolbarMessages.threeColumnsWithLeftSidebars,
127
+ icon: LayoutThreeWithLeftSidebarsIcon,
128
+ iconFallback: LayoutThreeWithLeftSidebarsIcon
129
+ }];
98
130
  var buildLayoutButton = function buildLayoutButton(intl, item, currentLayout, editorAnalyticsAPI) {
99
131
  return {
100
132
  id: item.id,
@@ -109,7 +141,9 @@ var buildLayoutButton = function buildLayoutButton(intl, item, currentLayout, ed
109
141
  };
110
142
  };
111
143
  export var layoutToolbarTitle = 'Layout floating controls';
112
- var iconPlaceholder = LayoutTwoColumnsIcon; // TODO: ED-25466 - Replace with proper icon
144
+ var iconPlaceholder = /*#__PURE__*/React.createElement(LayoutTwoColumnsIcon, {
145
+ label: ""
146
+ }); // TODO: ED-25466 - Replace with proper icon
113
147
 
114
148
  var getLayoutColumnsIcons = function getLayoutColumnsIcons(colCount) {
115
149
  if (!editorExperiment('single_column_layouts', true) && !editorExperiment('platform_editor_controls', 'variant1')) {
@@ -136,11 +170,15 @@ var getLayoutColumnsIcons = function getLayoutColumnsIcons(colCount) {
136
170
  return undefined;
137
171
  }
138
172
  };
173
+ var getLayoutColumnWidths = function getLayoutColumnWidths(node) {
174
+ return node.children.map(function (child) {
175
+ return child.attrs.width;
176
+ });
177
+ };
139
178
  var getAdvancedLayoutItems = function getAdvancedLayoutItems(_ref) {
140
179
  var addSidebarLayouts = _ref.addSidebarLayouts,
141
180
  intl = _ref.intl,
142
181
  editorAnalyticsAPI = _ref.editorAnalyticsAPI,
143
- state = _ref.state,
144
182
  node = _ref.node,
145
183
  nodeType = _ref.nodeType,
146
184
  separator = _ref.separator,
@@ -148,7 +186,8 @@ var getAdvancedLayoutItems = function getAdvancedLayoutItems(_ref) {
148
186
  currentLayout = _ref.currentLayout,
149
187
  allowAdvancedSingleColumnLayout = _ref.allowAdvancedSingleColumnLayout;
150
188
  var numberOfColumns = node.content.childCount || 2;
151
- var distributionOptions = numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION : [];
189
+ var isLayoutColumnMenuEnabled = expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true);
190
+ var distributionOptions = isLayoutColumnMenuEnabled ? numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION : [] : numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION_OLD : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION_OLD : [];
152
191
  var columnOptions = [{
153
192
  title: intl.formatMessage(layoutMessages.columnOption, {
154
193
  count: 2
@@ -182,7 +221,7 @@ var getAdvancedLayoutItems = function getAdvancedLayoutItems(_ref) {
182
221
  onClick: setPresetLayout(editorAnalyticsAPI)('five_equal'),
183
222
  selected: numberOfColumns === 5
184
223
  }];
185
- var singleColumnOption = allowAdvancedSingleColumnLayout ? {
224
+ var dropdownOptions = [].concat(_toConsumableArray(allowAdvancedSingleColumnLayout ? [{
186
225
  title: intl.formatMessage(layoutMessages.columnOption, {
187
226
  count: 1
188
227
  }),
@@ -190,19 +229,40 @@ var getAdvancedLayoutItems = function getAdvancedLayoutItems(_ref) {
190
229
  icon: getLayoutColumnsIcons(1) || iconPlaceholder,
191
230
  onClick: setPresetLayout(editorAnalyticsAPI)('single'),
192
231
  selected: numberOfColumns === 1
193
- } : [];
232
+ }] : []), columnOptions);
233
+ var distributeColumnsButton = isLayoutColumnMenuEnabled && numberOfColumns > 1 ? {
234
+ disabled: isDistributedUniformly(getLayoutColumnWidths(node)),
235
+ icon: TableColumnsDistributeIcon,
236
+ onClick: function onClick(editorState, dispatch) {
237
+ var tr = distributeLayoutColumns({
238
+ editorAnalyticsAPI: editorAnalyticsAPI,
239
+ inputMethod: INPUT_METHOD.FLOATING_TB,
240
+ target: 'allColumns'
241
+ })({
242
+ tr: editorState.tr
243
+ });
244
+ if (!tr) {
245
+ return false;
246
+ }
247
+ dispatch === null || dispatch === void 0 || dispatch(tr);
248
+ return true;
249
+ },
250
+ testId: 'layout-distribute-columns',
251
+ title: intl.formatMessage(layoutMessages.distributeColumns),
252
+ type: 'button'
253
+ } : undefined;
194
254
  return [{
195
255
  type: 'dropdown',
196
256
  title: intl.formatMessage(layoutMessages.columnOption, {
197
257
  count: numberOfColumns
198
258
  }),
199
259
  //`${numberOfColumns}-columns`,
200
- options: [singleColumnOption, columnOptions].flat(),
260
+ options: dropdownOptions,
201
261
  showSelected: true,
202
262
  testId: 'column-options-button'
203
- }].concat(_toConsumableArray(distributionOptions.length > 0 ? [separator] : []), _toConsumableArray(addSidebarLayouts ? distributionOptions.map(function (i) {
263
+ }].concat(_toConsumableArray(distributionOptions.length > 0 || distributeColumnsButton ? [separator] : []), _toConsumableArray(addSidebarLayouts ? distributionOptions.map(function (i) {
204
264
  return buildLayoutButton(intl, i, currentLayout, editorAnalyticsAPI);
205
- }) : []));
265
+ }) : []), _toConsumableArray(distributeColumnsButton ? [distributeColumnsButton] : []));
206
266
  };
207
267
  var fullHeightSeparator = {
208
268
  type: 'separator',
@@ -291,7 +351,6 @@ export var buildToolbar = function buildToolbar(state, intl, pos, _allowBreakout
291
351
  addSidebarLayouts: addSidebarLayouts,
292
352
  intl: intl,
293
353
  editorAnalyticsAPI: editorAnalyticsAPI,
294
- state: state,
295
354
  nodeType: nodeType,
296
355
  node: node,
297
356
  separator: separator,
@@ -9,7 +9,7 @@ import type { SelectionPlugin } from '@atlaskit/editor-plugin-selection';
9
9
  import type { ToolbarPlugin } from '@atlaskit/editor-plugin-toolbar';
10
10
  import type { UiControlRegistryPlugin } from '@atlaskit/editor-plugin-ui-control-registry';
11
11
  import type { WidthPlugin } from '@atlaskit/editor-plugin-width';
12
- import type { deleteLayoutColumn, distributeLayoutColumns, InsertLayoutColumnSide, insertLayoutColumnsWithAnalytics, setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
12
+ import type { deleteLayoutColumn, createDistributeLayoutColumnsCommand, InsertLayoutColumnSide, insertLayoutColumnsWithAnalytics, setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
13
13
  import type { LayoutState } from './pm-plugins/types';
14
14
  import type { LayoutPluginOptions } from './types';
15
15
  export type LayoutPluginDependencies = [
@@ -30,7 +30,7 @@ export type LayoutPlugin = NextEditorPlugin<'layout', {
30
30
  };
31
31
  commands: {
32
32
  deleteLayoutColumn: ReturnType<typeof deleteLayoutColumn>;
33
- distributeLayoutColumns: ReturnType<typeof distributeLayoutColumns>;
33
+ distributeLayoutColumns: ReturnType<typeof createDistributeLayoutColumnsCommand>;
34
34
  insertLayoutColumn: (side: InsertLayoutColumnSide) => EditorCommand;
35
35
  setLayoutColumnValign: (valign: Parameters<typeof setLayoutColumnValign>[0]) => EditorCommand;
36
36
  toggleLayoutColumnMenu: typeof toggleLayoutColumnMenu;
@@ -5,6 +5,13 @@ import type { Command, EditorCommand, TOOLBAR_MENU_TYPE } from '@atlaskit/editor
5
5
  import type { Node } from '@atlaskit/editor-prosemirror/model';
6
6
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
7
7
  import type { Change, PresetLayout } from '../types';
8
+ export type DistributeLayoutColumnsOptions = {
9
+ inputMethod?: INPUT_METHOD.LAYOUT_COLUMN_MENU | INPUT_METHOD.FLOATING_TB;
10
+ target?: 'selectedColumns' | 'allColumns';
11
+ };
12
+ type DistributeLayoutColumnsActionOptions = DistributeLayoutColumnsOptions & {
13
+ editorAnalyticsAPI?: EditorAnalyticsAPI;
14
+ };
8
15
  export declare const ONE_COL_LAYOUTS: PresetLayout[];
9
16
  export declare const TWO_COL_LAYOUTS: PresetLayout[];
10
17
  export declare const THREE_COL_LAYOUTS: PresetLayout[];
@@ -35,7 +42,8 @@ export type InsertLayoutColumnSide = 'left' | 'right';
35
42
  export declare function getEffectiveMaxLayoutColumns(): number;
36
43
  export declare const insertLayoutColumn: (side: InsertLayoutColumnSide, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
37
44
  export declare const setLayoutColumnValign: (valign: Valign, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
38
- export declare const distributeLayoutColumns: (editorAnalyticsAPI?: EditorAnalyticsAPI, inputMethod?: INPUT_METHOD.LAYOUT_COLUMN_MENU | INPUT_METHOD.FLOATING_TB) => EditorCommand;
45
+ export declare const distributeLayoutColumns: ({ editorAnalyticsAPI, inputMethod, target, }?: DistributeLayoutColumnsActionOptions) => EditorCommand;
46
+ export declare const createDistributeLayoutColumnsCommand: (editorAnalyticsAPI?: EditorAnalyticsAPI) => (options?: DistributeLayoutColumnsOptions) => EditorCommand;
39
47
  export declare const toggleLayoutColumnMenu: ({ anchorPos, isOpen }: {
40
48
  anchorPos?: number;
41
49
  isOpen?: boolean;
@@ -1,18 +1,19 @@
1
1
  import type { Valign } from '@atlaskit/adf-schema/layout-column';
2
2
  import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
3
  import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
- export type SelectedLayoutColumn = {
5
- index: number;
4
+ type FoundNode = {
6
5
  node: PMNode;
7
6
  pos: number;
8
7
  };
9
8
  export type SelectedLayoutColumns = {
9
+ endIndex: number;
10
10
  layoutSectionNode: PMNode;
11
11
  layoutSectionPos: number;
12
- selectedColumnIndices: number[];
13
- selectedColumns: SelectedLayoutColumn[];
12
+ selectedLayoutColumns: FoundNode[];
13
+ startIndex: number;
14
14
  };
15
- export declare const getSelectedLayoutColumns: (selection: Selection | undefined) => SelectedLayoutColumns | undefined;
16
- export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
15
+ export declare const getSelectedLayoutColumnsFromSelection: (selection: Selection) => SelectedLayoutColumns | undefined;
16
+ export declare const getAllLayoutColumnsFromSelection: (selection: Selection) => SelectedLayoutColumns | undefined;
17
17
  export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
18
- export declare const getLayoutColumnMenuAnchorPos: (selection: Selection | undefined, anchorPosFromHandle?: number) => number | undefined;
18
+ export declare const getLayoutColumnMenuAnchorPos: (selection: Selection, anchorPosFromHandle?: number) => number | undefined;
19
+ export {};
@@ -9,7 +9,7 @@ import type { SelectionPlugin } from '@atlaskit/editor-plugin-selection';
9
9
  import type { ToolbarPlugin } from '@atlaskit/editor-plugin-toolbar';
10
10
  import type { UiControlRegistryPlugin } from '@atlaskit/editor-plugin-ui-control-registry';
11
11
  import type { WidthPlugin } from '@atlaskit/editor-plugin-width';
12
- import type { deleteLayoutColumn, distributeLayoutColumns, InsertLayoutColumnSide, insertLayoutColumnsWithAnalytics, setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
12
+ import type { deleteLayoutColumn, createDistributeLayoutColumnsCommand, InsertLayoutColumnSide, insertLayoutColumnsWithAnalytics, setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
13
13
  import type { LayoutState } from './pm-plugins/types';
14
14
  import type { LayoutPluginOptions } from './types';
15
15
  export type LayoutPluginDependencies = [
@@ -30,7 +30,7 @@ export type LayoutPlugin = NextEditorPlugin<'layout', {
30
30
  };
31
31
  commands: {
32
32
  deleteLayoutColumn: ReturnType<typeof deleteLayoutColumn>;
33
- distributeLayoutColumns: ReturnType<typeof distributeLayoutColumns>;
33
+ distributeLayoutColumns: ReturnType<typeof createDistributeLayoutColumnsCommand>;
34
34
  insertLayoutColumn: (side: InsertLayoutColumnSide) => EditorCommand;
35
35
  setLayoutColumnValign: (valign: Parameters<typeof setLayoutColumnValign>[0]) => EditorCommand;
36
36
  toggleLayoutColumnMenu: typeof toggleLayoutColumnMenu;
@@ -5,6 +5,13 @@ import type { Command, EditorCommand, TOOLBAR_MENU_TYPE } from '@atlaskit/editor
5
5
  import type { Node } from '@atlaskit/editor-prosemirror/model';
6
6
  import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
7
7
  import type { Change, PresetLayout } from '../types';
8
+ export type DistributeLayoutColumnsOptions = {
9
+ inputMethod?: INPUT_METHOD.LAYOUT_COLUMN_MENU | INPUT_METHOD.FLOATING_TB;
10
+ target?: 'selectedColumns' | 'allColumns';
11
+ };
12
+ type DistributeLayoutColumnsActionOptions = DistributeLayoutColumnsOptions & {
13
+ editorAnalyticsAPI?: EditorAnalyticsAPI;
14
+ };
8
15
  export declare const ONE_COL_LAYOUTS: PresetLayout[];
9
16
  export declare const TWO_COL_LAYOUTS: PresetLayout[];
10
17
  export declare const THREE_COL_LAYOUTS: PresetLayout[];
@@ -35,7 +42,8 @@ export type InsertLayoutColumnSide = 'left' | 'right';
35
42
  export declare function getEffectiveMaxLayoutColumns(): number;
36
43
  export declare const insertLayoutColumn: (side: InsertLayoutColumnSide, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
37
44
  export declare const setLayoutColumnValign: (valign: Valign, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
38
- export declare const distributeLayoutColumns: (editorAnalyticsAPI?: EditorAnalyticsAPI, inputMethod?: INPUT_METHOD.LAYOUT_COLUMN_MENU | INPUT_METHOD.FLOATING_TB) => EditorCommand;
45
+ export declare const distributeLayoutColumns: ({ editorAnalyticsAPI, inputMethod, target, }?: DistributeLayoutColumnsActionOptions) => EditorCommand;
46
+ export declare const createDistributeLayoutColumnsCommand: (editorAnalyticsAPI?: EditorAnalyticsAPI) => (options?: DistributeLayoutColumnsOptions) => EditorCommand;
39
47
  export declare const toggleLayoutColumnMenu: ({ anchorPos, isOpen }: {
40
48
  anchorPos?: number;
41
49
  isOpen?: boolean;
@@ -1,18 +1,19 @@
1
1
  import type { Valign } from '@atlaskit/adf-schema/layout-column';
2
2
  import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
3
  import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
- export type SelectedLayoutColumn = {
5
- index: number;
4
+ type FoundNode = {
6
5
  node: PMNode;
7
6
  pos: number;
8
7
  };
9
8
  export type SelectedLayoutColumns = {
9
+ endIndex: number;
10
10
  layoutSectionNode: PMNode;
11
11
  layoutSectionPos: number;
12
- selectedColumnIndices: number[];
13
- selectedColumns: SelectedLayoutColumn[];
12
+ selectedLayoutColumns: FoundNode[];
13
+ startIndex: number;
14
14
  };
15
- export declare const getSelectedLayoutColumns: (selection: Selection | undefined) => SelectedLayoutColumns | undefined;
16
- export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
15
+ export declare const getSelectedLayoutColumnsFromSelection: (selection: Selection) => SelectedLayoutColumns | undefined;
16
+ export declare const getAllLayoutColumnsFromSelection: (selection: Selection) => SelectedLayoutColumns | undefined;
17
17
  export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
18
- export declare const getLayoutColumnMenuAnchorPos: (selection: Selection | undefined, anchorPosFromHandle?: number) => number | undefined;
18
+ export declare const getLayoutColumnMenuAnchorPos: (selection: Selection, anchorPosFromHandle?: number) => number | undefined;
19
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-layout",
3
- "version": "10.8.1",
3
+ "version": "10.9.0",
4
4
  "description": "Layout plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -43,7 +43,7 @@
43
43
  "@atlaskit/editor-plugin-width": "^11.1.0",
44
44
  "@atlaskit/editor-prosemirror": "^7.3.0",
45
45
  "@atlaskit/editor-shared-styles": "^3.11.0",
46
- "@atlaskit/editor-toolbar": "^1.8.0",
46
+ "@atlaskit/editor-toolbar": "^1.9.0",
47
47
  "@atlaskit/editor-ui-control-model": "^1.2.0",
48
48
  "@atlaskit/icon": "^35.3.0",
49
49
  "@atlaskit/icon-lab": "^6.12.0",
@@ -55,7 +55,7 @@
55
55
  "bind-event-listener": "^3.0.0"
56
56
  },
57
57
  "peerDependencies": {
58
- "@atlaskit/editor-common": "^114.50.0",
58
+ "@atlaskit/editor-common": "^114.51.0",
59
59
  "react": "^18.2.0",
60
60
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
61
61
  },