@atlaskit/editor-plugin-block-menu 5.2.10 → 5.2.11
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 +7 -0
- package/dist/cjs/editor-commands/transform-node-utils/transform.js +2 -2
- package/dist/cjs/editor-commands/transform-node-utils/utils.js +24 -4
- package/dist/cjs/editor-commands/transform-node-utils/wrapStep.js +20 -1
- package/dist/cjs/ui/block-menu-components.js +30 -20
- package/dist/cjs/ui/hooks/useSuggestedItems.js +57 -0
- package/dist/cjs/ui/suggested-items-menu-section.js +21 -0
- package/dist/cjs/ui/suggested-menu-items.js +19 -0
- package/dist/cjs/ui/utils/suggested-items-rank.js +1 -1
- package/dist/es2019/editor-commands/transform-node-utils/transform.js +2 -2
- package/dist/es2019/editor-commands/transform-node-utils/utils.js +23 -3
- package/dist/es2019/editor-commands/transform-node-utils/wrapStep.js +21 -1
- package/dist/es2019/ui/block-menu-components.js +12 -4
- package/dist/es2019/ui/hooks/useSuggestedItems.js +45 -0
- package/dist/es2019/ui/suggested-items-menu-section.js +15 -0
- package/dist/es2019/ui/suggested-menu-items.js +13 -0
- package/dist/es2019/ui/utils/suggested-items-rank.js +31 -43
- package/dist/esm/editor-commands/transform-node-utils/transform.js +2 -2
- package/dist/esm/editor-commands/transform-node-utils/utils.js +23 -3
- package/dist/esm/editor-commands/transform-node-utils/wrapStep.js +21 -1
- package/dist/esm/ui/block-menu-components.js +30 -20
- package/dist/esm/ui/hooks/useSuggestedItems.js +51 -0
- package/dist/esm/ui/suggested-items-menu-section.js +14 -0
- package/dist/esm/ui/suggested-menu-items.js +12 -0
- package/dist/esm/ui/utils/suggested-items-rank.js +2 -2
- package/dist/types/editor-commands/transform-node-utils/utils.d.ts +11 -0
- package/dist/types/editor-commands/transform-node-utils/wrapStep.d.ts +5 -0
- package/dist/types/ui/hooks/useSuggestedItems.d.ts +3 -0
- package/dist/types/ui/suggested-items-menu-section.d.ts +9 -0
- package/dist/{types-ts4.5/ui/suggested-items-renderer.d.ts → types/ui/suggested-menu-items.d.ts} +2 -2
- package/dist/types-ts4.5/editor-commands/transform-node-utils/utils.d.ts +11 -0
- package/dist/types-ts4.5/editor-commands/transform-node-utils/wrapStep.d.ts +5 -0
- package/dist/types-ts4.5/ui/hooks/useSuggestedItems.d.ts +3 -0
- package/dist/types-ts4.5/ui/suggested-items-menu-section.d.ts +9 -0
- package/dist/{types/ui/suggested-items-renderer.d.ts → types-ts4.5/ui/suggested-menu-items.d.ts} +2 -2
- package/package.json +3 -3
- package/dist/cjs/ui/suggested-items-renderer.js +0 -62
- package/dist/es2019/ui/suggested-items-renderer.js +0 -48
- package/dist/esm/ui/suggested-items-renderer.js +0 -54
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-block-menu
|
|
2
2
|
|
|
3
|
+
## 5.2.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`0c673432d72e9`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0c673432d72e9) -
|
|
8
|
+
[ux] Fix bug / make wrap of expand convert to nestedExpand node
|
|
9
|
+
|
|
3
10
|
## 5.2.10
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
|
@@ -89,9 +89,9 @@ var TRANSFORM_STEPS_OVERRIDE = {
|
|
|
89
89
|
decisionList: [_unwrapStep.unwrapStep, _wrapBlockquoteToDecisionListStep.wrapBlockquoteToDecisionListStep]
|
|
90
90
|
},
|
|
91
91
|
layoutSection: {
|
|
92
|
-
blockquote: [_unwrapLayoutStep.unwrapLayoutStep,
|
|
92
|
+
blockquote: [_unwrapLayoutStep.unwrapLayoutStep, _wrapMixedContentStep.wrapMixedContentStep],
|
|
93
93
|
expand: [_unwrapLayoutStep.unwrapLayoutStep, _wrapStep.wrapStep],
|
|
94
|
-
panel: [_unwrapLayoutStep.unwrapLayoutStep,
|
|
94
|
+
panel: [_unwrapLayoutStep.unwrapLayoutStep, _wrapMixedContentStep.wrapMixedContentStep],
|
|
95
95
|
codeBlock: [_unwrapLayoutStep.unwrapLayoutStep, _flattenStep.flattenStep, _wrapStep.wrapStep],
|
|
96
96
|
paragraph: [_unwrapLayoutStep.unwrapLayoutStep]
|
|
97
97
|
},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isListType = exports.getTargetNodeTypeNameInContext = exports.getSelectedNode = exports.getBlockNodesInRange = exports.expandSelectionToBlockRange = exports.convertNestedExpandToExpand = void 0;
|
|
6
|
+
exports.isListType = exports.getTargetNodeTypeNameInContext = exports.getSelectedNode = exports.getBlockNodesInRange = exports.expandSelectionToBlockRange = exports.convertNestedExpandToExpand = exports.convertExpandToNestedExpand = void 0;
|
|
7
7
|
var _selection = require("@atlaskit/editor-common/selection");
|
|
8
8
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
9
9
|
var _utils = require("@atlaskit/editor-prosemirror/utils");
|
|
@@ -67,7 +67,7 @@ var getTargetNodeTypeNameInContext = exports.getTargetNodeTypeNameInContext = fu
|
|
|
67
67
|
*/
|
|
68
68
|
var expandSelectionToBlockRange = exports.expandSelectionToBlockRange = function expandSelectionToBlockRange(selection, schema) {
|
|
69
69
|
var nodes = schema.nodes;
|
|
70
|
-
var nodesNeedToExpandRange = [nodes.listItem, nodes.taskItem];
|
|
70
|
+
var nodesNeedToExpandRange = [nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.listItem, nodes.taskItem];
|
|
71
71
|
|
|
72
72
|
// when adding nodes.tableRow, tableHeader, tableCell in nodesNeedToExpandRang,
|
|
73
73
|
// expandToBlockRange does not return expected table start position, sometimes even freeze editor
|
|
@@ -76,10 +76,11 @@ var expandSelectionToBlockRange = exports.expandSelectionToBlockRange = function
|
|
|
76
76
|
var table = (0, _utils2.findTable)(selection);
|
|
77
77
|
if (table) {
|
|
78
78
|
var $from = selection.$from.doc.resolve(table.pos);
|
|
79
|
-
var $to = selection.$from.doc.resolve(table.pos + table.node.nodeSize);
|
|
79
|
+
var $to = selection.$from.doc.resolve(table.pos + table.node.nodeSize - 1);
|
|
80
80
|
return {
|
|
81
81
|
$from: $from,
|
|
82
|
-
$to: $to
|
|
82
|
+
$to: $to,
|
|
83
|
+
range: $from.blockRange($to)
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
}
|
|
@@ -128,7 +129,26 @@ var convertNestedExpandToExpand = exports.convertNestedExpandToExpand = function
|
|
|
128
129
|
title: ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.title) || ''
|
|
129
130
|
}, node.content);
|
|
130
131
|
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Converts an expand to a nestedExpand node.
|
|
135
|
+
* When placing an expand inside another expand, it must become a nestedExpand
|
|
136
|
+
* since expand cannot be a direct child of expand.
|
|
137
|
+
*/
|
|
138
|
+
var convertExpandToNestedExpand = exports.convertExpandToNestedExpand = function convertExpandToNestedExpand(node, schema) {
|
|
139
|
+
var _node$attrs2;
|
|
140
|
+
var nestedExpandType = schema.nodes.nestedExpand;
|
|
141
|
+
if (!nestedExpandType) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return nestedExpandType.createAndFill({
|
|
145
|
+
title: ((_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.title) || ''
|
|
146
|
+
}, node.content);
|
|
147
|
+
};
|
|
131
148
|
var getBlockNodesInRange = exports.getBlockNodesInRange = function getBlockNodesInRange(range) {
|
|
149
|
+
if (range.startIndex === range.endIndex) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
132
152
|
if (range.endIndex - range.startIndex <= 1) {
|
|
133
153
|
return [range.parent.child(range.startIndex)];
|
|
134
154
|
}
|
|
@@ -4,10 +4,29 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.wrapStep = void 0;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
/**
|
|
9
|
+
* Wraps nodes into the target container type.
|
|
10
|
+
* When wrapping into expand, any expand children are converted to nestedExpand
|
|
11
|
+
* since expand cannot be a direct child of expand.
|
|
12
|
+
*/
|
|
7
13
|
var wrapStep = exports.wrapStep = function wrapStep(nodes, context) {
|
|
8
14
|
var schema = context.schema,
|
|
9
15
|
targetNodeTypeName = context.targetNodeTypeName;
|
|
10
|
-
|
|
16
|
+
|
|
17
|
+
// When wrapping into expand, convert any expand children to nestedExpand
|
|
18
|
+
// since expand cannot be a direct child of expand
|
|
19
|
+
var processedNodes = nodes;
|
|
20
|
+
if (targetNodeTypeName === 'expand') {
|
|
21
|
+
processedNodes = nodes.map(function (node) {
|
|
22
|
+
if (node.type.name === 'expand') {
|
|
23
|
+
var nestedExpandNode = (0, _utils.convertExpandToNestedExpand)(node, schema);
|
|
24
|
+
return nestedExpandNode !== null && nestedExpandNode !== void 0 ? nestedExpandNode : node;
|
|
25
|
+
}
|
|
26
|
+
return node;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
var outputNode = schema.nodes[targetNodeTypeName].createAndFill({}, processedNodes);
|
|
11
30
|
if (outputNode) {
|
|
12
31
|
return [outputNode];
|
|
13
32
|
}
|
|
@@ -17,7 +17,8 @@ var _formatMenuNested = require("./format-menu-nested");
|
|
|
17
17
|
var _formatMenuSection = require("./format-menu-section");
|
|
18
18
|
var _moveDown = require("./move-down");
|
|
19
19
|
var _moveUp = require("./move-up");
|
|
20
|
-
var
|
|
20
|
+
var _suggestedItemsMenuSection = require("./suggested-items-menu-section");
|
|
21
|
+
var _suggestedMenuItems = require("./suggested-menu-items");
|
|
21
22
|
var getMoveUpMoveDownMenuComponents = function getMoveUpMoveDownMenuComponents(api) {
|
|
22
23
|
return [{
|
|
23
24
|
type: 'block-menu-item',
|
|
@@ -74,9 +75,13 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
74
75
|
rank: _blockMenu.TRANSFORM_MENU_ITEM_RANK[_blockMenu.TRANSFORM_SUGGESTED_MENU_SECTION.key]
|
|
75
76
|
},
|
|
76
77
|
component: function component() {
|
|
77
|
-
|
|
78
|
+
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
79
|
+
children: null
|
|
80
|
+
},
|
|
81
|
+
children = _ref2.children;
|
|
82
|
+
return /*#__PURE__*/_react.default.createElement(_suggestedItemsMenuSection.SuggestedItemsMenuSection, {
|
|
78
83
|
api: api
|
|
79
|
-
});
|
|
84
|
+
}, children);
|
|
80
85
|
}
|
|
81
86
|
}, {
|
|
82
87
|
type: 'block-menu-item',
|
|
@@ -85,6 +90,11 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
85
90
|
type: 'block-menu-section',
|
|
86
91
|
key: _blockMenu.TRANSFORM_SUGGESTED_MENU_SECTION.key,
|
|
87
92
|
rank: _blockMenu.TRANSFORM_SUGGESTED_MENU_SECTION_RANK[_blockMenu.TRANSFORM_SUGGESTED_MENU_ITEM.key]
|
|
93
|
+
},
|
|
94
|
+
component: function component() {
|
|
95
|
+
return /*#__PURE__*/_react.default.createElement(_suggestedMenuItems.SuggestedMenuItems, {
|
|
96
|
+
api: api
|
|
97
|
+
});
|
|
88
98
|
}
|
|
89
99
|
}, {
|
|
90
100
|
type: 'block-menu-section',
|
|
@@ -95,10 +105,10 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
95
105
|
rank: _blockMenu.TRANSFORM_MENU_ITEM_RANK[_blockMenu.TRANSFORM_CREATE_MENU_SECTION.key]
|
|
96
106
|
},
|
|
97
107
|
component: function component() {
|
|
98
|
-
var
|
|
108
|
+
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
99
109
|
children: null
|
|
100
110
|
},
|
|
101
|
-
children =
|
|
111
|
+
children = _ref3.children;
|
|
102
112
|
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
103
113
|
title: "Create"
|
|
104
114
|
}, children);
|
|
@@ -112,10 +122,10 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
112
122
|
rank: _blockMenu.TRANSFORM_MENU_ITEM_RANK[_blockMenu.TRANSFORM_STRUCTURE_MENU_SECTION.key]
|
|
113
123
|
},
|
|
114
124
|
component: function component() {
|
|
115
|
-
var
|
|
125
|
+
var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
116
126
|
children: null
|
|
117
127
|
},
|
|
118
|
-
children =
|
|
128
|
+
children = _ref4.children;
|
|
119
129
|
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
120
130
|
title: "Structure"
|
|
121
131
|
}, children);
|
|
@@ -129,10 +139,10 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
129
139
|
rank: _blockMenu.TRANSFORM_MENU_ITEM_RANK[_blockMenu.TRANSFORM_HEADINGS_MENU_SECTION.key]
|
|
130
140
|
},
|
|
131
141
|
component: function component() {
|
|
132
|
-
var
|
|
142
|
+
var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
133
143
|
children: null
|
|
134
144
|
},
|
|
135
|
-
children =
|
|
145
|
+
children = _ref5.children;
|
|
136
146
|
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
137
147
|
title: "Headings",
|
|
138
148
|
hasSeparator: true
|
|
@@ -142,23 +152,23 @@ var getTurnIntoMenuComponents = function getTurnIntoMenuComponents(api) {
|
|
|
142
152
|
type: 'block-menu-section',
|
|
143
153
|
key: _blockMenu.TRANSFORM_MENU_SECTION.key,
|
|
144
154
|
rank: _blockMenu.MAIN_BLOCK_MENU_SECTION_RANK[_blockMenu.TRANSFORM_MENU_SECTION.key],
|
|
145
|
-
component: function component(
|
|
146
|
-
var children =
|
|
155
|
+
component: function component(_ref6) {
|
|
156
|
+
var children = _ref6.children;
|
|
147
157
|
return /*#__PURE__*/_react.default.createElement(_formatMenuSection.FormatMenuSection, {
|
|
148
158
|
api: api
|
|
149
159
|
}, children);
|
|
150
160
|
}
|
|
151
161
|
}];
|
|
152
162
|
};
|
|
153
|
-
var getBlockMenuComponents = exports.getBlockMenuComponents = function getBlockMenuComponents(
|
|
154
|
-
var api =
|
|
155
|
-
config =
|
|
163
|
+
var getBlockMenuComponents = exports.getBlockMenuComponents = function getBlockMenuComponents(_ref7) {
|
|
164
|
+
var api = _ref7.api,
|
|
165
|
+
config = _ref7.config;
|
|
156
166
|
return [].concat((0, _toConsumableArray2.default)(getTurnIntoMenuComponents(api)), [{
|
|
157
167
|
type: 'block-menu-section',
|
|
158
168
|
key: _blockMenu.BLOCK_ACTIONS_MENU_SECTION.key,
|
|
159
169
|
rank: _blockMenu.MAIN_BLOCK_MENU_SECTION_RANK[_blockMenu.BLOCK_ACTIONS_MENU_SECTION.key],
|
|
160
|
-
component: function component(
|
|
161
|
-
var children =
|
|
170
|
+
component: function component(_ref8) {
|
|
171
|
+
var children = _ref8.children;
|
|
162
172
|
return /*#__PURE__*/_react.default.createElement(_copySection.CopySection, {
|
|
163
173
|
api: api
|
|
164
174
|
}, children);
|
|
@@ -181,8 +191,8 @@ var getBlockMenuComponents = exports.getBlockMenuComponents = function getBlockM
|
|
|
181
191
|
type: 'block-menu-section',
|
|
182
192
|
key: _blockMenu.POSITION_MENU_SECTION.key,
|
|
183
193
|
rank: _blockMenu.MAIN_BLOCK_MENU_SECTION_RANK[_blockMenu.POSITION_MENU_SECTION.key],
|
|
184
|
-
component: function component(
|
|
185
|
-
var children =
|
|
194
|
+
component: function component(_ref9) {
|
|
195
|
+
var children = _ref9.children;
|
|
186
196
|
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
187
197
|
hasSeparator: true
|
|
188
198
|
}, children);
|
|
@@ -191,8 +201,8 @@ var getBlockMenuComponents = exports.getBlockMenuComponents = function getBlockM
|
|
|
191
201
|
type: 'block-menu-section',
|
|
192
202
|
key: _blockMenu.DELETE_MENU_SECTION.key,
|
|
193
203
|
rank: _blockMenu.MAIN_BLOCK_MENU_SECTION_RANK[_blockMenu.DELETE_MENU_SECTION.key],
|
|
194
|
-
component: function component(
|
|
195
|
-
var children =
|
|
204
|
+
component: function component(_ref0) {
|
|
205
|
+
var children = _ref0.children;
|
|
196
206
|
return /*#__PURE__*/_react.default.createElement(_deleteSection.DeleteSection, {
|
|
197
207
|
api: api
|
|
198
208
|
}, children);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useSuggestedItems = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _hooks = require("@atlaskit/editor-common/hooks");
|
|
9
|
+
var _utils = require("../../editor-commands/transform-node-utils/utils");
|
|
10
|
+
var _suggestedItemsRank = require("../utils/suggested-items-rank");
|
|
11
|
+
var useSuggestedItems = exports.useSuggestedItems = function useSuggestedItems(api) {
|
|
12
|
+
var _api$blockMenu;
|
|
13
|
+
var _useSharedPluginState = (0, _hooks.useSharedPluginStateWithSelector)(api, ['blockControls', 'selection'], function (states) {
|
|
14
|
+
var _states$blockControls, _states$selectionStat;
|
|
15
|
+
return {
|
|
16
|
+
preservedSelection: (_states$blockControls = states.blockControlsState) === null || _states$blockControls === void 0 ? void 0 : _states$blockControls.preservedSelection,
|
|
17
|
+
selection: (_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection
|
|
18
|
+
};
|
|
19
|
+
}),
|
|
20
|
+
preservedSelection = _useSharedPluginState.preservedSelection,
|
|
21
|
+
selection = _useSharedPluginState.selection;
|
|
22
|
+
var blockMenuComponents = api === null || api === void 0 || (_api$blockMenu = api.blockMenu) === null || _api$blockMenu === void 0 ? void 0 : _api$blockMenu.actions.getBlockMenuComponents();
|
|
23
|
+
var menuItemsMap = (0, _react.useMemo)(function () {
|
|
24
|
+
if (!blockMenuComponents) {
|
|
25
|
+
return new Map();
|
|
26
|
+
}
|
|
27
|
+
return new Map(blockMenuComponents.filter(function (c) {
|
|
28
|
+
return c.type === 'block-menu-item';
|
|
29
|
+
}).map(function (item) {
|
|
30
|
+
return [item.key, item];
|
|
31
|
+
}));
|
|
32
|
+
}, [blockMenuComponents]);
|
|
33
|
+
var suggestedItems = (0, _react.useMemo)(function () {
|
|
34
|
+
var currentSelection = preservedSelection || selection;
|
|
35
|
+
if (menuItemsMap.size === 0 || !currentSelection) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
var _expandSelectionToBlo = (0, _utils.expandSelectionToBlockRange)(currentSelection, currentSelection.$from.doc.type.schema),
|
|
39
|
+
range = _expandSelectionToBlo.range;
|
|
40
|
+
if (!range) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
var blockNodes = (0, _utils.getBlockNodesInRange)(range);
|
|
44
|
+
var singleNode = blockNodes.length === 1 ? blockNodes[0] : undefined;
|
|
45
|
+
if (!singleNode) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
var nodeTypeName = singleNode.type.name;
|
|
49
|
+
var sortedKeys = (0, _suggestedItemsRank.getSortedSuggestedItems)(nodeTypeName);
|
|
50
|
+
return sortedKeys.map(function (key) {
|
|
51
|
+
return menuItemsMap.get(key);
|
|
52
|
+
}).filter(function (item) {
|
|
53
|
+
return item !== undefined;
|
|
54
|
+
});
|
|
55
|
+
}, [menuItemsMap, preservedSelection, selection]);
|
|
56
|
+
return suggestedItems;
|
|
57
|
+
};
|
|
@@ -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.SuggestedItemsMenuSection = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
10
|
+
var _useSuggestedItems = require("./hooks/useSuggestedItems");
|
|
11
|
+
var SuggestedItemsMenuSection = exports.SuggestedItemsMenuSection = /*#__PURE__*/_react.default.memo(function (_ref) {
|
|
12
|
+
var api = _ref.api,
|
|
13
|
+
children = _ref.children;
|
|
14
|
+
var suggestedItems = (0, _useSuggestedItems.useSuggestedItems)(api);
|
|
15
|
+
if (suggestedItems.length === 0) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, {
|
|
19
|
+
title: "Suggested"
|
|
20
|
+
}, children);
|
|
21
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.SuggestedMenuItems = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _useSuggestedItems = require("./hooks/useSuggestedItems");
|
|
10
|
+
var SuggestedMenuItems = exports.SuggestedMenuItems = /*#__PURE__*/_react.default.memo(function (_ref) {
|
|
11
|
+
var api = _ref.api;
|
|
12
|
+
var suggestedItems = (0, _useSuggestedItems.useSuggestedItems)(api);
|
|
13
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, suggestedItems.map(function (item) {
|
|
14
|
+
var ItemComponent = item.component;
|
|
15
|
+
return ItemComponent ? /*#__PURE__*/_react.default.createElement(ItemComponent, {
|
|
16
|
+
key: item.key
|
|
17
|
+
}) : null;
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
@@ -43,7 +43,7 @@ var BLOCK_MENU_NODE_TYPES = exports.BLOCK_MENU_NODE_TYPES = {
|
|
|
43
43
|
EMBED_CARD: 'embedCard',
|
|
44
44
|
TABLE: 'table'
|
|
45
45
|
};
|
|
46
|
-
var TRANSFORM_SUGGESTED_ITEMS_RANK = exports.TRANSFORM_SUGGESTED_ITEMS_RANK = (_TRANSFORM_SUGGESTED_ = {}, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)(_TRANSFORM_SUGGESTED_, BLOCK_MENU_NODE_TYPES.PARAGRAPH, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.
|
|
46
|
+
var TRANSFORM_SUGGESTED_ITEMS_RANK = exports.TRANSFORM_SUGGESTED_ITEMS_RANK = (_TRANSFORM_SUGGESTED_ = {}, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)(_TRANSFORM_SUGGESTED_, BLOCK_MENU_NODE_TYPES.PARAGRAPH, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_HEADINGS_H1_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_HEADINGS_H2_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.EXPAND, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PARAGRAPH_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.BLOCKQUOTE, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.LAYOUT_SECTION, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PARAGRAPH_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.PANEL, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_QUOTE_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_CODE_BLOCK_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.CODE_BLOCK, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PARAGRAPH_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.DECISION, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_QUOTE_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.BULLET_LIST, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_NUMBERED_LIST_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_QUOTE_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.ORDERED_LIST, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_TASK_LIST_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_BULLETED_LIST_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.HEADING, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PARAGRAPH_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_BULLETED_LIST_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_QUOTE_MENU_ITEM.key, 300)), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)(_TRANSFORM_SUGGESTED_, BLOCK_MENU_NODE_TYPES.TASK_LIST, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_NUMBERED_LIST_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_BULLETED_LIST_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.MEDIA_SINGLE, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_QUOTE_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.EXTENSION, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key, 300)), BLOCK_MENU_NODE_TYPES.BODIED_EXTENSION, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _blockMenu.TRANSFORM_STRUCTURE_EXPAND_MENU_ITEM.key, 100), _blockMenu.TRANSFORM_STRUCTURE_PANEL_MENU_ITEM.key, 200), _blockMenu.TRANSFORM_STRUCTURE_LAYOUT_MENU_ITEM.key, 300)));
|
|
47
47
|
var getSuggestedItemsForNodeType = exports.getSuggestedItemsForNodeType = function getSuggestedItemsForNodeType(nodeType) {
|
|
48
48
|
return TRANSFORM_SUGGESTED_ITEMS_RANK[nodeType];
|
|
49
49
|
};
|
|
@@ -84,9 +84,9 @@ const TRANSFORM_STEPS_OVERRIDE = {
|
|
|
84
84
|
decisionList: [unwrapStep, wrapBlockquoteToDecisionListStep]
|
|
85
85
|
},
|
|
86
86
|
layoutSection: {
|
|
87
|
-
blockquote: [unwrapLayoutStep,
|
|
87
|
+
blockquote: [unwrapLayoutStep, wrapMixedContentStep],
|
|
88
88
|
expand: [unwrapLayoutStep, wrapStep],
|
|
89
|
-
panel: [unwrapLayoutStep,
|
|
89
|
+
panel: [unwrapLayoutStep, wrapMixedContentStep],
|
|
90
90
|
codeBlock: [unwrapLayoutStep, flattenStep, wrapStep],
|
|
91
91
|
paragraph: [unwrapLayoutStep]
|
|
92
92
|
},
|
|
@@ -64,7 +64,7 @@ export const expandSelectionToBlockRange = (selection, schema) => {
|
|
|
64
64
|
const {
|
|
65
65
|
nodes
|
|
66
66
|
} = schema;
|
|
67
|
-
const nodesNeedToExpandRange = [nodes.listItem, nodes.taskItem];
|
|
67
|
+
const nodesNeedToExpandRange = [nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.listItem, nodes.taskItem];
|
|
68
68
|
|
|
69
69
|
// when adding nodes.tableRow, tableHeader, tableCell in nodesNeedToExpandRang,
|
|
70
70
|
// expandToBlockRange does not return expected table start position, sometimes even freeze editor
|
|
@@ -73,10 +73,11 @@ export const expandSelectionToBlockRange = (selection, schema) => {
|
|
|
73
73
|
const table = findTable(selection);
|
|
74
74
|
if (table) {
|
|
75
75
|
const $from = selection.$from.doc.resolve(table.pos);
|
|
76
|
-
const $to = selection.$from.doc.resolve(table.pos + table.node.nodeSize);
|
|
76
|
+
const $to = selection.$from.doc.resolve(table.pos + table.node.nodeSize - 1);
|
|
77
77
|
return {
|
|
78
78
|
$from,
|
|
79
|
-
$to
|
|
79
|
+
$to,
|
|
80
|
+
range: $from.blockRange($to)
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
83
|
}
|
|
@@ -123,7 +124,26 @@ export const convertNestedExpandToExpand = (node, schema) => {
|
|
|
123
124
|
title: ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.title) || ''
|
|
124
125
|
}, node.content);
|
|
125
126
|
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Converts an expand to a nestedExpand node.
|
|
130
|
+
* When placing an expand inside another expand, it must become a nestedExpand
|
|
131
|
+
* since expand cannot be a direct child of expand.
|
|
132
|
+
*/
|
|
133
|
+
export const convertExpandToNestedExpand = (node, schema) => {
|
|
134
|
+
var _node$attrs2;
|
|
135
|
+
const nestedExpandType = schema.nodes.nestedExpand;
|
|
136
|
+
if (!nestedExpandType) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return nestedExpandType.createAndFill({
|
|
140
|
+
title: ((_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.title) || ''
|
|
141
|
+
}, node.content);
|
|
142
|
+
};
|
|
126
143
|
export const getBlockNodesInRange = range => {
|
|
144
|
+
if (range.startIndex === range.endIndex) {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
127
147
|
if (range.endIndex - range.startIndex <= 1) {
|
|
128
148
|
return [range.parent.child(range.startIndex)];
|
|
129
149
|
}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
|
+
import { convertExpandToNestedExpand } from './utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wraps nodes into the target container type.
|
|
5
|
+
* When wrapping into expand, any expand children are converted to nestedExpand
|
|
6
|
+
* since expand cannot be a direct child of expand.
|
|
7
|
+
*/
|
|
1
8
|
export const wrapStep = (nodes, context) => {
|
|
2
9
|
const {
|
|
3
10
|
schema,
|
|
4
11
|
targetNodeTypeName
|
|
5
12
|
} = context;
|
|
6
|
-
|
|
13
|
+
|
|
14
|
+
// When wrapping into expand, convert any expand children to nestedExpand
|
|
15
|
+
// since expand cannot be a direct child of expand
|
|
16
|
+
let processedNodes = nodes;
|
|
17
|
+
if (targetNodeTypeName === 'expand') {
|
|
18
|
+
processedNodes = nodes.map(node => {
|
|
19
|
+
if (node.type.name === 'expand') {
|
|
20
|
+
const nestedExpandNode = convertExpandToNestedExpand(node, schema);
|
|
21
|
+
return nestedExpandNode !== null && nestedExpandNode !== void 0 ? nestedExpandNode : node;
|
|
22
|
+
}
|
|
23
|
+
return node;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const outputNode = schema.nodes[targetNodeTypeName].createAndFill({}, processedNodes);
|
|
7
27
|
if (outputNode) {
|
|
8
28
|
return [outputNode];
|
|
9
29
|
}
|
|
@@ -9,7 +9,8 @@ import { FormatMenuComponent } from './format-menu-nested';
|
|
|
9
9
|
import { FormatMenuSection } from './format-menu-section';
|
|
10
10
|
import { MoveDownDropdownItem } from './move-down';
|
|
11
11
|
import { MoveUpDropdownItem } from './move-up';
|
|
12
|
-
import {
|
|
12
|
+
import { SuggestedItemsMenuSection } from './suggested-items-menu-section';
|
|
13
|
+
import { SuggestedMenuItems } from './suggested-menu-items';
|
|
13
14
|
const getMoveUpMoveDownMenuComponents = api => {
|
|
14
15
|
return [{
|
|
15
16
|
type: 'block-menu-item',
|
|
@@ -61,9 +62,13 @@ const getTurnIntoMenuComponents = api => {
|
|
|
61
62
|
key: TRANSFORM_MENU_ITEM.key,
|
|
62
63
|
rank: TRANSFORM_MENU_ITEM_RANK[TRANSFORM_SUGGESTED_MENU_SECTION.key]
|
|
63
64
|
},
|
|
64
|
-
component: (
|
|
65
|
+
component: ({
|
|
66
|
+
children
|
|
67
|
+
} = {
|
|
68
|
+
children: null
|
|
69
|
+
}) => /*#__PURE__*/React.createElement(SuggestedItemsMenuSection, {
|
|
65
70
|
api: api
|
|
66
|
-
})
|
|
71
|
+
}, children)
|
|
67
72
|
}, {
|
|
68
73
|
type: 'block-menu-item',
|
|
69
74
|
key: TRANSFORM_SUGGESTED_MENU_ITEM.key,
|
|
@@ -71,7 +76,10 @@ const getTurnIntoMenuComponents = api => {
|
|
|
71
76
|
type: 'block-menu-section',
|
|
72
77
|
key: TRANSFORM_SUGGESTED_MENU_SECTION.key,
|
|
73
78
|
rank: TRANSFORM_SUGGESTED_MENU_SECTION_RANK[TRANSFORM_SUGGESTED_MENU_ITEM.key]
|
|
74
|
-
}
|
|
79
|
+
},
|
|
80
|
+
component: () => /*#__PURE__*/React.createElement(SuggestedMenuItems, {
|
|
81
|
+
api: api
|
|
82
|
+
})
|
|
75
83
|
}, {
|
|
76
84
|
type: 'block-menu-section',
|
|
77
85
|
key: TRANSFORM_CREATE_MENU_SECTION.key,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
|
|
3
|
+
import { getBlockNodesInRange, expandSelectionToBlockRange } from '../../editor-commands/transform-node-utils/utils';
|
|
4
|
+
import { getSortedSuggestedItems } from '../utils/suggested-items-rank';
|
|
5
|
+
export const useSuggestedItems = api => {
|
|
6
|
+
var _api$blockMenu;
|
|
7
|
+
const {
|
|
8
|
+
preservedSelection,
|
|
9
|
+
selection
|
|
10
|
+
} = useSharedPluginStateWithSelector(api, ['blockControls', 'selection'], states => {
|
|
11
|
+
var _states$blockControls, _states$selectionStat;
|
|
12
|
+
return {
|
|
13
|
+
preservedSelection: (_states$blockControls = states.blockControlsState) === null || _states$blockControls === void 0 ? void 0 : _states$blockControls.preservedSelection,
|
|
14
|
+
selection: (_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
const blockMenuComponents = api === null || api === void 0 ? void 0 : (_api$blockMenu = api.blockMenu) === null || _api$blockMenu === void 0 ? void 0 : _api$blockMenu.actions.getBlockMenuComponents();
|
|
18
|
+
const menuItemsMap = useMemo(() => {
|
|
19
|
+
if (!blockMenuComponents) {
|
|
20
|
+
return new Map();
|
|
21
|
+
}
|
|
22
|
+
return new Map(blockMenuComponents.filter(c => c.type === 'block-menu-item').map(item => [item.key, item]));
|
|
23
|
+
}, [blockMenuComponents]);
|
|
24
|
+
const suggestedItems = useMemo(() => {
|
|
25
|
+
const currentSelection = preservedSelection || selection;
|
|
26
|
+
if (menuItemsMap.size === 0 || !currentSelection) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const {
|
|
30
|
+
range
|
|
31
|
+
} = expandSelectionToBlockRange(currentSelection, currentSelection.$from.doc.type.schema);
|
|
32
|
+
if (!range) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
const blockNodes = getBlockNodesInRange(range);
|
|
36
|
+
const singleNode = blockNodes.length === 1 ? blockNodes[0] : undefined;
|
|
37
|
+
if (!singleNode) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const nodeTypeName = singleNode.type.name;
|
|
41
|
+
const sortedKeys = getSortedSuggestedItems(nodeTypeName);
|
|
42
|
+
return sortedKeys.map(key => menuItemsMap.get(key)).filter(item => item !== undefined);
|
|
43
|
+
}, [menuItemsMap, preservedSelection, selection]);
|
|
44
|
+
return suggestedItems;
|
|
45
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ToolbarDropdownItemSection } from '@atlaskit/editor-toolbar';
|
|
3
|
+
import { useSuggestedItems } from './hooks/useSuggestedItems';
|
|
4
|
+
export const SuggestedItemsMenuSection = /*#__PURE__*/React.memo(({
|
|
5
|
+
api,
|
|
6
|
+
children
|
|
7
|
+
}) => {
|
|
8
|
+
const suggestedItems = useSuggestedItems(api);
|
|
9
|
+
if (suggestedItems.length === 0) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return /*#__PURE__*/React.createElement(ToolbarDropdownItemSection, {
|
|
13
|
+
title: "Suggested"
|
|
14
|
+
}, children);
|
|
15
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useSuggestedItems } from './hooks/useSuggestedItems';
|
|
3
|
+
export const SuggestedMenuItems = /*#__PURE__*/React.memo(({
|
|
4
|
+
api
|
|
5
|
+
}) => {
|
|
6
|
+
const suggestedItems = useSuggestedItems(api);
|
|
7
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, suggestedItems.map(item => {
|
|
8
|
+
const ItemComponent = item.component;
|
|
9
|
+
return ItemComponent ? /*#__PURE__*/React.createElement(ItemComponent, {
|
|
10
|
+
key: item.key
|
|
11
|
+
}) : null;
|
|
12
|
+
}));
|
|
13
|
+
});
|