@atlaskit/editor-plugin-table 22.4.6 → 22.4.8
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 +17 -0
- package/dist/cjs/pm-plugins/utils/nodes.js +17 -2
- package/dist/cjs/ui/FloatingContextualButton/index.js +5 -0
- package/dist/cjs/ui/FloatingContextualMenu/CellMenuPopup.js +103 -0
- package/dist/cjs/ui/FloatingContextualMenu/index.js +13 -2
- package/dist/cjs/ui/TableMenu/cell/getCellMenuComponents.js +77 -0
- package/dist/cjs/ui/TableMenu/cell/items/MergeCellsItem.js +21 -0
- package/dist/cjs/ui/TableMenu/cell/items/SplitCellItem.js +21 -0
- package/dist/cjs/ui/TableMenu/cell/keys.js +40 -0
- package/dist/cjs/ui/TableMenu/column/items/MoveColumnRightItem.js +2 -6
- package/dist/cjs/ui/TableMenu/shared/TableMenu.js +2 -1
- package/dist/cjs/ui/TableMenu/shared/getSharedItems.js +28 -19
- package/dist/cjs/ui/TableMenu/shared/getTableMenuComponents.js +2 -1
- package/dist/es2019/pm-plugins/utils/nodes.js +11 -2
- package/dist/es2019/ui/FloatingContextualButton/index.js +5 -0
- package/dist/es2019/ui/FloatingContextualMenu/CellMenuPopup.js +99 -0
- package/dist/es2019/ui/FloatingContextualMenu/index.js +13 -3
- package/dist/es2019/ui/TableMenu/cell/getCellMenuComponents.js +61 -0
- package/dist/es2019/ui/TableMenu/cell/items/MergeCellsItem.js +15 -0
- package/dist/es2019/ui/TableMenu/cell/items/SplitCellItem.js +15 -0
- package/dist/es2019/ui/TableMenu/cell/keys.js +42 -0
- package/dist/es2019/ui/TableMenu/column/items/MoveColumnRightItem.js +3 -5
- package/dist/es2019/ui/TableMenu/shared/TableMenu.js +2 -1
- package/dist/es2019/ui/TableMenu/shared/getSharedItems.js +9 -0
- package/dist/es2019/ui/TableMenu/shared/getTableMenuComponents.js +2 -1
- package/dist/esm/pm-plugins/utils/nodes.js +17 -2
- package/dist/esm/ui/FloatingContextualButton/index.js +5 -0
- package/dist/esm/ui/FloatingContextualMenu/CellMenuPopup.js +95 -0
- package/dist/esm/ui/FloatingContextualMenu/index.js +13 -3
- package/dist/esm/ui/TableMenu/cell/getCellMenuComponents.js +71 -0
- package/dist/esm/ui/TableMenu/cell/items/MergeCellsItem.js +14 -0
- package/dist/esm/ui/TableMenu/cell/items/SplitCellItem.js +14 -0
- package/dist/esm/ui/TableMenu/cell/keys.js +34 -0
- package/dist/esm/ui/TableMenu/column/items/MoveColumnRightItem.js +3 -7
- package/dist/esm/ui/TableMenu/shared/TableMenu.js +2 -1
- package/dist/esm/ui/TableMenu/shared/getSharedItems.js +9 -0
- package/dist/esm/ui/TableMenu/shared/getTableMenuComponents.js +2 -1
- package/dist/types/pm-plugins/utils/nodes.d.ts +3 -1
- package/dist/types/ui/FloatingContextualMenu/CellMenuPopup.d.ts +12 -0
- package/dist/types/ui/TableMenu/cell/getCellMenuComponents.d.ts +9 -0
- package/dist/types/ui/TableMenu/cell/items/MergeCellsItem.d.ts +2 -0
- package/dist/types/ui/TableMenu/cell/items/SplitCellItem.d.ts +2 -0
- package/dist/types/ui/TableMenu/cell/keys.d.ts +9 -0
- package/dist/types-ts4.5/pm-plugins/utils/nodes.d.ts +3 -1
- package/dist/types-ts4.5/ui/FloatingContextualMenu/CellMenuPopup.d.ts +12 -0
- package/dist/types-ts4.5/ui/TableMenu/cell/getCellMenuComponents.d.ts +9 -0
- package/dist/types-ts4.5/ui/TableMenu/cell/items/MergeCellsItem.d.ts +2 -0
- package/dist/types-ts4.5/ui/TableMenu/cell/items/SplitCellItem.d.ts +2 -0
- package/dist/types-ts4.5/ui/TableMenu/cell/keys.d.ts +9 -0
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-table
|
|
2
2
|
|
|
3
|
+
## 22.4.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`98ee7ca379f42`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/98ee7ca379f42) -
|
|
8
|
+
Add experiment-gated table menu updates for cell menu
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
|
|
11
|
+
## 22.4.7
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [`46f34d2400d1c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/46f34d2400d1c) -
|
|
16
|
+
Fixes malfunctioning sticky header when header columns are merged so that headers don't
|
|
17
|
+
stack/overlap.
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
|
|
3
20
|
## 22.4.6
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
|
@@ -9,6 +9,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
|
9
9
|
var _utils = require("@atlaskit/editor-common/utils");
|
|
10
10
|
var _tableMap = require("@atlaskit/editor-tables/table-map");
|
|
11
11
|
var _utils2 = require("@atlaskit/editor-tables/utils");
|
|
12
|
+
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
12
13
|
var isIsolating = exports.isIsolating = function isIsolating(node) {
|
|
13
14
|
return !!node.type.spec.isolating;
|
|
14
15
|
};
|
|
@@ -27,7 +28,7 @@ var containsHeaderColumn = exports.containsHeaderColumn = function containsHeade
|
|
|
27
28
|
if (cell && cell.type !== table.type.schema.nodes.tableHeader) {
|
|
28
29
|
return false;
|
|
29
30
|
}
|
|
30
|
-
} catch (
|
|
31
|
+
} catch (_unused) {
|
|
31
32
|
return false;
|
|
32
33
|
}
|
|
33
34
|
}
|
|
@@ -134,11 +135,20 @@ var anyChildCellMergedAcrossRow = function anyChildCellMergedAcrossRow(node) {
|
|
|
134
135
|
return rowspan > 1;
|
|
135
136
|
});
|
|
136
137
|
};
|
|
138
|
+
var anyChildCellMergedAcrossColumn = function anyChildCellMergedAcrossColumn(node) {
|
|
139
|
+
return (0, _utils.mapChildren)(node, function (child) {
|
|
140
|
+
return child.attrs.colspan || 0;
|
|
141
|
+
}).some(function (colspan) {
|
|
142
|
+
return colspan > 1;
|
|
143
|
+
});
|
|
144
|
+
};
|
|
137
145
|
|
|
138
146
|
/**
|
|
139
147
|
* Check if a given node is a header row with this definition:
|
|
140
148
|
* - all children are tableHeader cells
|
|
141
|
-
* - no table cells have been
|
|
149
|
+
* - no table cells have been merged with other table row cells (rowspan > 1)
|
|
150
|
+
* - no table cells have been merged with other table column cells (colspan > 1),
|
|
151
|
+
* (colspan check gated behind platform_editor_fix_sticky_header_malfunction)
|
|
142
152
|
*
|
|
143
153
|
* @param node ProseMirror node
|
|
144
154
|
* @returns boolean if it meets definition
|
|
@@ -147,6 +157,11 @@ var supportedHeaderRow = exports.supportedHeaderRow = function supportedHeaderRo
|
|
|
147
157
|
var allHeaders = (0, _utils.mapChildren)(node, function (child) {
|
|
148
158
|
return child.type.name === 'tableHeader';
|
|
149
159
|
}).every(Boolean);
|
|
160
|
+
if ((0, _expValEquals.expValEquals)('platform_editor_fix_sticky_header_malfunction', 'isEnabled', true)) {
|
|
161
|
+
var someMergedAcrossRow = anyChildCellMergedAcrossRow(node);
|
|
162
|
+
var someMergedAcrossColumn = anyChildCellMergedAcrossColumn(node);
|
|
163
|
+
return allHeaders && !someMergedAcrossRow && !someMergedAcrossColumn;
|
|
164
|
+
}
|
|
150
165
|
var someMerged = anyChildCellMergedAcrossRow(node);
|
|
151
166
|
return allHeaders && !someMerged;
|
|
152
167
|
};
|
|
@@ -57,6 +57,11 @@ var FloatingContextualButtonInner = /*#__PURE__*/_react.default.memo(function (p
|
|
|
57
57
|
var handleClick = function handleClick() {
|
|
58
58
|
var state = editorView.state,
|
|
59
59
|
dispatch = editorView.dispatch;
|
|
60
|
+
if ((0, _expValEquals.expValEquals)('platform_editor_table_menu_updates', 'isEnabled', true)) {
|
|
61
|
+
(0, _commands.toggleContextualMenu)()(state, dispatch);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
60
65
|
// Clicking outside the dropdown handles toggling the menu closed
|
|
61
66
|
// (otherwise these two toggles combat each other).
|
|
62
67
|
// In the event a user clicks the chevron button again
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CellMenuPopup = void 0;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _bindEventListener = require("bind-event-listener");
|
|
10
|
+
var _hooks = require("@atlaskit/editor-common/hooks");
|
|
11
|
+
var _userIntent = require("@atlaskit/editor-common/user-intent");
|
|
12
|
+
var _commands = require("../../pm-plugins/commands");
|
|
13
|
+
var _types = require("../../types");
|
|
14
|
+
var _keys = require("../TableMenu/cell/keys");
|
|
15
|
+
var _TableMenu = require("../TableMenu/shared/TableMenu");
|
|
16
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
17
|
+
var CellMenuPopup = exports.CellMenuPopup = function CellMenuPopup(_ref) {
|
|
18
|
+
var api = _ref.api,
|
|
19
|
+
editorView = _ref.editorView,
|
|
20
|
+
isCellMenuOpenByKeyboard = _ref.isCellMenuOpenByKeyboard,
|
|
21
|
+
isOpen = _ref.isOpen,
|
|
22
|
+
targetCellRef = _ref.targetCellRef;
|
|
23
|
+
var tableMenuRef = (0, _react.useRef)(null);
|
|
24
|
+
var _useSharedPluginState = (0, _hooks.useSharedPluginStateWithSelector)(api, ['userIntent'], function (states) {
|
|
25
|
+
var _states$userIntentSta;
|
|
26
|
+
return {
|
|
27
|
+
currentUserIntent: (_states$userIntentSta = states.userIntentState) === null || _states$userIntentSta === void 0 ? void 0 : _states$userIntentSta.currentUserIntent
|
|
28
|
+
};
|
|
29
|
+
}),
|
|
30
|
+
currentUserIntent = _useSharedPluginState.currentUserIntent;
|
|
31
|
+
var closeCellMenu = (0, _react.useCallback)(function () {
|
|
32
|
+
var state = editorView.state,
|
|
33
|
+
dispatch = editorView.dispatch,
|
|
34
|
+
dom = editorView.dom;
|
|
35
|
+
(0, _commands.toggleContextualMenu)()(state, dispatch);
|
|
36
|
+
if (isCellMenuOpenByKeyboard) {
|
|
37
|
+
(0, _commands.setFocusToCellMenu)(false)(state, dispatch);
|
|
38
|
+
dom.focus();
|
|
39
|
+
}
|
|
40
|
+
}, [editorView, isCellMenuOpenByKeyboard]);
|
|
41
|
+
(0, _react.useEffect)(function () {
|
|
42
|
+
if (!isOpen || currentUserIntent !== 'tableDragMenuPopupOpen') {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
closeCellMenu();
|
|
46
|
+
}, [closeCellMenu, currentUserIntent, isOpen]);
|
|
47
|
+
(0, _react.useEffect)(function () {
|
|
48
|
+
if (!isOpen) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!(targetCellRef instanceof HTMLElement)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
var ownerDocument = targetCellRef.ownerDocument;
|
|
55
|
+
var handlePointerDown = function handlePointerDown(event) {
|
|
56
|
+
var _tableMenuRef$current;
|
|
57
|
+
var target = event.target;
|
|
58
|
+
if (!(target instanceof Node)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if ((_tableMenuRef$current = tableMenuRef.current) !== null && _tableMenuRef$current !== void 0 && _tableMenuRef$current.contains(target)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
var cellMenuButton = ownerDocument.querySelector(".".concat(_types.TableCssClassName.CONTEXTUAL_MENU_BUTTON));
|
|
65
|
+
if (cellMenuButton !== null && cellMenuButton !== void 0 && cellMenuButton.contains(target)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
closeCellMenu();
|
|
69
|
+
};
|
|
70
|
+
var handleKeyDown = function handleKeyDown(event) {
|
|
71
|
+
if (event.key === 'Escape') {
|
|
72
|
+
closeCellMenu();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var unbindPointerDown = (0, _bindEventListener.bind)(ownerDocument, {
|
|
76
|
+
type: 'pointerdown',
|
|
77
|
+
listener: handlePointerDown,
|
|
78
|
+
options: {
|
|
79
|
+
capture: true
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
var unbindKeyDown = (0, _bindEventListener.bind)(ownerDocument, {
|
|
83
|
+
type: 'keydown',
|
|
84
|
+
listener: handleKeyDown,
|
|
85
|
+
options: {
|
|
86
|
+
capture: true
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return function () {
|
|
90
|
+
unbindPointerDown();
|
|
91
|
+
unbindKeyDown();
|
|
92
|
+
};
|
|
93
|
+
}, [closeCellMenu, isOpen, targetCellRef]);
|
|
94
|
+
return /*#__PURE__*/_react.default.createElement(_userIntent.UserIntentPopupWrapper, {
|
|
95
|
+
api: api,
|
|
96
|
+
userIntent: "tableContextualMenuPopupOpen"
|
|
97
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
98
|
+
ref: tableMenuRef
|
|
99
|
+
}, /*#__PURE__*/_react.default.createElement(_TableMenu.TableMenu, {
|
|
100
|
+
api: api,
|
|
101
|
+
surface: _keys.CELL_MENU
|
|
102
|
+
})));
|
|
103
|
+
};
|
|
@@ -10,8 +10,11 @@ var _ui = require("@atlaskit/editor-common/ui");
|
|
|
10
10
|
var _utils = require("@atlaskit/editor-prosemirror/utils");
|
|
11
11
|
var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
|
|
12
12
|
var _utils2 = require("@atlaskit/editor-tables/utils");
|
|
13
|
+
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
13
14
|
var _pluginFactory = require("../../pm-plugins/plugin-factory");
|
|
14
15
|
var _consts = require("../consts");
|
|
16
|
+
var _consts2 = require("../TableMenu/shared/consts");
|
|
17
|
+
var _CellMenuPopup = require("./CellMenuPopup");
|
|
15
18
|
var _ContextualMenu = _interopRequireDefault(require("./ContextualMenu"));
|
|
16
19
|
var _styles = require("./styles");
|
|
17
20
|
/**
|
|
@@ -72,7 +75,7 @@ var FloatingContextualMenu = function FloatingContextualMenu(_ref) {
|
|
|
72
75
|
boundariesElement: boundariesElement,
|
|
73
76
|
scrollableElement: scrollableElement,
|
|
74
77
|
fitHeight: _consts.tablePopupMenuFitHeight,
|
|
75
|
-
fitWidth: _consts.contextualMenuDropdownWidthDnD
|
|
78
|
+
fitWidth: (0, _expValEquals.expValEquals)('platform_editor_table_menu_updates', 'isEnabled', true) ? _consts2.TABLE_MENU_WIDTH : _consts.contextualMenuDropdownWidthDnD
|
|
76
79
|
// z-index value below is to ensure that this menu is above other floating menu
|
|
77
80
|
// in table, but below floating dialogs like typeaheads, pickers, etc.
|
|
78
81
|
,
|
|
@@ -82,7 +85,15 @@ var FloatingContextualMenu = function FloatingContextualMenu(_ref) {
|
|
|
82
85
|
,
|
|
83
86
|
offset: [-7, 0],
|
|
84
87
|
stick: true
|
|
85
|
-
}, (0, _react.jsx)(
|
|
88
|
+
}, (0, _expValEquals.expValEquals)('platform_editor_table_menu_updates', 'isEnabled', true) ? (0, _react.jsx)(_CellMenuPopup.CellMenuPopup, {
|
|
89
|
+
api: api,
|
|
90
|
+
editorView: editorView,
|
|
91
|
+
isCellMenuOpenByKeyboard: isCellMenuOpenByKeyboard,
|
|
92
|
+
isOpen: isOpen,
|
|
93
|
+
targetCellRef: targetCellRef
|
|
94
|
+
}) :
|
|
95
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values, @atlaskit/design-system/consistent-css-prop-usage -- Ignored via go/DSP-18766
|
|
96
|
+
(0, _react.jsx)("div", {
|
|
86
97
|
css: (0, _styles.tablePopupStyles)()
|
|
87
98
|
}, (0, _react.jsx)(_ContextualMenu.default, {
|
|
88
99
|
editorView: editorView
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getCellMenuComponents = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
10
|
+
var _MergeCellsItem = require("./items/MergeCellsItem");
|
|
11
|
+
var _SplitCellItem = require("./items/SplitCellItem");
|
|
12
|
+
var _keys = require("./keys");
|
|
13
|
+
/**
|
|
14
|
+
* Returns the RegisterComponent[] array defining the cell contextual menu surface.
|
|
15
|
+
*
|
|
16
|
+
* This is a **UI-only stub** — all items are always visible with no conditional
|
|
17
|
+
* logic and no wired actions. Functional behaviour (actions, conditional visibility)
|
|
18
|
+
* will be connected in follow-up tickets.
|
|
19
|
+
*/
|
|
20
|
+
var getCellMenuComponents = exports.getCellMenuComponents = function getCellMenuComponents() {
|
|
21
|
+
return [
|
|
22
|
+
// --- Menu surface ---
|
|
23
|
+
{
|
|
24
|
+
type: _keys.CELL_MENU.type,
|
|
25
|
+
key: _keys.CELL_MENU.key
|
|
26
|
+
},
|
|
27
|
+
// --- Main action section (Background color, Merge cells, Split cell) ---
|
|
28
|
+
{
|
|
29
|
+
type: _keys.CELL_ACTION_SECTION.type,
|
|
30
|
+
key: _keys.CELL_ACTION_SECTION.key,
|
|
31
|
+
parents: [{
|
|
32
|
+
type: _keys.CELL_MENU.type,
|
|
33
|
+
key: _keys.CELL_MENU.key,
|
|
34
|
+
rank: _keys.CELL_MENU_SECTION_RANK[_keys.CELL_ACTION_SECTION.key]
|
|
35
|
+
}],
|
|
36
|
+
component: function component(props) {
|
|
37
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, props.children);
|
|
38
|
+
}
|
|
39
|
+
}, {
|
|
40
|
+
type: _keys.MERGE_CELLS_ITEM.type,
|
|
41
|
+
key: _keys.MERGE_CELLS_ITEM.key,
|
|
42
|
+
parents: [{
|
|
43
|
+
type: _keys.CELL_ACTION_SECTION.type,
|
|
44
|
+
key: _keys.CELL_ACTION_SECTION.key,
|
|
45
|
+
rank: _keys.CELL_ACTION_SECTION_RANK[_keys.MERGE_CELLS_ITEM.key]
|
|
46
|
+
}],
|
|
47
|
+
component: function component() {
|
|
48
|
+
return /*#__PURE__*/_react.default.createElement(_MergeCellsItem.MergeCellsItem, null);
|
|
49
|
+
}
|
|
50
|
+
}, {
|
|
51
|
+
type: _keys.SPLIT_CELL_ITEM.type,
|
|
52
|
+
key: _keys.SPLIT_CELL_ITEM.key,
|
|
53
|
+
parents: [{
|
|
54
|
+
type: _keys.CELL_ACTION_SECTION.type,
|
|
55
|
+
key: _keys.CELL_ACTION_SECTION.key,
|
|
56
|
+
rank: _keys.CELL_ACTION_SECTION_RANK[_keys.SPLIT_CELL_ITEM.key]
|
|
57
|
+
}],
|
|
58
|
+
component: function component() {
|
|
59
|
+
return /*#__PURE__*/_react.default.createElement(_SplitCellItem.SplitCellItem, null);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
// --- Danger section (Clear cell) ---
|
|
63
|
+
{
|
|
64
|
+
type: _keys.CELL_DANGER_SECTION.type,
|
|
65
|
+
key: _keys.CELL_DANGER_SECTION.key,
|
|
66
|
+
parents: [{
|
|
67
|
+
type: _keys.CELL_MENU.type,
|
|
68
|
+
key: _keys.CELL_MENU.key,
|
|
69
|
+
rank: _keys.CELL_MENU_SECTION_RANK[_keys.CELL_DANGER_SECTION.key]
|
|
70
|
+
}],
|
|
71
|
+
component: function component(props) {
|
|
72
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
73
|
+
hasSeparator: true
|
|
74
|
+
}, props.children);
|
|
75
|
+
}
|
|
76
|
+
}];
|
|
77
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.MergeCellsItem = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _reactIntl = require("react-intl");
|
|
10
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
11
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
12
|
+
var MergeCellsItem = exports.MergeCellsItem = function MergeCellsItem() {
|
|
13
|
+
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
14
|
+
formatMessage = _useIntl.formatMessage;
|
|
15
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
|
|
16
|
+
elemBefore: /*#__PURE__*/_react.default.createElement(_editorToolbar.TableCellMergeIcon, {
|
|
17
|
+
label: "",
|
|
18
|
+
size: "small"
|
|
19
|
+
})
|
|
20
|
+
}, formatMessage(_messages.tableMessages.mergeCells));
|
|
21
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.SplitCellItem = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _reactIntl = require("react-intl");
|
|
10
|
+
var _messages = require("@atlaskit/editor-common/messages");
|
|
11
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
12
|
+
var SplitCellItem = exports.SplitCellItem = function SplitCellItem() {
|
|
13
|
+
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
14
|
+
formatMessage = _useIntl.formatMessage;
|
|
15
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
|
|
16
|
+
elemBefore: /*#__PURE__*/_react.default.createElement(_editorToolbar.TableCellSplitIcon, {
|
|
17
|
+
label: "",
|
|
18
|
+
size: "small"
|
|
19
|
+
})
|
|
20
|
+
}, formatMessage(_messages.tableMessages.splitCell));
|
|
21
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.SPLIT_CELL_ITEM = exports.MERGE_CELLS_ITEM = exports.CELL_MENU_SECTION_RANK = exports.CELL_MENU = exports.CELL_DANGER_SECTION_RANK = exports.CELL_DANGER_SECTION = exports.CELL_ACTION_SECTION_RANK = exports.CELL_ACTION_SECTION = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _keys = require("../shared/keys");
|
|
10
|
+
// --- Menu surface ---
|
|
11
|
+
|
|
12
|
+
var CELL_MENU = exports.CELL_MENU = {
|
|
13
|
+
type: 'menu',
|
|
14
|
+
key: 'cell-contextual-menu'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// --- Sections ---
|
|
18
|
+
|
|
19
|
+
var CELL_ACTION_SECTION = exports.CELL_ACTION_SECTION = {
|
|
20
|
+
type: 'menu-section',
|
|
21
|
+
key: 'cell-action-section'
|
|
22
|
+
};
|
|
23
|
+
var CELL_DANGER_SECTION = exports.CELL_DANGER_SECTION = {
|
|
24
|
+
type: 'menu-section',
|
|
25
|
+
key: 'cell-danger-section'
|
|
26
|
+
};
|
|
27
|
+
var CELL_MENU_SECTION_RANK = exports.CELL_MENU_SECTION_RANK = (0, _defineProperty2.default)((0, _defineProperty2.default)({}, CELL_ACTION_SECTION.key, 100), CELL_DANGER_SECTION.key, 200);
|
|
28
|
+
var MERGE_CELLS_ITEM = exports.MERGE_CELLS_ITEM = {
|
|
29
|
+
type: 'menu-item',
|
|
30
|
+
key: 'merge-cells'
|
|
31
|
+
};
|
|
32
|
+
var SPLIT_CELL_ITEM = exports.SPLIT_CELL_ITEM = {
|
|
33
|
+
type: 'menu-item',
|
|
34
|
+
key: 'split-cell'
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// --- Item ranks within their sections ---
|
|
38
|
+
|
|
39
|
+
var CELL_ACTION_SECTION_RANK = exports.CELL_ACTION_SECTION_RANK = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _keys.BACKGROUND_COLOR_ITEM.key, 100), MERGE_CELLS_ITEM.key, 200), SPLIT_CELL_ITEM.key, 300);
|
|
40
|
+
var CELL_DANGER_SECTION_RANK = exports.CELL_DANGER_SECTION_RANK = (0, _defineProperty2.default)({}, _keys.CLEAR_CELLS_ITEM.key, 100);
|
|
@@ -10,12 +10,8 @@ var _reactIntl = require("react-intl");
|
|
|
10
10
|
var _keymaps = require("@atlaskit/editor-common/keymaps");
|
|
11
11
|
var _messages = require("@atlaskit/editor-common/messages");
|
|
12
12
|
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
13
|
-
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
14
|
-
var getMoveColumnRightShortcut = function getMoveColumnRightShortcut() {
|
|
15
|
-
return (0, _keymaps.tooltip)((0, _expValEquals.expValEquals)('editor-a11y-fy26-keyboard-move-row-column', 'isEnabled', true) ? _keymaps.moveColumnRight : _keymaps.moveColumnRightOld);
|
|
16
|
-
};
|
|
17
13
|
var MoveColumnRightItem = exports.MoveColumnRightItem = function MoveColumnRightItem() {
|
|
18
|
-
var
|
|
14
|
+
var _tooltip;
|
|
19
15
|
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
20
16
|
formatMessage = _useIntl.formatMessage;
|
|
21
17
|
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
|
|
@@ -25,7 +21,7 @@ var MoveColumnRightItem = exports.MoveColumnRightItem = function MoveColumnRight
|
|
|
25
21
|
size: "small"
|
|
26
22
|
}),
|
|
27
23
|
elemAfter: /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarKeyboardShortcutHint, {
|
|
28
|
-
shortcut: (
|
|
24
|
+
shortcut: (_tooltip = (0, _keymaps.tooltip)(_keymaps.moveColumnRight)) !== null && _tooltip !== void 0 ? _tooltip : ''
|
|
29
25
|
})
|
|
30
26
|
}, formatMessage(_messages.tableMessages.moveColumnRight, {
|
|
31
27
|
0: 1
|
|
@@ -6,38 +6,47 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.getSharedItems = void 0;
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
|
9
|
-
var _keys = require("../
|
|
10
|
-
var _keys2 = require("../
|
|
9
|
+
var _keys = require("../cell/keys");
|
|
10
|
+
var _keys2 = require("../column/keys");
|
|
11
|
+
var _keys3 = require("../row/keys");
|
|
11
12
|
var _BackgroundColorItem = require("./items/BackgroundColorItem");
|
|
12
13
|
var _ClearCellsItem = require("./items/ClearCellsItem");
|
|
13
|
-
var
|
|
14
|
+
var _keys4 = require("./keys");
|
|
14
15
|
var getSharedItems = exports.getSharedItems = function getSharedItems() {
|
|
15
16
|
return [{
|
|
16
|
-
type:
|
|
17
|
-
key:
|
|
17
|
+
type: _keys4.BACKGROUND_COLOR_ITEM.type,
|
|
18
|
+
key: _keys4.BACKGROUND_COLOR_ITEM.key,
|
|
18
19
|
parents: [{
|
|
19
|
-
type:
|
|
20
|
-
key:
|
|
21
|
-
rank:
|
|
20
|
+
type: _keys3.ROW_BACKGROUND_SECTION.type,
|
|
21
|
+
key: _keys3.ROW_BACKGROUND_SECTION.key,
|
|
22
|
+
rank: _keys3.ROW_BACKGROUND_SECTION_RANK[_keys4.BACKGROUND_COLOR_ITEM.key]
|
|
22
23
|
}, {
|
|
23
|
-
type:
|
|
24
|
-
key:
|
|
25
|
-
rank:
|
|
24
|
+
type: _keys2.COLUMN_BACKGROUND_SECTION.type,
|
|
25
|
+
key: _keys2.COLUMN_BACKGROUND_SECTION.key,
|
|
26
|
+
rank: _keys2.COLUMN_BACKGROUND_SECTION_RANK[_keys4.BACKGROUND_COLOR_ITEM.key]
|
|
27
|
+
}, {
|
|
28
|
+
type: _keys.CELL_ACTION_SECTION.type,
|
|
29
|
+
key: _keys.CELL_ACTION_SECTION.key,
|
|
30
|
+
rank: _keys.CELL_ACTION_SECTION_RANK[_keys4.BACKGROUND_COLOR_ITEM.key]
|
|
26
31
|
}],
|
|
27
32
|
component: function component() {
|
|
28
33
|
return /*#__PURE__*/_react.default.createElement(_BackgroundColorItem.BackgroundColorItem, null);
|
|
29
34
|
}
|
|
30
35
|
}, {
|
|
31
|
-
type:
|
|
32
|
-
key:
|
|
36
|
+
type: _keys4.CLEAR_CELLS_ITEM.type,
|
|
37
|
+
key: _keys4.CLEAR_CELLS_ITEM.key,
|
|
33
38
|
parents: [{
|
|
34
|
-
type:
|
|
35
|
-
key:
|
|
36
|
-
rank:
|
|
39
|
+
type: _keys3.ROW_DANGER_SECTION.type,
|
|
40
|
+
key: _keys3.ROW_DANGER_SECTION.key,
|
|
41
|
+
rank: _keys3.ROW_DANGER_SECTION_RANK[_keys4.CLEAR_CELLS_ITEM.key]
|
|
42
|
+
}, {
|
|
43
|
+
type: _keys2.COLUMN_DANGER_SECTION.type,
|
|
44
|
+
key: _keys2.COLUMN_DANGER_SECTION.key,
|
|
45
|
+
rank: _keys2.COLUMN_DANGER_SECTION_RANK[_keys4.CLEAR_CELLS_ITEM.key]
|
|
37
46
|
}, {
|
|
38
|
-
type: _keys.
|
|
39
|
-
key: _keys.
|
|
40
|
-
rank: _keys.
|
|
47
|
+
type: _keys.CELL_DANGER_SECTION.type,
|
|
48
|
+
key: _keys.CELL_DANGER_SECTION.key,
|
|
49
|
+
rank: _keys.CELL_DANGER_SECTION_RANK[_keys4.CLEAR_CELLS_ITEM.key]
|
|
41
50
|
}],
|
|
42
51
|
component: function component() {
|
|
43
52
|
return /*#__PURE__*/_react.default.createElement(_ClearCellsItem.ClearCellsItem, null);
|
|
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.getTableMenuComponents = void 0;
|
|
8
8
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _getCellMenuComponents = require("../cell/getCellMenuComponents");
|
|
9
10
|
var _getColumnMenuComponents = require("../column/getColumnMenuComponents");
|
|
10
11
|
var _getRowMenuComponents = require("../row/getRowMenuComponents");
|
|
11
12
|
var _getSharedItems = require("./getSharedItems");
|
|
12
13
|
var getTableMenuComponents = exports.getTableMenuComponents = function getTableMenuComponents() {
|
|
13
|
-
return [].concat((0, _toConsumableArray2.default)((0, _getRowMenuComponents.getRowMenuComponents)()), (0, _toConsumableArray2.default)((0, _getColumnMenuComponents.getColumnMenuComponents)()), (0, _toConsumableArray2.default)((0, _getSharedItems.getSharedItems)()));
|
|
14
|
+
return [].concat((0, _toConsumableArray2.default)((0, _getRowMenuComponents.getRowMenuComponents)()), (0, _toConsumableArray2.default)((0, _getColumnMenuComponents.getColumnMenuComponents)()), (0, _toConsumableArray2.default)((0, _getCellMenuComponents.getCellMenuComponents)()), (0, _toConsumableArray2.default)((0, _getSharedItems.getSharedItems)()));
|
|
14
15
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mapChildren } from '@atlaskit/editor-common/utils';
|
|
2
2
|
import { TableMap } from '@atlaskit/editor-tables/table-map';
|
|
3
3
|
import { findTable } from '@atlaskit/editor-tables/utils';
|
|
4
|
+
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
4
5
|
export const isIsolating = node => {
|
|
5
6
|
return !!node.type.spec.isolating;
|
|
6
7
|
};
|
|
@@ -19,7 +20,7 @@ export const containsHeaderColumn = table => {
|
|
|
19
20
|
if (cell && cell.type !== table.type.schema.nodes.tableHeader) {
|
|
20
21
|
return false;
|
|
21
22
|
}
|
|
22
|
-
} catch
|
|
23
|
+
} catch {
|
|
23
24
|
return false;
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -108,17 +109,25 @@ export const isTableNestedUnderBodiedSyncBlock = (state, tablePos) => {
|
|
|
108
109
|
return false;
|
|
109
110
|
};
|
|
110
111
|
const anyChildCellMergedAcrossRow = node => mapChildren(node, child => child.attrs.rowspan || 0).some(rowspan => rowspan > 1);
|
|
112
|
+
const anyChildCellMergedAcrossColumn = node => mapChildren(node, child => child.attrs.colspan || 0).some(colspan => colspan > 1);
|
|
111
113
|
|
|
112
114
|
/**
|
|
113
115
|
* Check if a given node is a header row with this definition:
|
|
114
116
|
* - all children are tableHeader cells
|
|
115
|
-
* - no table cells have been
|
|
117
|
+
* - no table cells have been merged with other table row cells (rowspan > 1)
|
|
118
|
+
* - no table cells have been merged with other table column cells (colspan > 1),
|
|
119
|
+
* (colspan check gated behind platform_editor_fix_sticky_header_malfunction)
|
|
116
120
|
*
|
|
117
121
|
* @param node ProseMirror node
|
|
118
122
|
* @returns boolean if it meets definition
|
|
119
123
|
*/
|
|
120
124
|
export const supportedHeaderRow = node => {
|
|
121
125
|
const allHeaders = mapChildren(node, child => child.type.name === 'tableHeader').every(Boolean);
|
|
126
|
+
if (expValEquals('platform_editor_fix_sticky_header_malfunction', 'isEnabled', true)) {
|
|
127
|
+
const someMergedAcrossRow = anyChildCellMergedAcrossRow(node);
|
|
128
|
+
const someMergedAcrossColumn = anyChildCellMergedAcrossColumn(node);
|
|
129
|
+
return allHeaders && !someMergedAcrossRow && !someMergedAcrossColumn;
|
|
130
|
+
}
|
|
122
131
|
const someMerged = anyChildCellMergedAcrossRow(node);
|
|
123
132
|
return allHeaders && !someMerged;
|
|
124
133
|
};
|
|
@@ -52,6 +52,11 @@ const FloatingContextualButtonInner = /*#__PURE__*/React.memo(props => {
|
|
|
52
52
|
state,
|
|
53
53
|
dispatch
|
|
54
54
|
} = editorView;
|
|
55
|
+
if (expValEquals('platform_editor_table_menu_updates', 'isEnabled', true)) {
|
|
56
|
+
toggleContextualMenu()(state, dispatch);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
// Clicking outside the dropdown handles toggling the menu closed
|
|
56
61
|
// (otherwise these two toggles combat each other).
|
|
57
62
|
// In the event a user clicks the chevron button again
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { bind } from 'bind-event-listener';
|
|
3
|
+
import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
|
|
4
|
+
import { UserIntentPopupWrapper } from '@atlaskit/editor-common/user-intent';
|
|
5
|
+
import { setFocusToCellMenu, toggleContextualMenu } from '../../pm-plugins/commands';
|
|
6
|
+
import { TableCssClassName as ClassName } from '../../types';
|
|
7
|
+
import { CELL_MENU } from '../TableMenu/cell/keys';
|
|
8
|
+
import { TableMenu } from '../TableMenu/shared/TableMenu';
|
|
9
|
+
export const CellMenuPopup = ({
|
|
10
|
+
api,
|
|
11
|
+
editorView,
|
|
12
|
+
isCellMenuOpenByKeyboard,
|
|
13
|
+
isOpen,
|
|
14
|
+
targetCellRef
|
|
15
|
+
}) => {
|
|
16
|
+
const tableMenuRef = useRef(null);
|
|
17
|
+
const {
|
|
18
|
+
currentUserIntent
|
|
19
|
+
} = useSharedPluginStateWithSelector(api, ['userIntent'], states => {
|
|
20
|
+
var _states$userIntentSta;
|
|
21
|
+
return {
|
|
22
|
+
currentUserIntent: (_states$userIntentSta = states.userIntentState) === null || _states$userIntentSta === void 0 ? void 0 : _states$userIntentSta.currentUserIntent
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
const closeCellMenu = useCallback(() => {
|
|
26
|
+
const {
|
|
27
|
+
state,
|
|
28
|
+
dispatch,
|
|
29
|
+
dom
|
|
30
|
+
} = editorView;
|
|
31
|
+
toggleContextualMenu()(state, dispatch);
|
|
32
|
+
if (isCellMenuOpenByKeyboard) {
|
|
33
|
+
setFocusToCellMenu(false)(state, dispatch);
|
|
34
|
+
dom.focus();
|
|
35
|
+
}
|
|
36
|
+
}, [editorView, isCellMenuOpenByKeyboard]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!isOpen || currentUserIntent !== 'tableDragMenuPopupOpen') {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
closeCellMenu();
|
|
42
|
+
}, [closeCellMenu, currentUserIntent, isOpen]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!isOpen) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!(targetCellRef instanceof HTMLElement)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const ownerDocument = targetCellRef.ownerDocument;
|
|
51
|
+
const handlePointerDown = event => {
|
|
52
|
+
var _tableMenuRef$current;
|
|
53
|
+
const target = event.target;
|
|
54
|
+
if (!(target instanceof Node)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if ((_tableMenuRef$current = tableMenuRef.current) !== null && _tableMenuRef$current !== void 0 && _tableMenuRef$current.contains(target)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const cellMenuButton = ownerDocument.querySelector(`.${ClassName.CONTEXTUAL_MENU_BUTTON}`);
|
|
61
|
+
if (cellMenuButton !== null && cellMenuButton !== void 0 && cellMenuButton.contains(target)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
closeCellMenu();
|
|
65
|
+
};
|
|
66
|
+
const handleKeyDown = event => {
|
|
67
|
+
if (event.key === 'Escape') {
|
|
68
|
+
closeCellMenu();
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const unbindPointerDown = bind(ownerDocument, {
|
|
72
|
+
type: 'pointerdown',
|
|
73
|
+
listener: handlePointerDown,
|
|
74
|
+
options: {
|
|
75
|
+
capture: true
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const unbindKeyDown = bind(ownerDocument, {
|
|
79
|
+
type: 'keydown',
|
|
80
|
+
listener: handleKeyDown,
|
|
81
|
+
options: {
|
|
82
|
+
capture: true
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
return () => {
|
|
86
|
+
unbindPointerDown();
|
|
87
|
+
unbindKeyDown();
|
|
88
|
+
};
|
|
89
|
+
}, [closeCellMenu, isOpen, targetCellRef]);
|
|
90
|
+
return /*#__PURE__*/React.createElement(UserIntentPopupWrapper, {
|
|
91
|
+
api: api,
|
|
92
|
+
userIntent: "tableContextualMenuPopupOpen"
|
|
93
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
94
|
+
ref: tableMenuRef
|
|
95
|
+
}, /*#__PURE__*/React.createElement(TableMenu, {
|
|
96
|
+
api: api,
|
|
97
|
+
surface: CELL_MENU
|
|
98
|
+
})));
|
|
99
|
+
};
|