@atlaskit/editor-plugin-layout 10.4.0 → 10.6.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 (52) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/layoutPlugin.js +96 -25
  3. package/dist/cjs/pm-plugins/actions.js +87 -64
  4. package/dist/cjs/pm-plugins/main.js +4 -2
  5. package/dist/cjs/pm-plugins/utils/layout-column-selection.js +128 -0
  6. package/dist/cjs/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +7 -4
  7. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +5 -6
  8. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +9 -7
  9. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +15 -6
  10. package/dist/cjs/ui/LayoutColumnMenu/index.js +17 -7
  11. package/dist/cjs/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +14 -0
  12. package/dist/es2019/layoutPlugin.js +80 -18
  13. package/dist/es2019/pm-plugins/actions.js +73 -58
  14. package/dist/es2019/pm-plugins/main.js +4 -2
  15. package/dist/es2019/pm-plugins/utils/layout-column-selection.js +118 -0
  16. package/dist/es2019/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +7 -4
  17. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +5 -6
  18. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +9 -6
  19. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +15 -5
  20. package/dist/es2019/ui/LayoutColumnMenu/index.js +16 -6
  21. package/dist/es2019/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +6 -0
  22. package/dist/esm/layoutPlugin.js +97 -26
  23. package/dist/esm/pm-plugins/actions.js +87 -64
  24. package/dist/esm/pm-plugins/main.js +4 -2
  25. package/dist/esm/pm-plugins/utils/layout-column-selection.js +122 -0
  26. package/dist/esm/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +7 -4
  27. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +5 -6
  28. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +10 -8
  29. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +15 -6
  30. package/dist/esm/ui/LayoutColumnMenu/index.js +17 -7
  31. package/dist/esm/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +8 -0
  32. package/dist/types/layoutPluginType.d.ts +1 -1
  33. package/dist/types/pm-plugins/actions.d.ts +3 -2
  34. package/dist/types/pm-plugins/types.d.ts +1 -0
  35. package/dist/types/pm-plugins/utils/layout-column-selection.d.ts +18 -0
  36. package/dist/types/ui/LayoutColumnMenu/useSelectedLayoutColumns.d.ts +4 -0
  37. package/dist/types-ts4.5/layoutPluginType.d.ts +1 -1
  38. package/dist/types-ts4.5/pm-plugins/actions.d.ts +3 -2
  39. package/dist/types-ts4.5/pm-plugins/types.d.ts +1 -0
  40. package/dist/types-ts4.5/pm-plugins/utils/layout-column-selection.d.ts +18 -0
  41. package/dist/types-ts4.5/ui/LayoutColumnMenu/useSelectedLayoutColumns.d.ts +4 -0
  42. package/package.json +5 -4
  43. package/dist/cjs/ui/LayoutColumnMenu/layoutColumnSelection.js +0 -21
  44. package/dist/cjs/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +0 -20
  45. package/dist/es2019/ui/LayoutColumnMenu/layoutColumnSelection.js +0 -9
  46. package/dist/es2019/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +0 -10
  47. package/dist/esm/ui/LayoutColumnMenu/layoutColumnSelection.js +0 -15
  48. package/dist/esm/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +0 -14
  49. package/dist/types/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +0 -7
  50. package/dist/types/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +0 -5
  51. package/dist/types-ts4.5/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +0 -7
  52. package/dist/types-ts4.5/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +0 -5
@@ -0,0 +1,122 @@
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';
5
+ };
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);
39
+ 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
+ }]
48
+ };
49
+ }
50
+ if (selection.empty) {
51
+ return undefined;
52
+ }
53
+ if (!editorExperiment('platform_editor_block_menu', true)) {
54
+ return undefined;
55
+ }
56
+ var layoutSectionDepth = getLayoutSectionDepth(selection);
57
+ if (layoutSectionDepth === undefined) {
58
+ return undefined;
59
+ }
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;
72
+ }
73
+ if (!isLayoutColumn(column)) {
74
+ invalidSelection = true;
75
+ return;
76
+ }
77
+ selectedColumns.push({
78
+ index: index,
79
+ node: column,
80
+ pos: columnStart
81
+ });
82
+ });
83
+
84
+ // TextSelection inside a single column is normal text editing, not a selected column set.
85
+ if (invalidSelection || selectedColumns.length < 2) {
86
+ return undefined;
87
+ }
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) {
93
+ return undefined;
94
+ }
95
+ 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
103
+ };
104
+ };
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
+ export var getLayoutColumnValign = function getLayoutColumnValign(layoutColumn) {
109
+ return layoutColumn === null || layoutColumn === void 0 ? void 0 : layoutColumn.attrs.valign;
110
+ };
111
+ export var getLayoutColumnMenuAnchorPos = function getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle) {
112
+ var _clickedSelectedColum, _selectedLayoutColumn;
113
+ var selectedLayoutColumns = getSelectedLayoutColumns(selection);
114
+ if (!selectedLayoutColumns) {
115
+ return undefined;
116
+ }
117
+ var clickedSelectedColumn = selectedLayoutColumns.selectedColumns.find(function (_ref2) {
118
+ var pos = _ref2.pos;
119
+ return pos === anchorPosFromHandle;
120
+ });
121
+ 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;
122
+ };
@@ -2,12 +2,12 @@ import React, { useCallback } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
3
  import { layoutMessages } from '@atlaskit/editor-common/messages';
