@atlaskit/editor-plugin-table 5.3.21 → 5.3.23

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/editor-plugin-table
2
2
 
3
+ ## 5.3.23
4
+
5
+ ### Patch Changes
6
+
7
+ - [#42746](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/42746) [`ea352517252`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ea352517252) - Update editor dropdown menu component to support section behind platform.editor.menu.group-items FF
8
+
9
+ ## 5.3.22
10
+
11
+ ### Patch Changes
12
+
13
+ - [#42762](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/42762) [`424cc9c0c25`](https://bitbucket.org/atlassian/atlassian-frontend/commits/424cc9c0c25) - [ED-20613] Removing duplicate webdriver tests that already have migrated tests to Libra
14
+
3
15
  ## 5.3.21
4
16
 
5
17
  ### Patch Changes
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.DragMenu = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
7
9
  var _react = require("@emotion/react");
8
10
  var _uiMenu = require("@atlaskit/editor-common/ui-menu");
9
11
  var _shortcut = require("@atlaskit/editor-shared-styles/shortcut");
@@ -16,11 +18,20 @@ var _dragMenu = require("../../utils/drag-menu");
16
18
  var _consts = require("../consts");
17
19
  /** @jsx jsx */
18
20
 
21
+ var groupedDragMenuConfig = [['add_row_above', 'add_row_below', 'add_column_left', 'add_column_right', 'distribute_columns', 'clear_cells', 'delete_row', 'delete_column'], ['move_column_left', 'move_column_right', 'move_row_up', 'move_row_down'], ['sort_column_asc', 'sort_column_desc']];
19
22
  var convertToDropdownItems = function convertToDropdownItems(dragMenuConfig) {
20
- var menuItems = [];
23
+ var menuItemsArr = (0, _toConsumableArray2.default)(Array(groupedDragMenuConfig.length)).map(function () {
24
+ return [];
25
+ });
21
26
  var menuCallback = {};
22
27
  dragMenuConfig.forEach(function (item) {
23
- menuItems.push({
28
+ var menuGroupIndex = groupedDragMenuConfig.findIndex(function (group) {
29
+ return group.includes(item.id);
30
+ });
31
+ if (menuGroupIndex === -1) {
32
+ return;
33
+ }
34
+ menuItemsArr[menuGroupIndex].push({
24
35
  key: item.id,
25
36
  content: item.title,
26
37
  value: {
@@ -41,6 +52,12 @@ var convertToDropdownItems = function convertToDropdownItems(dragMenuConfig) {
41
52
  });
42
53
  item.onClick && (menuCallback[item.id] = item.onClick);
43
54
  });
55
+ var menuItems = menuItemsArr.reduce(function (acc, curr) {
56
+ (curr === null || curr === void 0 ? void 0 : curr.length) > 0 && acc.push({
57
+ items: curr
58
+ });
59
+ return acc;
60
+ }, []);
44
61
  return {
45
62
  menuItems: menuItems,
46
63
  menuCallback: menuCallback
@@ -104,15 +121,16 @@ var DragMenu = exports.DragMenu = function DragMenu(_ref) {
104
121
  type: _uiMenu.ArrowKeyNavigationType.MENU,
105
122
  disableArrowKeyNavigation: true
106
123
  },
107
- items: [{
108
- items: menuItems
109
- }],
124
+ items: menuItems,
110
125
  isOpen: isOpen,
111
126
  onOpenChange: closeMenu,
112
127
  onItemActivated: handleMenuItemActivated,
113
128
  onMouseEnter: handleItemMouseEnter,
114
129
  onMouseLeave: handleItemMouseLeave,
115
130
  fitWidth: _consts.dragMenuDropdownWidth,
116
- boundariesElement: boundariesElement
131
+ boundariesElement: boundariesElement,
132
+ section: {
133
+ hasSeparator: true
134
+ }
117
135
  });
118
136
  };
@@ -9,11 +9,16 @@ import { toggleDragMenu } from '../../pm-plugins/drag-and-drop/commands';
9
9
  import { getSelectedColumnIndexes, getSelectedRowIndexes } from '../../utils';
10
10
  import { getDragMenuConfig } from '../../utils/drag-menu';
11
11
  import { dragMenuDropdownWidth } from '../consts';
12
+ const groupedDragMenuConfig = [['add_row_above', 'add_row_below', 'add_column_left', 'add_column_right', 'distribute_columns', 'clear_cells', 'delete_row', 'delete_column'], ['move_column_left', 'move_column_right', 'move_row_up', 'move_row_down'], ['sort_column_asc', 'sort_column_desc']];
12
13
  const convertToDropdownItems = dragMenuConfig => {
13
- let menuItems = [];
14
+ let menuItemsArr = [...Array(groupedDragMenuConfig.length)].map(() => []);
14
15
  let menuCallback = {};
15
16
  dragMenuConfig.forEach(item => {
16
- menuItems.push({
17
+ const menuGroupIndex = groupedDragMenuConfig.findIndex(group => group.includes(item.id));
18
+ if (menuGroupIndex === -1) {
19
+ return;
20
+ }
21
+ menuItemsArr[menuGroupIndex].push({
17
22
  key: item.id,
18
23
  content: item.title,
19
24
  value: {
@@ -34,6 +39,12 @@ const convertToDropdownItems = dragMenuConfig => {
34
39
  });
35
40
  item.onClick && (menuCallback[item.id] = item.onClick);
36
41
  });
42
+ const menuItems = menuItemsArr.reduce((acc, curr) => {
43
+ (curr === null || curr === void 0 ? void 0 : curr.length) > 0 && acc.push({
44
+ items: curr
45
+ });
46
+ return acc;
47
+ }, []);
37
48
  return {
38
49
  menuItems,
39
50
  menuCallback
@@ -107,15 +118,16 @@ export const DragMenu = ({
107
118
  type: ArrowKeyNavigationType.MENU,
108
119
  disableArrowKeyNavigation: true
109
120
  },
110
- items: [{
111
- items: menuItems
112
- }],
121
+ items: menuItems,
113
122
  isOpen: isOpen,
114
123
  onOpenChange: closeMenu,
115
124
  onItemActivated: handleMenuItemActivated,
116
125
  onMouseEnter: handleItemMouseEnter,
117
126
  onMouseLeave: handleItemMouseLeave,
118
127
  fitWidth: dragMenuDropdownWidth,
119
- boundariesElement: boundariesElement
128
+ boundariesElement: boundariesElement,
129
+ section: {
130
+ hasSeparator: true
131
+ }
120
132
  });
121
133
  };
@@ -1,3 +1,4 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  /** @jsx jsx */
2
3
  import { jsx } from '@emotion/react';
3
4
  import { ArrowKeyNavigationType, DropdownMenu } from '@atlaskit/editor-common/ui-menu';
@@ -9,11 +10,20 @@ import { toggleDragMenu } from '../../pm-plugins/drag-and-drop/commands';
9
10
  import { getSelectedColumnIndexes, getSelectedRowIndexes } from '../../utils';
10
11
  import { getDragMenuConfig } from '../../utils/drag-menu';
11
12
  import { dragMenuDropdownWidth } from '../consts';
13
+ var groupedDragMenuConfig = [['add_row_above', 'add_row_below', 'add_column_left', 'add_column_right', 'distribute_columns', 'clear_cells', 'delete_row', 'delete_column'], ['move_column_left', 'move_column_right', 'move_row_up', 'move_row_down'], ['sort_column_asc', 'sort_column_desc']];
12
14
  var convertToDropdownItems = function convertToDropdownItems(dragMenuConfig) {
13
- var menuItems = [];
15
+ var menuItemsArr = _toConsumableArray(Array(groupedDragMenuConfig.length)).map(function () {
16
+ return [];
17
+ });
14
18
  var menuCallback = {};
15
19
  dragMenuConfig.forEach(function (item) {
16
- menuItems.push({
20
+ var menuGroupIndex = groupedDragMenuConfig.findIndex(function (group) {
21
+ return group.includes(item.id);
22
+ });
23
+ if (menuGroupIndex === -1) {
24
+ return;
25
+ }
26
+ menuItemsArr[menuGroupIndex].push({
17
27
  key: item.id,
18
28
  content: item.title,
19
29
  value: {
@@ -34,6 +44,12 @@ var convertToDropdownItems = function convertToDropdownItems(dragMenuConfig) {
34
44
  });
35
45
  item.onClick && (menuCallback[item.id] = item.onClick);
36
46
  });
47
+ var menuItems = menuItemsArr.reduce(function (acc, curr) {
48
+ (curr === null || curr === void 0 ? void 0 : curr.length) > 0 && acc.push({
49
+ items: curr
50
+ });
51
+ return acc;
52
+ }, []);
37
53
  return {
38
54
  menuItems: menuItems,
39
55
  menuCallback: menuCallback
@@ -97,15 +113,16 @@ export var DragMenu = function DragMenu(_ref) {
97
113
  type: ArrowKeyNavigationType.MENU,
98
114
  disableArrowKeyNavigation: true
99
115
  },
100
- items: [{
101
- items: menuItems
102
- }],
116
+ items: menuItems,
103
117
  isOpen: isOpen,
104
118
  onOpenChange: closeMenu,
105
119
  onItemActivated: handleMenuItemActivated,
106
120
  onMouseEnter: handleItemMouseEnter,
107
121
  onMouseLeave: handleItemMouseLeave,
108
122
  fitWidth: dragMenuDropdownWidth,
109
- boundariesElement: boundariesElement
123
+ boundariesElement: boundariesElement,
124
+ section: {
125
+ hasSeparator: true
126
+ }
110
127
  });
111
128
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-table",
3
- "version": "5.3.21",
3
+ "version": "5.3.23",
4
4
  "description": "Table plugin for the @atlaskit/editor",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -0,0 +1,194 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen } from '@testing-library/react';
4
+
5
+ import { ReactEditorViewContext } from '@atlaskit/editor-common/ui-react';
6
+ // eslint-disable-next-line import/no-extraneous-dependencies -- Removed import for fixing circular dependencies
7
+ import { analyticsPlugin } from '@atlaskit/editor-plugin-analytics';
8
+ import { contentInsertionPlugin } from '@atlaskit/editor-plugin-content-insertion';
9
+ import { featureFlagsPlugin } from '@atlaskit/editor-plugin-feature-flags';
10
+ import { guidelinePlugin } from '@atlaskit/editor-plugin-guideline';
11
+ import { selectionPlugin } from '@atlaskit/editor-plugin-selection';
12
+ import { widthPlugin } from '@atlaskit/editor-plugin-width';
13
+ import * as prosemirrorUtils from '@atlaskit/editor-prosemirror/utils';
14
+ import type { ContentNodeWithPos } from '@atlaskit/editor-prosemirror/utils';
15
+ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
16
+ import type { LightEditorPlugin } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
17
+ // eslint-disable-next-line import/no-extraneous-dependencies -- Removed import for fixing circular dependencies
18
+ import {
19
+ createProsemirrorEditorFactory,
20
+ Preset,
21
+ } from '@atlaskit/editor-test-helpers/create-prosemirror-editor';
22
+ // eslint-disable-next-line import/no-extraneous-dependencies -- Removed import for fixing circular dependencies
23
+ import {
24
+ doc,
25
+ p,
26
+ table,
27
+ tdCursor,
28
+ tdEmpty,
29
+ th,
30
+ tr,
31
+ } from '@atlaskit/editor-test-helpers/doc-builder';
32
+ import { ffTest } from '@atlassian/feature-flags-test-utils';
33
+
34
+ import tablePlugin from '../../../plugins/table-plugin';
35
+ import FloatingDragMenu from '../../../plugins/table/ui/FloatingDragMenu';
36
+
37
+ describe('FloatingDragMenu', () => {
38
+ const createEditor = createProsemirrorEditorFactory();
39
+ let editorView: EditorView;
40
+ let tableNode: ContentNodeWithPos | undefined;
41
+ beforeEach(() => {
42
+ ({ editorView } = createEditor({
43
+ doc: doc(table()(tr(th()(p('')), th()(p(''))), tr(tdCursor, tdEmpty))),
44
+ preset: new Preset<LightEditorPlugin>()
45
+ .add([featureFlagsPlugin, {}])
46
+ .add([analyticsPlugin, {}])
47
+ .add(contentInsertionPlugin)
48
+ .add(widthPlugin)
49
+ .add(guidelinePlugin)
50
+ .add(selectionPlugin)
51
+ .add(tablePlugin),
52
+ }));
53
+
54
+ tableNode = prosemirrorUtils.findParentNodeOfTypeClosestToPos(
55
+ editorView.state.selection.$from,
56
+ editorView.state.schema.nodes.table,
57
+ );
58
+ });
59
+ describe('should group the menu items correctly', () => {
60
+ ffTest(
61
+ 'platform.editor.menu.group-items',
62
+ () => {
63
+ // Run test case when FF platform.editor..menu.group-items is true
64
+ const tableRef = editorView.dom.querySelector('table');
65
+ const editorRef = {
66
+ current: document.createElement('div'),
67
+ };
68
+ render(
69
+ <ReactEditorViewContext.Provider
70
+ value={{
71
+ editorRef,
72
+ }}
73
+ >
74
+ <FloatingDragMenu
75
+ editorView={editorView}
76
+ isOpen
77
+ getEditorContainerWidth={jest.fn()}
78
+ tableRef={tableRef as HTMLTableElement}
79
+ tableNode={tableNode?.node}
80
+ direction="row"
81
+ targetCellPosition={1}
82
+ />
83
+ </ReactEditorViewContext.Provider>,
84
+ );
85
+ expect(screen.getAllByRole('menu')).toHaveLength(1);
86
+ expect(screen.getAllByRole('group')).toHaveLength(2);
87
+ },
88
+ () => {
89
+ // Run test case when FF platform.editor..menu.group-items is false
90
+ const tableRef = editorView.dom.querySelector('table');
91
+ const editorRef = {
92
+ current: document.createElement('div'),
93
+ };
94
+ render(
95
+ <ReactEditorViewContext.Provider
96
+ value={{
97
+ editorRef,
98
+ }}
99
+ >
100
+ <FloatingDragMenu
101
+ editorView={editorView}
102
+ isOpen
103
+ getEditorContainerWidth={jest.fn()}
104
+ tableRef={tableRef as HTMLTableElement}
105
+ tableNode={tableNode?.node}
106
+ direction="row"
107
+ targetCellPosition={1}
108
+ />
109
+ </ReactEditorViewContext.Provider>,
110
+ );
111
+ expect(screen.getAllByRole('menu')).toHaveLength(2);
112
+ expect(screen.queryByRole('group')).toBeNull();
113
+ },
114
+ );
115
+ });
116
+ describe('menu items', () => {
117
+ it('should render the right menu items for row', () => {
118
+ // Run test case when FF platform.editor..menu.group-items is true
119
+ const tableRef = editorView.dom.querySelector('table');
120
+ const editorRef = {
121
+ current: document.createElement('div'),
122
+ };
123
+ render(
124
+ <ReactEditorViewContext.Provider
125
+ value={{
126
+ editorRef,
127
+ }}
128
+ >
129
+ <FloatingDragMenu
130
+ editorView={editorView}
131
+ isOpen
132
+ getEditorContainerWidth={jest.fn()}
133
+ tableRef={tableRef as HTMLTableElement}
134
+ tableNode={tableNode?.node}
135
+ direction="row"
136
+ targetCellPosition={1}
137
+ />
138
+ </ReactEditorViewContext.Provider>,
139
+ );
140
+
141
+ const items = screen.getAllByRole('menuitem');
142
+ const menuitemTextArray = items.map((item) => item.textContent);
143
+ expect(menuitemTextArray).toMatchInlineSnapshot(`
144
+ Array [
145
+ "Add row aboveCtrl+Alt+↑",
146
+ "Add row belowCtrl+Alt+↓",
147
+ "Clear cells⌫",
148
+ "Delete row",
149
+ "Move row up",
150
+ "Move row down",
151
+ ]
152
+ `);
153
+ });
154
+ it('should render the right menu items for column', () => {
155
+ const tableRef = editorView.dom.querySelector('table');
156
+ const editorRef = {
157
+ current: document.createElement('div'),
158
+ };
159
+ render(
160
+ <ReactEditorViewContext.Provider
161
+ value={{
162
+ editorRef,
163
+ }}
164
+ >
165
+ <FloatingDragMenu
166
+ editorView={editorView}
167
+ isOpen
168
+ getEditorContainerWidth={jest.fn()}
169
+ tableRef={tableRef as HTMLTableElement}
170
+ tableNode={tableNode?.node}
171
+ direction="column"
172
+ targetCellPosition={1}
173
+ />
174
+ </ReactEditorViewContext.Provider>,
175
+ );
176
+
177
+ const items = screen.getAllByRole('menuitem');
178
+ const menuitemTextArray = items.map((item) => item.textContent);
179
+ expect(menuitemTextArray).toMatchInlineSnapshot(`
180
+ Array [
181
+ "Add column leftCtrl+Alt+←",
182
+ "Add column rightCtrl+Alt+→",
183
+ "Distribute columns",
184
+ "Clear cells⌫",
185
+ "Delete column",
186
+ "Move column left",
187
+ "Move column right",
188
+ "Sort increasing",
189
+ "Sort decreasing",
190
+ ]
191
+ `);
192
+ });
193
+ });
194
+ });
@@ -44,11 +44,35 @@ type DragMenuProps = {
44
44
  getEditorContainerWidth: GetEditorContainerWidth;
45
45
  };
46
46
 
47
+ const groupedDragMenuConfig = [
48
+ [
49
+ 'add_row_above',
50
+ 'add_row_below',
51
+ 'add_column_left',
52
+ 'add_column_right',
53
+ 'distribute_columns',
54
+ 'clear_cells',
55
+ 'delete_row',
56
+ 'delete_column',
57
+ ],
58
+ ['move_column_left', 'move_column_right', 'move_row_up', 'move_row_down'],
59
+ ['sort_column_asc', 'sort_column_desc'],
60
+ ];
61
+
47
62
  const convertToDropdownItems = (dragMenuConfig: DragMenuConfig[]) => {
48
- let menuItems: MenuItem[] = [];
63
+ let menuItemsArr: MenuItem[][] = [...Array(groupedDragMenuConfig.length)].map(
64
+ () => [],
65
+ );
49
66
  let menuCallback: { [key: string]: Command } = {};
50
67
  dragMenuConfig.forEach((item) => {
51
- menuItems.push({
68
+ const menuGroupIndex = groupedDragMenuConfig.findIndex((group) =>
69
+ group.includes(item.id),
70
+ );
71
+
72
+ if (menuGroupIndex === -1) {
73
+ return;
74
+ }
75
+ menuItemsArr[menuGroupIndex].push({
52
76
  key: item.id,
53
77
  content: item.title,
54
78
  value: { name: item.id },
@@ -69,6 +93,11 @@ const convertToDropdownItems = (dragMenuConfig: DragMenuConfig[]) => {
69
93
  });
70
94
  item.onClick && (menuCallback[item.id] = item.onClick);
71
95
  });
96
+
97
+ const menuItems = menuItemsArr.reduce((acc, curr) => {
98
+ curr?.length > 0 && acc.push({ items: curr });
99
+ return acc;
100
+ }, [] as { items: MenuItem[] }[]);
72
101
  return { menuItems, menuCallback };
73
102
  };
74
103
 
@@ -149,11 +178,7 @@ export const DragMenu = ({
149
178
  type: ArrowKeyNavigationType.MENU,
150
179
  disableArrowKeyNavigation: true,
151
180
  }}
152
- items={[
153
- {
154
- items: menuItems,
155
- },
156
- ]}
181
+ items={menuItems}
157
182
  isOpen={isOpen}
158
183
  onOpenChange={closeMenu}
159
184
  onItemActivated={handleMenuItemActivated}
@@ -161,6 +186,7 @@ export const DragMenu = ({
161
186
  onMouseLeave={handleItemMouseLeave}
162
187
  fitWidth={dragMenuDropdownWidth}
163
188
  boundariesElement={boundariesElement}
189
+ section={{ hasSeparator: true }}
164
190
  />
165
191
  );
166
192
  };