4
4
  import { ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
5
- import { useCurrentLayoutColumn } from './useCurrentLayoutColumn';
5
+ import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
6
6
  var DeleteColumnDropdownItem = function DeleteColumnDropdownItem(_ref) {
7
7
  var api = _ref.api;
8
8
  var _useIntl = useIntl(),
9
9
  formatMessage = _useIntl.formatMessage;
10
- var currentColumn = useCurrentLayoutColumn(api);
10
+ var selectedLayoutColumns = useSelectedLayoutColumns(api);
11
11
  var onClick = useCallback(function () {
12
12
  var _api$layout, _api$core;
13
13
  var deleteCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.deleteLayoutColumn;
@@ -25,11 +25,14 @@ var DeleteColumnDropdownItem = function DeleteColumnDropdownItem(_ref) {
25
25
  return tr;
26
26
  });
27
27
  }, [api]);
28
- if (currentColumn === undefined) {
28
+ if (selectedLayoutColumns === undefined) {
29
29
  return null;
30
30
  }
31
+ var selectedColumnCount = selectedLayoutColumns.selectedColumns.length;
31
32
  return /*#__PURE__*/React.createElement(ToolbarDropdownItem, {
32
33
  onClick: onClick
33
- }, formatMessage(layoutMessages.deleteColumn));
34
+ }, formatMessage(layoutMessages.deleteColumn, {
35
+ count: selectedColumnCount
36
+ }));
34
37
  };
35
38
  export { DeleteColumnDropdownItem };
@@ -3,8 +3,8 @@ 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 './layoutColumnSelection';
7
- import { useCurrentLayoutColumn, useCurrentLayoutSection } from './useCurrentLayoutColumn';
6
+ import { getLayoutSectionColumnCount } from '../../pm-plugins/utils/layout-column-selection';
7
+ import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
8
8
  var INSERT_COLUMN_OPTIONS = {
9
9
  left: {
10
10
  Icon: TableColumnAddLeftIcon,
@@ -25,11 +25,10 @@ export var InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
25
25
  var _INSERT_COLUMN_OPTION = INSERT_COLUMN_OPTIONS[side],
26
26
  Icon = _INSERT_COLUMN_OPTION.Icon,
27
27
  label = _INSERT_COLUMN_OPTION.label;
28
- var currentColumn = useCurrentLayoutColumn(api);
29
- var currentLayoutSection = useCurrentLayoutSection(api);
30
- var columnCount = getLayoutSectionColumnCount(currentLayoutSection);
28
+ var selectedLayoutColumns = useSelectedLayoutColumns(api);
29
+ var columnCount = getLayoutSectionColumnCount(selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.layoutSectionNode);
31
30
  var maxColumnCount = getEffectiveMaxLayoutColumns();
32
- var canInsertColumn = currentColumn !== undefined && columnCount < maxColumnCount;
31
+ var canInsertColumn = selectedLayoutColumns !== undefined && columnCount < maxColumnCount;
33
32
  var onClick = useCallback(function () {
34
33
  var _api$layout, _api$core;
35
34
  var insertCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.insertLayoutColumn(side);
@@ -1,19 +1,21 @@
1
- import React, { useCallback, useMemo } from 'react';
1
+ import React, { useCallback } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
3
  import { ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
4
- import { getLayoutColumnValign } from './layoutColumnSelection';
5
- import { useCurrentLayoutColumn } from './useCurrentLayoutColumn';
4
+ import { getLayoutColumnValign } from '../../pm-plugins/utils/layout-column-selection';
5
+ import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
6
6
  import { VERTICAL_ALIGN_ICONS } from './verticalAlignIcons';
7
7
  export var VerticalAlignDropdownItem = function VerticalAlignDropdownItem(_ref) {
8
+ var _selectedLayoutColumn;
8
9
  var api = _ref.api,
9
10
  label = _ref.label,
10
11
  value = _ref.value;
11
12
  var _useIntl = useIntl(),
12
13
  formatMessage = _useIntl.formatMessage;
13
- var currentColumn = useCurrentLayoutColumn(api);
14
- var currentValign = useMemo(function () {
15
- return getLayoutColumnValign(currentColumn);
16
- }, [currentColumn]);
14
+ var selectedLayoutColumns = useSelectedLayoutColumns(api);
15
+ var isSelected = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns.every(function (_ref2) {
16
+ var node = _ref2.node;
17
+ return getLayoutColumnValign(node) === value;
18
+ })) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : false;
17
19
  var Icon = VERTICAL_ALIGN_ICONS[value];
18
20
  var onClick = useCallback(function () {
19
21
  var _api$core, _api$layout;
@@ -24,7 +26,7 @@ export var VerticalAlignDropdownItem = function VerticalAlignDropdownItem(_ref)
24
26
  label: "",
25
27
  size: "small"
26
28
  }),
27
- isSelected: currentValign === value,
29
+ isSelected: isSelected,
28
30
  onClick: onClick
29
31
  }, formatMessage(label));
30
32
  };
@@ -2,20 +2,29 @@ import React, { useMemo } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
3
  import { layoutMessages } from '@atlaskit/editor-common/messages';
4
4
  import { LayoutIcon, NestedDropdownRightIcon, ToolbarNestedDropdownMenu } from '@atlaskit/editor-toolbar';
5
- import { getLayoutColumnValign } from './layoutColumnSelection';
6
- import { useCurrentLayoutColumn } from './useCurrentLayoutColumn';
5
+ import { getLayoutColumnValign } from '../../pm-plugins/utils/layout-column-selection';
6
+ import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
7
7
  import { VERTICAL_ALIGN_ICONS } from './verticalAlignIcons';
8
8
  export var VerticalAlignNestedMenu = function VerticalAlignNestedMenu(_ref) {
9
9
  var api = _ref.api,
10
10
  children = _ref.children;
11
11
  var _useIntl = useIntl(),
12
12
  formatMessage = _useIntl.formatMessage;
13
- var currentColumn = useCurrentLayoutColumn(api);
13
+ var selectedLayoutColumns = useSelectedLayoutColumns(api);
14
14
  var currentValign = useMemo(function () {
15
- return getLayoutColumnValign(currentColumn);
16
- }, [currentColumn]);
15
+ var selectedColumns = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns;
16
+ var firstColumn = selectedColumns === null || selectedColumns === void 0 ? void 0 : selectedColumns[0];
17
+ var firstValign = getLayoutColumnValign(firstColumn === null || firstColumn === void 0 ? void 0 : firstColumn.node);
18
+ if (!firstValign || !(selectedColumns !== null && selectedColumns !== void 0 && selectedColumns.every(function (_ref2) {
19
+ var node = _ref2.node;
20
+ return getLayoutColumnValign(node) === firstValign;
21
+ }))) {
22
+ return undefined;
23
+ }
24
+ return firstValign;
25
+ }, [selectedLayoutColumns]);
17
26
  var TriggerIcon = currentValign ? VERTICAL_ALIGN_ICONS[currentValign] : LayoutIcon;
18
- if (!currentColumn) {
27
+ if (!selectedLayoutColumns) {
19
28
  return null;
20
29
  }
21
30
  return /*#__PURE__*/React.createElement(ToolbarNestedDropdownMenu, {
@@ -8,9 +8,9 @@ import { OutsideClickTargetRefContext, withReactEditorViewOuterListeners } from
8
8
  import { akEditorFloatingOverlapPanelZIndex } from '@atlaskit/editor-shared-styles';
9
9
  import { ToolbarDropdownMenuProvider } from '@atlaskit/editor-toolbar';
10
10
  import { SurfaceRenderer } from '@atlaskit/editor-ui-control-model';
11
+ import { getLayoutColumnMenuAnchorPos } from '../../pm-plugins/utils/layout-column-selection';
11
12
  import { LAYOUT_COLUMN_MENU_FALLBACKS } from './components';
12
13
  import { LAYOUT_COLUMN_MENU } from './keys';
13
- import { getLayoutColumnAtSelection } from './layoutColumnSelection';
14
14
  var PopupWithListeners = withReactEditorViewOuterListeners(Popup);
15
15
  var FALLBACK_MENU_HEIGHT = 300;
16
16
  var LAYOUT_COLUMN_MENU_POPUP_OFFSET = [0, 4];
@@ -18,12 +18,13 @@ var LAYOUT_COLUMN_MENU_POPUP_OFFSET = [0, 4];
18
18
  /**
19
19
  * Returns the drag handle button for the selected layout column.
20
20
  */
21
- var getLayoutColumnMenuTarget = function getLayoutColumnMenuTarget(editorView, selection) {
21
+ var getLayoutColumnMenuTarget = function getLayoutColumnMenuTarget(editorView, selection, anchorPosFromHandle) {
22
22
  var _columnDomRef$parentE;
23
- if (!getLayoutColumnAtSelection(selection) || (selection === null || selection === void 0 ? void 0 : selection.from) === undefined) {
23
+ var anchorPos = getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle);
24
+ if (anchorPos === undefined) {
24
25
  return null;
25
26
  }
26
- var columnDomRef = editorView.nodeDOM(selection.from);
27
+ var columnDomRef = editorView.nodeDOM(anchorPos);
27
28
  if (!(columnDomRef instanceof HTMLElement)) {
28
29
  return null;
29
30
  }
@@ -38,13 +39,15 @@ export var LayoutColumnMenu = /*#__PURE__*/React.memo(function LayoutColumnMenu(
38
39
  boundariesElement = _ref.boundariesElement,
39
40
  scrollableElement = _ref.scrollableElement;
40
41
  var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['layout', 'selection'], function (states) {
41
- var _states$layoutState$i, _states$layoutState, _states$selectionStat;
42
+ var _states$layoutState$i, _states$layoutState, _states$layoutState2, _states$selectionStat;
42
43
  return {
43
44
  isLayoutColumnMenuOpen: (_states$layoutState$i = (_states$layoutState = states.layoutState) === null || _states$layoutState === void 0 ? void 0 : _states$layoutState.isLayoutColumnMenuOpen) !== null && _states$layoutState$i !== void 0 ? _states$layoutState$i : false,
45
+ layoutColumnMenuAnchorPos: (_states$layoutState2 = states.layoutState) === null || _states$layoutState2 === void 0 ? void 0 : _states$layoutState2.layoutColumnMenuAnchorPos,
44
46
  selection: (_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection
45
47
  };
46
48
  }),
47
49
  isLayoutColumnMenuOpen = _useSharedPluginState.isLayoutColumnMenuOpen,
50
+ layoutColumnMenuAnchorPos = _useSharedPluginState.layoutColumnMenuAnchorPos,
48
51
  selection = _useSharedPluginState.selection;
49
52
  var setOutsideClickTargetRef = useContext(OutsideClickTargetRefContext);
50
53
  var menuRef = useRef(null);
@@ -74,6 +77,13 @@ export var LayoutColumnMenu = /*#__PURE__*/React.memo(function LayoutColumnMenu(
74
77
  if (event.target instanceof Element && event.target.closest('[data-toolbar-nested-dropdown-menu]')) {
75
78
  return;
76
79
  }
80
+
81
+ // Clicking a drag handle should let the drag handle's own click handler
82
+ // update selection/menu state. Treating it as a generic outside click
83
+ // races that transaction and can immediately close the layout column menu.
84
+ if (event.target instanceof Element && event.target.closest(DRAG_HANDLE_SELECTOR)) {
85
+ return;
86
+ }
77
87
  closeLayoutColumnMenu();
78
88
  }, [closeLayoutColumnMenu]);
79
89
  var handleSetIsOpen = useCallback(function (isOpen) {
@@ -90,8 +100,8 @@ export var LayoutColumnMenu = /*#__PURE__*/React.memo(function LayoutColumnMenu(
90
100
  }, [setOutsideClickTargetRef]);
91
101
  var components = (_api$uiControlRegistr = api === null || api === void 0 || (_api$uiControlRegistr2 = api.uiControlRegistry) === null || _api$uiControlRegistr2 === void 0 ? void 0 : _api$uiControlRegistr2.actions.getComponents(LAYOUT_COLUMN_MENU.key)) !== null && _api$uiControlRegistr !== void 0 ? _api$uiControlRegistr : [];
92
102
  var target = useMemo(function () {
93
- return isLayoutColumnMenuOpen ? getLayoutColumnMenuTarget(editorView, selection) : null;
94
- }, [editorView, isLayoutColumnMenuOpen, selection]);
103
+ return isLayoutColumnMenuOpen ? getLayoutColumnMenuTarget(editorView, selection, layoutColumnMenuAnchorPos) : null;
104
+ }, [editorView, isLayoutColumnMenuOpen, layoutColumnMenuAnchorPos, selection]);
95
105
  var hasValidTarget = target instanceof HTMLElement;
96
106
  useEffect(function () {
97
107
  if (isLayoutColumnMenuOpen && (!hasValidTarget || components.length === 0)) {
@@ -0,0 +1,8 @@
1
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
2
+ import { getSelectedLayoutColumns } from '../../pm-plugins/utils/layout-column-selection';
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);
7
+ });
8
+ };
@@ -31,7 +31,7 @@ export type LayoutPlugin = NextEditorPlugin<'layout', {
31
31
  commands: {
32
32
  deleteLayoutColumn: ReturnType<typeof deleteLayoutColumn>;
33
33
  insertLayoutColumn: (side: InsertLayoutColumnSide) => EditorCommand;
34
- setLayoutColumnValign: typeof setLayoutColumnValign;
34
+ setLayoutColumnValign: (valign: Parameters<typeof setLayoutColumnValign>[0]) => EditorCommand;
35
35
  toggleLayoutColumnMenu: typeof toggleLayoutColumnMenu;
36
36
  };
37
37
  dependencies: LayoutPluginDependencies;
@@ -33,8 +33,9 @@ export type InsertLayoutColumnSide = 'left' | 'right';
33
33
  */
34
34
  export declare function getEffectiveMaxLayoutColumns(): number;
35
35
  export declare const insertLayoutColumn: (side: InsertLayoutColumnSide, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
36
- export declare const setLayoutColumnValign: (valign: Valign) => EditorCommand;
37
- export declare const toggleLayoutColumnMenu: ({ isOpen }: {
36
+ export declare const setLayoutColumnValign: (valign: Valign, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
37
+ export declare const toggleLayoutColumnMenu: ({ anchorPos, isOpen }: {
38
+ anchorPos?: number;
38
39
  isOpen?: boolean;
39
40
  }) => EditorCommand;
40
41
  export declare const deleteLayoutColumn: (editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
@@ -6,6 +6,7 @@ export type LayoutState = {
6
6
  allowSingleColumnLayout: boolean;
7
7
  isLayoutColumnMenuOpen: boolean;
8
8
  isResizing: boolean;
9
+ layoutColumnMenuAnchorPos: number | undefined;
9
10
  pos: number | null;
10
11
  selectedLayout: PresetLayout | undefined;
11
12
  };
@@ -0,0 +1,18 @@
1
+ import type { Valign } from '@atlaskit/editor-common/types/valign';
2
+ import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
+ import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
+ export type SelectedLayoutColumn = {
5
+ index: number;
6
+ node: PMNode;
7
+ pos: number;
8
+ };
9
+ export type SelectedLayoutColumns = {
10
+ layoutSectionNode: PMNode;
11
+ layoutSectionPos: number;
12
+ selectedColumnIndices: number[];
13
+ selectedColumns: SelectedLayoutColumn[];
14
+ };
15
+ export declare const getSelectedLayoutColumns: (selection: Selection | undefined) => SelectedLayoutColumns | undefined;
16
+ export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
17
+ export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
18
+ export declare const getLayoutColumnMenuAnchorPos: (selection: Selection | undefined, anchorPosFromHandle?: number) => number | undefined;
@@ -0,0 +1,4 @@
1
+ import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
2
+ import type { LayoutPlugin } from '../../layoutPluginType';
3
+ import { type SelectedLayoutColumns } from '../../pm-plugins/utils/layout-column-selection';
4
+ export declare const useSelectedLayoutColumns: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => SelectedLayoutColumns | undefined;
@@ -31,7 +31,7 @@ export type LayoutPlugin = NextEditorPlugin<'layout', {
31
31
  commands: {
32
32
  deleteLayoutColumn: ReturnType<typeof deleteLayoutColumn>;
33
33
  insertLayoutColumn: (side: InsertLayoutColumnSide) => EditorCommand;
34
- setLayoutColumnValign: typeof setLayoutColumnValign;
34
+ setLayoutColumnValign: (valign: Parameters<typeof setLayoutColumnValign>[0]) => EditorCommand;
35
35
  toggleLayoutColumnMenu: typeof toggleLayoutColumnMenu;
36
36
  };
37
37
  dependencies: LayoutPluginDependencies;
@@ -33,8 +33,9 @@ export type InsertLayoutColumnSide = 'left' | 'right';
33
33
  */
34
34
  export declare function getEffectiveMaxLayoutColumns(): number;
35
35
  export declare const insertLayoutColumn: (side: InsertLayoutColumnSide, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
36
- export declare const setLayoutColumnValign: (valign: Valign) => EditorCommand;
37
- export declare const toggleLayoutColumnMenu: ({ isOpen }: {
36
+ export declare const setLayoutColumnValign: (valign: Valign, editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
37
+ export declare const toggleLayoutColumnMenu: ({ anchorPos, isOpen }: {
38
+ anchorPos?: number;
38
39
  isOpen?: boolean;
39
40
  }) => EditorCommand;
40
41
  export declare const deleteLayoutColumn: (editorAnalyticsAPI?: EditorAnalyticsAPI) => EditorCommand;
@@ -6,6 +6,7 @@ export type LayoutState = {
6
6
  allowSingleColumnLayout: boolean;
7
7
  isLayoutColumnMenuOpen: boolean;
8
8
  isResizing: boolean;
9
+ layoutColumnMenuAnchorPos: number | undefined;
9
10
  pos: number | null;
10
11
  selectedLayout: PresetLayout | undefined;
11
12
  };
@@ -0,0 +1,18 @@
1
+ import type { Valign } from '@atlaskit/editor-common/types/valign';
2
+ import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
+ import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
+ export type SelectedLayoutColumn = {
5
+ index: number;
6
+ node: PMNode;
7
+ pos: number;
8
+ };
9
+ export type SelectedLayoutColumns = {
10
+ layoutSectionNode: PMNode;
11
+ layoutSectionPos: number;
12
+ selectedColumnIndices: number[];
13
+ selectedColumns: SelectedLayoutColumn[];
14
+ };
15
+ export declare const getSelectedLayoutColumns: (selection: Selection | undefined) => SelectedLayoutColumns | undefined;
16
+ export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
17
+ export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
18
+ export declare const getLayoutColumnMenuAnchorPos: (selection: Selection | undefined, anchorPosFromHandle?: number) => number | undefined;
@@ -0,0 +1,4 @@
1
+ import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
2
+ import type { LayoutPlugin } from '../../layoutPluginType';
3
+ import { type SelectedLayoutColumns } from '../../pm-plugins/utils/layout-column-selection';
4
+ export declare const useSelectedLayoutColumns: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => SelectedLayoutColumns | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-layout",
3
- "version": "10.4.0",
3
+ "version": "10.6.0",
4
4
  "description": "Layout plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "atlaskit:src": "src/index.ts",
31
31
  "dependencies": {
32
- "@atlaskit/adf-schema": "^52.13.0",
32
+ "@atlaskit/adf-schema": "^52.14.0",
33
33
  "@atlaskit/css": "^0.19.0",
34
34
  "@atlaskit/editor-plugin-analytics": "^10.1.0",
35
35
  "@atlaskit/editor-plugin-block-menu": "^9.2.0",
@@ -48,14 +48,14 @@
48
48
  "@atlaskit/icon": "^35.0.0",
49
49
  "@atlaskit/icon-lab": "^6.9.0",
50
50
  "@atlaskit/platform-feature-flags": "^1.1.0",
51
- "@atlaskit/tmp-editor-statsig": "^82.1.0",
51
+ "@atlaskit/tmp-editor-statsig": "^82.5.0",
52
52
  "@atlaskit/tokens": "^13.0.0",
53
53
  "@babel/runtime": "^7.0.0",
54
54
  "@emotion/react": "^11.7.1",
55
55
  "bind-event-listener": "^3.0.0"
56
56
  },
57
57
  "peerDependencies": {
58
- "@atlaskit/editor-common": "^114.39.0",
58
+ "@atlaskit/editor-common": "^114.45.0",
59
59
  "react": "^18.2.0",
60
60
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
61
61
  },
@@ -115,6 +115,7 @@
115
115
  }
116
116
  },
117
117
  "devDependencies": {
118
+ "react": "^18.2.0",
118
119
  "react-intl": "^6.6.2"
119
120
  }
120
121
  }
@@ -1,21 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getLayoutSectionColumnCount = exports.getLayoutSectionAtSelection = exports.getLayoutColumnValign = exports.getLayoutColumnAtSelection = void 0;
7
- var _state = require("@atlaskit/editor-prosemirror/state");
8
- var getLayoutColumnAtSelection = exports.getLayoutColumnAtSelection = function getLayoutColumnAtSelection(selection) {
9
- return selection instanceof _state.NodeSelection && selection.node.type.name === 'layoutColumn' ? selection.node : undefined;
10
- };
11
- var getLayoutSectionAtSelection = exports.getLayoutSectionAtSelection = function getLayoutSectionAtSelection(selection) {
12
- var selectedColumn = getLayoutColumnAtSelection(selection);
13
- var parent = selectedColumn ? selection === null || selection === void 0 ? void 0 : selection.$from.parent : undefined;
14
- return (parent === null || parent === void 0 ? void 0 : parent.type.name) === 'layoutSection' ? parent : undefined;
15
- };
16
- var getLayoutSectionColumnCount = exports.getLayoutSectionColumnCount = function getLayoutSectionColumnCount(layoutSection) {
17
- return (layoutSection === null || layoutSection === void 0 ? void 0 : layoutSection.type.name) === 'layoutSection' ? layoutSection.childCount : 0;
18
- };
19
- var getLayoutColumnValign = exports.getLayoutColumnValign = function getLayoutColumnValign(layoutColumn) {
20
- return layoutColumn === null || layoutColumn === void 0 ? void 0 : layoutColumn.attrs.valign;
21
- };
@@ -1,20 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useCurrentLayoutSection = exports.useCurrentLayoutColumn = void 0;
7
- var _hooks = require("@atlaskit/editor-common/hooks");
8
- var _layoutColumnSelection = require("./layoutColumnSelection");
9
- var useCurrentLayoutColumn = exports.useCurrentLayoutColumn = function useCurrentLayoutColumn(api) {
10
- return (0, _hooks.useSharedPluginStateWithSelector)(api, ['selection'], function (states) {
11
- var _states$selectionStat;
12
- return (0, _layoutColumnSelection.getLayoutColumnAtSelection)((_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection);
13
- });
14
- };
15
- var useCurrentLayoutSection = exports.useCurrentLayoutSection = function useCurrentLayoutSection(api) {
16
- return (0, _hooks.useSharedPluginStateWithSelector)(api, ['selection'], function (states) {
17
- var _states$selectionStat2;
18
- return (0, _layoutColumnSelection.getLayoutSectionAtSelection)((_states$selectionStat2 = states.selectionState) === null || _states$selectionStat2 === void 0 ? void 0 : _states$selectionStat2.selection);
19
- });
20
- };
@@ -1,9 +0,0 @@
1
- import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
2
- export const getLayoutColumnAtSelection = selection => selection instanceof NodeSelection && selection.node.type.name === 'layoutColumn' ? selection.node : undefined;
3
- export const getLayoutSectionAtSelection = selection => {
4
- const selectedColumn = getLayoutColumnAtSelection(selection);
5
- const parent = selectedColumn ? selection === null || selection === void 0 ? void 0 : selection.$from.parent : undefined;
6
- return (parent === null || parent === void 0 ? void 0 : parent.type.name) === 'layoutSection' ? parent : undefined;
7
- };
8
- export const getLayoutSectionColumnCount = layoutSection => (layoutSection === null || layoutSection === void 0 ? void 0 : layoutSection.type.name) === 'layoutSection' ? layoutSection.childCount : 0;
9
- export const getLayoutColumnValign = layoutColumn => layoutColumn === null || layoutColumn === void 0 ? void 0 : layoutColumn.attrs.valign;
@@ -1,10 +0,0 @@
1
- import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
2
- import { getLayoutColumnAtSelection, getLayoutSectionAtSelection } from './layoutColumnSelection';
3
- export const useCurrentLayoutColumn = api => useSharedPluginStateWithSelector(api, ['selection'], states => {
4
- var _states$selectionStat;
5
- return getLayoutColumnAtSelection((_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection);
6
- });
7
- export const useCurrentLayoutSection = api => useSharedPluginStateWithSelector(api, ['selection'], states => {
8
- var _states$selectionStat2;
9
- return getLayoutSectionAtSelection((_states$selectionStat2 = states.selectionState) === null || _states$selectionStat2 === void 0 ? void 0 : _states$selectionStat2.selection);
10
- });
@@ -1,15 +0,0 @@
1
- import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
2
- export var getLayoutColumnAtSelection = function getLayoutColumnAtSelection(selection) {
3
- return selection instanceof NodeSelection && selection.node.type.name === 'layoutColumn' ? selection.node : undefined;
4
- };
5
- export var getLayoutSectionAtSelection = function getLayoutSectionAtSelection(selection) {
6
- var selectedColumn = getLayoutColumnAtSelection(selection);
7
- var parent = selectedColumn ? selection === null || selection === void 0 ? void 0 : selection.$from.parent : undefined;
8
- return (parent === null || parent === void 0 ? void 0 : parent.type.name) === 'layoutSection' ? parent : undefined;
9
- };
10
- export var getLayoutSectionColumnCount = function getLayoutSectionColumnCount(layoutSection) {
11
- return (layoutSection === null || layoutSection === void 0 ? void 0 : layoutSection.type.name) === 'layoutSection' ? layoutSection.childCount : 0;
12
- };
13
- export var getLayoutColumnValign = function getLayoutColumnValign(layoutColumn) {
14
- return layoutColumn === null || layoutColumn === void 0 ? void 0 : layoutColumn.attrs.valign;
15
- };
@@ -1,14 +0,0 @@
1
- import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
2
- import { getLayoutColumnAtSelection, getLayoutSectionAtSelection } from './layoutColumnSelection';
3
- export var useCurrentLayoutColumn = function useCurrentLayoutColumn(api) {
4
- return useSharedPluginStateWithSelector(api, ['selection'], function (states) {
5
- var _states$selectionStat;
6
- return getLayoutColumnAtSelection((_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection);
7
- });
8
- };
9
- export var useCurrentLayoutSection = function useCurrentLayoutSection(api) {
10
- return useSharedPluginStateWithSelector(api, ['selection'], function (states) {
11
- var _states$selectionStat2;
12
- return getLayoutSectionAtSelection((_states$selectionStat2 = states.selectionState) === null || _states$selectionStat2 === void 0 ? void 0 : _states$selectionStat2.selection);
13
- });
14
- };
@@ -1,7 +0,0 @@
1
- import type { Valign } from '@atlaskit/editor-common/types/valign';
2
- import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
- import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
- export declare const getLayoutColumnAtSelection: (selection: Selection | undefined) => PMNode | undefined;
5
- export declare const getLayoutSectionAtSelection: (selection: Selection | undefined) => PMNode | undefined;
6
- export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
7
- export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
@@ -1,5 +0,0 @@
1
- import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
2
- import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
- import type { LayoutPlugin } from '../../layoutPluginType';
4
- export declare const useCurrentLayoutColumn: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => PMNode | undefined;
5
- export declare const useCurrentLayoutSection: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => PMNode | undefined;
@@ -1,7 +0,0 @@
1
- import type { Valign } from '@atlaskit/editor-common/types/valign';
2
- import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
- import type { Selection } from '@atlaskit/editor-prosemirror/state';
4
- export declare const getLayoutColumnAtSelection: (selection: Selection | undefined) => PMNode | undefined;
5
- export declare const getLayoutSectionAtSelection: (selection: Selection | undefined) => PMNode | undefined;
6
- export declare const getLayoutSectionColumnCount: (layoutSection: PMNode | undefined) => number;
7
- export declare const getLayoutColumnValign: (layoutColumn: PMNode | undefined) => Valign | undefined;
@@ -1,5 +0,0 @@
1
- import type { ExtractInjectionAPI } from '@atlaskit/editor-common/types';
2
- import type { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
3
- import type { LayoutPlugin } from '../../layoutPluginType';
4
- export declare const useCurrentLayoutColumn: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => PMNode | undefined;
5
- export declare const useCurrentLayoutSection: (api: ExtractInjectionAPI<LayoutPlugin> | undefined) => PMNode | undefined;