@atlaskit/editor-plugin-selection-extension 4.0.0 → 4.1.1
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 +18 -0
- package/dist/cjs/pm-plugins/utils/index.js +23 -0
- package/dist/cjs/selectionExtensionPlugin.js +15 -5
- package/dist/cjs/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
- package/dist/cjs/ui/toolbar-components/MenuItem.js +57 -0
- package/dist/cjs/ui/toolbar-components/ToolbarButton.js +29 -0
- package/dist/cjs/ui/toolbar-components/ToolbarMenu.js +30 -0
- package/dist/cjs/ui/toolbar-components/register-inline-toolbar.js +114 -0
- package/dist/cjs/ui/toolbar-components.js +80 -0
- package/dist/cjs/ui/utils/migrate-selection-extention.js +52 -0
- package/dist/es2019/pm-plugins/utils/index.js +25 -0
- package/dist/es2019/selectionExtensionPlugin.js +12 -2
- package/dist/es2019/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
- package/dist/es2019/ui/toolbar-components/MenuItem.js +52 -0
- package/dist/es2019/ui/toolbar-components/ToolbarButton.js +23 -0
- package/dist/es2019/ui/toolbar-components/ToolbarMenu.js +24 -0
- package/dist/es2019/ui/toolbar-components/register-inline-toolbar.js +110 -0
- package/dist/es2019/ui/toolbar-components.js +67 -0
- package/dist/es2019/ui/utils/migrate-selection-extention.js +46 -0
- package/dist/esm/pm-plugins/utils/index.js +22 -0
- package/dist/esm/selectionExtensionPlugin.js +15 -5
- package/dist/esm/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
- package/dist/esm/ui/toolbar-components/MenuItem.js +50 -0
- package/dist/esm/ui/toolbar-components/ToolbarButton.js +22 -0
- package/dist/esm/ui/toolbar-components/ToolbarMenu.js +23 -0
- package/dist/esm/ui/toolbar-components/register-inline-toolbar.js +107 -0
- package/dist/esm/ui/toolbar-components.js +73 -0
- package/dist/esm/ui/utils/migrate-selection-extention.js +46 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/pm-plugins/utils/index.d.ts +2 -1
- package/dist/types/selectionExtensionPluginType.d.ts +4 -2
- package/dist/types/ui/toolbar-components/MenuItem.d.ts +10 -0
- package/dist/types/ui/toolbar-components/ToolbarButton.d.ts +10 -0
- package/dist/types/ui/toolbar-components/ToolbarMenu.d.ts +10 -0
- package/dist/types/ui/toolbar-components/register-inline-toolbar.d.ts +11 -0
- package/dist/types/ui/toolbar-components.d.ts +11 -0
- package/dist/types/ui/utils/migrate-selection-extention.d.ts +14 -0
- package/dist/types-ts4.5/index.d.ts +1 -1
- package/dist/types-ts4.5/pm-plugins/utils/index.d.ts +2 -1
- package/dist/types-ts4.5/selectionExtensionPluginType.d.ts +4 -2
- package/dist/types-ts4.5/ui/toolbar-components/MenuItem.d.ts +10 -0
- package/dist/types-ts4.5/ui/toolbar-components/ToolbarButton.d.ts +10 -0
- package/dist/types-ts4.5/ui/toolbar-components/ToolbarMenu.d.ts +10 -0
- package/dist/types-ts4.5/ui/toolbar-components/register-inline-toolbar.d.ts +11 -0
- package/dist/types-ts4.5/ui/toolbar-components.d.ts +11 -0
- package/dist/types-ts4.5/ui/utils/migrate-selection-extention.d.ts +14 -0
- package/package.json +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-selection-extension
|
|
2
2
|
|
|
3
|
+
## 4.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
|
|
9
|
+
## 4.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`50976babce55d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/50976babce55d) -
|
|
14
|
+
Add new 'onClick' to dropdown menu, hook up new toolbar api to regsiter components on selection
|
|
15
|
+
change, add new safeRegistry method to replace existing objects
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
|
|
3
21
|
## 4.0.0
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.getFragmentInfoFromSelection = void 0;
|
|
8
8
|
exports.getSelectionAdfInfo = getSelectionAdfInfo;
|
|
9
|
+
exports.getSelectionAdfInfoNew = getSelectionAdfInfoNew;
|
|
9
10
|
exports.getSelectionTextInfo = void 0;
|
|
10
11
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
12
|
var _monitoring = require("@atlaskit/editor-common/monitoring");
|
|
@@ -131,4 +132,26 @@ function getSelectionAdfInfo(state) {
|
|
|
131
132
|
return _objectSpread(_objectSpread({}, selectionInfo), {}, {
|
|
132
133
|
selectedNodeAdf: selectedNodeAdf
|
|
133
134
|
});
|
|
135
|
+
}
|
|
136
|
+
function getSelectionAdfInfoNew(selection) {
|
|
137
|
+
var selectionInfo = {
|
|
138
|
+
selectedNode: selection.$from.node(),
|
|
139
|
+
nodePos: selection.$from.depth > 0 ? selection.$from.before() : selection.from
|
|
140
|
+
};
|
|
141
|
+
if (selection instanceof _state.TextSelection) {
|
|
142
|
+
var $from = selection.$from,
|
|
143
|
+
$to = selection.$to;
|
|
144
|
+
if ($from.parent === $to.parent) {
|
|
145
|
+
selectionInfo = getSelectionInfoFromSameNode(selection);
|
|
146
|
+
} else {
|
|
147
|
+
// TODO: ED-28405 - when selection spans multiple nodes including nested node, we need to iterate through the nodes
|
|
148
|
+
}
|
|
149
|
+
} else if (selection instanceof _editorTables.CellSelection) {
|
|
150
|
+
selectionInfo = getSelectionInfoFromCellSelection(selection);
|
|
151
|
+
}
|
|
152
|
+
var serializer = new _editorJsonTransformer.JSONTransformer();
|
|
153
|
+
var selectedNodeAdf = serializer.encodeNode(selectionInfo.selectedNode);
|
|
154
|
+
return _objectSpread(_objectSpread({}, selectionInfo), {}, {
|
|
155
|
+
selectedNodeAdf: selectedNodeAdf
|
|
156
|
+
});
|
|
134
157
|
}
|
|
@@ -11,6 +11,7 @@ var _messages = require("@atlaskit/editor-common/messages");
|
|
|
11
11
|
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
12
12
|
var _usePluginStateEffect = require("@atlaskit/editor-common/use-plugin-state-effect");
|
|
13
13
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
14
|
+
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
14
15
|
var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure");
|
|
15
16
|
var _insertAdfAtEndOfDoc2 = require("./pm-plugins/actions/insertAdfAtEndOfDoc");
|
|
16
17
|
var _replaceWithAdf2 = require("./pm-plugins/actions/replaceWithAdf");
|
|
@@ -20,7 +21,8 @@ var _types = require("./types");
|
|
|
20
21
|
var _SelectionExtensionComponentWrapper = require("./ui/extension/SelectionExtensionComponentWrapper");
|
|
21
22
|
var _extensions = require("./ui/extensions");
|
|
22
23
|
var _LegacyToolbarComponent = require("./ui/LegacyToolbarComponent");
|
|
23
|
-
var
|
|
24
|
+
var _selectionToolbar = require("./ui/selectionToolbar");
|
|
25
|
+
var _toolbarComponents = require("./ui/toolbar-components");
|
|
24
26
|
var _registerBlockMenuItems = require("./ui/utils/registerBlockMenuItems");
|
|
25
27
|
var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selectionExtensionPlugin(_ref) {
|
|
26
28
|
var api = _ref.api,
|
|
@@ -30,6 +32,7 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
30
32
|
};
|
|
31
33
|
var cachedSelection;
|
|
32
34
|
var cachedOverflowMenuOptions;
|
|
35
|
+
var isToolbarAIFCEnabled = (0, _expValEquals.expValEquals)('platform_editor_toolbar_aifc', 'isEnabled', true);
|
|
33
36
|
var _ref2 = config || {},
|
|
34
37
|
_ref2$extensionList = _ref2.extensionList,
|
|
35
38
|
extensionList = _ref2$extensionList === void 0 ? [] : _ref2$extensionList,
|
|
@@ -40,7 +43,7 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
40
43
|
firstParty = _ref3$firstParty === void 0 ? [] : _ref3$firstParty,
|
|
41
44
|
_ref3$external = _ref3.external,
|
|
42
45
|
external = _ref3$external === void 0 ? [] : _ref3$external;
|
|
43
|
-
if ((0, _platformFeatureFlags.fg)('platform_editor_selection_extension_api_v2')) {
|
|
46
|
+
if (!isToolbarAIFCEnabled && (0, _platformFeatureFlags.fg)('platform_editor_selection_extension_api_v2')) {
|
|
44
47
|
var primaryToolbarItemExtensions = (0, _extensions.getToolbarItemExtensions)(extensionList, 'primaryToolbar');
|
|
45
48
|
if (primaryToolbarItemExtensions !== null && primaryToolbarItemExtensions !== void 0 && primaryToolbarItemExtensions.length) {
|
|
46
49
|
var _api$primaryToolbar;
|
|
@@ -135,6 +138,13 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
135
138
|
if ((userIntentState === null || userIntentState === void 0 ? void 0 : userIntentState.currentUserIntent) === 'blockMenuOpen' && (0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_block_menu', 'isEnabled', true)) {
|
|
136
139
|
(0, _registerBlockMenuItems.registerBlockMenuItems)(extensionList, api);
|
|
137
140
|
}
|
|
141
|
+
if (isToolbarAIFCEnabled && (0, _expValEquals.expValEquals)('platform_editor_toolbar_aifc_selection_extension', 'isEnabled', true)) {
|
|
142
|
+
var _api$toolbar;
|
|
143
|
+
api === null || api === void 0 || (_api$toolbar = api.toolbar) === null || _api$toolbar === void 0 || _api$toolbar.actions.registerComponents((0, _toolbarComponents.getToolbarComponents)({
|
|
144
|
+
api: api,
|
|
145
|
+
config: config
|
|
146
|
+
}), true);
|
|
147
|
+
}
|
|
138
148
|
});
|
|
139
149
|
},
|
|
140
150
|
contentComponent: function contentComponent(_ref7) {
|
|
@@ -147,7 +157,7 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
147
157
|
});
|
|
148
158
|
},
|
|
149
159
|
pluginsOptions: {
|
|
150
|
-
selectionToolbar: function
|
|
160
|
+
selectionToolbar: isToolbarAIFCEnabled ? undefined : function (state, intl) {
|
|
151
161
|
var _api$editorViewMode;
|
|
152
162
|
if (!config) {
|
|
153
163
|
return;
|
|
@@ -294,7 +304,7 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
294
304
|
// NEXT PR: Make sure we cache the whole generated selection toolbar
|
|
295
305
|
// also debug this to make sure it's actually preventing unnecessary re-renders / work
|
|
296
306
|
if (cachedOverflowMenuOptions && state.selection.eq(cachedSelection) && (0, _platformFeatureFlags.fg)('platform_editor_selection_extension_api_v2')) {
|
|
297
|
-
return (0,
|
|
307
|
+
return (0, _selectionToolbar.selectionToolbar)({
|
|
298
308
|
overflowOptions: cachedOverflowMenuOptions,
|
|
299
309
|
extensionList: extensionList
|
|
300
310
|
});
|
|
@@ -308,7 +318,7 @@ var selectionExtensionPlugin = exports.selectionExtensionPlugin = function selec
|
|
|
308
318
|
var groupedExtensionsArray = [].concat((0, _toConsumableArray2.default)(getFirstPartyExtensions(allFirstParty)), (0, _toConsumableArray2.default)(getExternalExtensions(allExternal)));
|
|
309
319
|
cachedOverflowMenuOptions = groupedExtensionsArray;
|
|
310
320
|
cachedSelection = state.selection;
|
|
311
|
-
return (0,
|
|
321
|
+
return (0, _selectionToolbar.selectionToolbar)({
|
|
312
322
|
overflowOptions: cachedOverflowMenuOptions,
|
|
313
323
|
extensionList: extensionList
|
|
314
324
|
});
|
|
@@ -63,6 +63,8 @@ var SelectionExtensionComponentWrapper = exports.SelectionExtensionComponentWrap
|
|
|
63
63
|
if (!(activeExtension !== null && activeExtension !== void 0 && activeExtension.extension.component)) {
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
|
+
|
|
67
|
+
// TODO: ED-29142 - Currently this only accepts old extensions with `component` instead of `contentComponent`. Need to support ExtensionMenuItemConfiguration as well
|
|
66
68
|
var ExtensionComponent = activeExtension.extension.component;
|
|
67
69
|
return /*#__PURE__*/_react.default.createElement(ExtensionComponent, {
|
|
68
70
|
closeExtension: handleOnClose,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.MenuItem = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _toolbar = require("@atlaskit/editor-common/toolbar");
|
|
10
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
11
|
+
var _main = require("../../pm-plugins/main");
|
|
12
|
+
var _utils = require("../../pm-plugins/utils");
|
|
13
|
+
var _types = require("../../types");
|
|
14
|
+
var MenuItem = exports.MenuItem = function MenuItem(_ref) {
|
|
15
|
+
var extensionMenuItems = _ref.extensionMenuItems,
|
|
16
|
+
api = _ref.api;
|
|
17
|
+
var _useEditorToolbar = (0, _toolbar.useEditorToolbar)(),
|
|
18
|
+
editorView = _useEditorToolbar.editorView;
|
|
19
|
+
if (!(extensionMenuItems !== null && extensionMenuItems !== void 0 && extensionMenuItems.length) || !editorView || !api) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
var onClickHandle = function onClickHandle(extension) {
|
|
23
|
+
return function () {
|
|
24
|
+
if (extension.contentComponent) {
|
|
25
|
+
var selection = (0, _utils.getSelectionTextInfo)(editorView, api);
|
|
26
|
+
api.core.actions.execute(api.selectionExtension.commands.setActiveExtension({
|
|
27
|
+
extension: extension,
|
|
28
|
+
selection: selection
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
api.core.actions.execute(function (_ref2) {
|
|
32
|
+
var tr = _ref2.tr;
|
|
33
|
+
var _getSelectionAdfInfoN = (0, _utils.getSelectionAdfInfoNew)(tr.selection),
|
|
34
|
+
selectedNode = _getSelectionAdfInfoN.selectedNode,
|
|
35
|
+
nodePos = _getSelectionAdfInfoN.nodePos;
|
|
36
|
+
tr.setMeta(_main.selectionExtensionPluginKey, {
|
|
37
|
+
type: _types.SelectionExtensionActionTypes.SET_SELECTED_NODE,
|
|
38
|
+
selectedNode: selectedNode,
|
|
39
|
+
nodePos: nodePos
|
|
40
|
+
});
|
|
41
|
+
return tr;
|
|
42
|
+
});
|
|
43
|
+
extension.onClick && extension.onClick();
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, extensionMenuItems.map(function (extension) {
|
|
47
|
+
var Icon = extension.icon;
|
|
48
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
|
|
49
|
+
key: extension.label,
|
|
50
|
+
elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
|
|
51
|
+
label: ""
|
|
52
|
+
}),
|
|
53
|
+
onClick: onClickHandle(extension),
|
|
54
|
+
isDisabled: extension.isDisabled
|
|
55
|
+
}, extension.label);
|
|
56
|
+
}));
|
|
57
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ToolbarButton = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _useSharedPluginStateSelector = require("@atlaskit/editor-common/use-shared-plugin-state-selector");
|
|
10
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
11
|
+
var ToolbarButton = exports.ToolbarButton = function ToolbarButton(_ref) {
|
|
12
|
+
var api = _ref.api,
|
|
13
|
+
config = _ref.config;
|
|
14
|
+
var dockingPreference = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'userPreferences.preferences.toolbarDockingPosition');
|
|
15
|
+
var isDockedAtTop = dockingPreference === 'top';
|
|
16
|
+
if (isDockedAtTop) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
var Icon = config.icon;
|
|
20
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarTooltip, {
|
|
21
|
+
content: config.tooltip
|
|
22
|
+
}, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarButton, {
|
|
23
|
+
iconBefore: /*#__PURE__*/_react.default.createElement(Icon, {
|
|
24
|
+
label: ""
|
|
25
|
+
}),
|
|
26
|
+
isDisabled: config.isDisabled,
|
|
27
|
+
onClick: config.onClick
|
|
28
|
+
}, config.label));
|
|
29
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ToolbarMenu = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _useSharedPluginStateSelector = require("@atlaskit/editor-common/use-shared-plugin-state-selector");
|
|
10
|
+
var _editorToolbar = require("@atlaskit/editor-toolbar");
|
|
11
|
+
var ToolbarMenu = exports.ToolbarMenu = function ToolbarMenu(_ref) {
|
|
12
|
+
var api = _ref.api,
|
|
13
|
+
config = _ref.config,
|
|
14
|
+
children = _ref.children;
|
|
15
|
+
var dockingPreference = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'userPreferences.preferences.toolbarDockingPosition');
|
|
16
|
+
var isDockedAtTop = dockingPreference === 'top';
|
|
17
|
+
if (isDockedAtTop) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
var Icon = config.icon;
|
|
21
|
+
return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarTooltip, {
|
|
22
|
+
content: config.tooltip
|
|
23
|
+
}, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownMenu, {
|
|
24
|
+
iconBefore: /*#__PURE__*/_react.default.createElement(Icon, {
|
|
25
|
+
label: ""
|
|
26
|
+
}),
|
|
27
|
+
isDisabled: config.isDisabled,
|
|
28
|
+
onClick: config.onClick
|
|
29
|
+
}, children));
|
|
30
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.registerInlineToolbar = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _toolbar = require("@atlaskit/editor-common/toolbar");
|
|
10
|
+
var _MenuItem = require("./MenuItem");
|
|
11
|
+
var _ToolbarButton = require("./ToolbarButton");
|
|
12
|
+
var _ToolbarMenu = require("./ToolbarMenu");
|
|
13
|
+
var EXTENSION_RANK_MULTIPLIER = 100;
|
|
14
|
+
var registerInlineToolbar = exports.registerInlineToolbar = function registerInlineToolbar(_ref) {
|
|
15
|
+
var api = _ref.api,
|
|
16
|
+
extension = _ref.extension,
|
|
17
|
+
index = _ref.index;
|
|
18
|
+
var key = extension.key,
|
|
19
|
+
inlineToolbar = extension.inlineToolbar;
|
|
20
|
+
var baseKey = "selection-extension-".concat(key);
|
|
21
|
+
var components = [];
|
|
22
|
+
if (!inlineToolbar) {
|
|
23
|
+
return components;
|
|
24
|
+
}
|
|
25
|
+
var getToolbarItem = inlineToolbar.getToolbarItem,
|
|
26
|
+
getMenuItems = inlineToolbar.getMenuItems;
|
|
27
|
+
var groupKey = "".concat(baseKey, "-toolbar-group");
|
|
28
|
+
var toolbarItemKey = "".concat(baseKey, "-toolbar-").concat(getMenuItems ? 'menu' : 'button');
|
|
29
|
+
var menuSectionKey = "".concat(baseKey, "-toolbar-menu-section");
|
|
30
|
+
if (getToolbarItem) {
|
|
31
|
+
// first we register the group for the button or menu to be added to
|
|
32
|
+
components.push({
|
|
33
|
+
type: 'group',
|
|
34
|
+
key: groupKey,
|
|
35
|
+
parents: [{
|
|
36
|
+
type: _toolbar.APPS_SECTION.type,
|
|
37
|
+
key: _toolbar.APPS_SECTION.key,
|
|
38
|
+
rank: (index + 1) * EXTENSION_RANK_MULTIPLIER
|
|
39
|
+
}]
|
|
40
|
+
});
|
|
41
|
+
var toolbarItemConfig = getToolbarItem();
|
|
42
|
+
|
|
43
|
+
// if toolbar item has menu items, assume it's a menu
|
|
44
|
+
if (getMenuItems) {
|
|
45
|
+
components.push({
|
|
46
|
+
type: 'menu',
|
|
47
|
+
key: toolbarItemKey,
|
|
48
|
+
parents: [{
|
|
49
|
+
type: 'group',
|
|
50
|
+
key: groupKey,
|
|
51
|
+
rank: EXTENSION_RANK_MULTIPLIER
|
|
52
|
+
}],
|
|
53
|
+
component: function component() {
|
|
54
|
+
return /*#__PURE__*/_react.default.createElement(_ToolbarMenu.ToolbarMenu, {
|
|
55
|
+
api: api,
|
|
56
|
+
config: toolbarItemConfig
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
// else just regsiter a button
|
|
62
|
+
components.push({
|
|
63
|
+
type: 'button',
|
|
64
|
+
key: toolbarItemKey,
|
|
65
|
+
parents: [{
|
|
66
|
+
type: 'group',
|
|
67
|
+
key: groupKey,
|
|
68
|
+
rank: EXTENSION_RANK_MULTIPLIER
|
|
69
|
+
}],
|
|
70
|
+
component: function component() {
|
|
71
|
+
return /*#__PURE__*/_react.default.createElement(_ToolbarButton.ToolbarButton, {
|
|
72
|
+
api: api,
|
|
73
|
+
config: toolbarItemConfig
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (getMenuItems) {
|
|
80
|
+
if (getToolbarItem) {
|
|
81
|
+
components.push({
|
|
82
|
+
type: 'menu-section',
|
|
83
|
+
key: menuSectionKey,
|
|
84
|
+
parents: [{
|
|
85
|
+
type: 'menu',
|
|
86
|
+
key: toolbarItemKey,
|
|
87
|
+
rank: EXTENSION_RANK_MULTIPLIER
|
|
88
|
+
}]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Remove ExtensionMenuSectionConfiguration - only care about items
|
|
93
|
+
var menuItems = getMenuItems().filter(function (item) {
|
|
94
|
+
return 'label' in item && 'icon' in item;
|
|
95
|
+
});
|
|
96
|
+
components.push({
|
|
97
|
+
type: 'menu-item',
|
|
98
|
+
key: key,
|
|
99
|
+
parents: [{
|
|
100
|
+
type: 'menu-section',
|
|
101
|
+
// if we have a custom menu, place items in there, otherwise in the overflow menu
|
|
102
|
+
key: getToolbarItem ? menuSectionKey : _toolbar.SELECTION_EXTENSION_MENU_SECTION.key,
|
|
103
|
+
rank: (index + 1) * EXTENSION_RANK_MULTIPLIER
|
|
104
|
+
}],
|
|
105
|
+
component: function component() {
|
|
106
|
+
return /*#__PURE__*/_react.default.createElement(_MenuItem.MenuItem, {
|
|
107
|
+
api: api,
|
|
108
|
+
extensionMenuItems: menuItems
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return components;
|
|
114
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getToolbarComponents = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
var _toolbar = require("@atlaskit/editor-common/toolbar");
|
|
11
|
+
var _MenuItem = require("./toolbar-components/MenuItem");
|
|
12
|
+
var _registerInlineToolbar = require("./toolbar-components/register-inline-toolbar");
|
|
13
|
+
var _migrateSelectionExtention = require("./utils/migrate-selection-extention");
|
|
14
|
+
var getToolbarComponents = exports.getToolbarComponents = function getToolbarComponents(_ref) {
|
|
15
|
+
var _config$extensionList, _config$extensions;
|
|
16
|
+
var api = _ref.api,
|
|
17
|
+
config = _ref.config;
|
|
18
|
+
var extensionToolbarComponents = (config === null || config === void 0 || (_config$extensionList = config.extensionList) === null || _config$extensionList === void 0 ? void 0 : _config$extensionList.flatMap(function (extension, index) {
|
|
19
|
+
return (0, _registerInlineToolbar.registerInlineToolbar)({
|
|
20
|
+
api: api,
|
|
21
|
+
extension: extension,
|
|
22
|
+
index: index
|
|
23
|
+
});
|
|
24
|
+
})) || [];
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Continue to support firstParty apps for now as some apps haven't migrated yet, this simply converts apps to new ExtensionMenuItemConfiguration type
|
|
28
|
+
* to process easier. extensionList and extensions?.firstParty will most likely be mutually exclusive.
|
|
29
|
+
*
|
|
30
|
+
* **Warning:** This is called on every selection change to ensure calls to api?.selectionExtension.actions.getSelectionAdf() are
|
|
31
|
+
* fresh and up to date.
|
|
32
|
+
*/
|
|
33
|
+
var firstPartyExtensions = (config === null || config === void 0 || (_config$extensions = config.extensions) === null || _config$extensions === void 0 || (_config$extensions = _config$extensions.firstParty) === null || _config$extensions === void 0 ? void 0 : _config$extensions.map(function (extension) {
|
|
34
|
+
return (0, _migrateSelectionExtention.migrateSelectionExtensionToMenuItem)(extension, api);
|
|
35
|
+
}).filter(function (extension) {
|
|
36
|
+
return extension !== undefined;
|
|
37
|
+
})) || [];
|
|
38
|
+
return [{
|
|
39
|
+
type: _toolbar.APPS_SECTION.type,
|
|
40
|
+
key: _toolbar.APPS_SECTION.key,
|
|
41
|
+
parents: [{
|
|
42
|
+
type: 'toolbar',
|
|
43
|
+
key: _toolbar.TOOLBARS.INLINE_TEXT_TOOLBAR,
|
|
44
|
+
rank: _toolbar.TOOLBAR_RANK[_toolbar.APPS_SECTION.key]
|
|
45
|
+
}, {
|
|
46
|
+
type: 'toolbar',
|
|
47
|
+
key: _toolbar.TOOLBARS.PRIMARY_TOOLBAR,
|
|
48
|
+
rank: _toolbar.TOOLBAR_RANK[_toolbar.APPS_SECTION.key]
|
|
49
|
+
}]
|
|
50
|
+
},
|
|
51
|
+
// also register a section inside the overflow menu for extensions which only have menu items
|
|
52
|
+
{
|
|
53
|
+
type: _toolbar.SELECTION_EXTENSION_MENU_SECTION.type,
|
|
54
|
+
key: _toolbar.SELECTION_EXTENSION_MENU_SECTION.key,
|
|
55
|
+
parents: [{
|
|
56
|
+
key: _toolbar.OVERFLOW_MENU.key,
|
|
57
|
+
type: _toolbar.OVERFLOW_MENU.type,
|
|
58
|
+
rank: _toolbar.OVERFLOW_MENU_RANK[_toolbar.SELECTION_EXTENSION_MENU_SECTION.key]
|
|
59
|
+
}]
|
|
60
|
+
}].concat((0, _toConsumableArray2.default)(extensionToolbarComponents), (0, _toConsumableArray2.default)(registerFirstPartyExtensions(api, firstPartyExtensions)));
|
|
61
|
+
};
|
|
62
|
+
var registerFirstPartyExtensions = function registerFirstPartyExtensions(api, extensions) {
|
|
63
|
+
var components = [];
|
|
64
|
+
components.push({
|
|
65
|
+
type: 'menu-item',
|
|
66
|
+
key: 'first-party-extensions-menu-item',
|
|
67
|
+
parents: [{
|
|
68
|
+
type: 'menu-section',
|
|
69
|
+
key: _toolbar.SELECTION_EXTENSION_MENU_SECTION.key,
|
|
70
|
+
rank: 100
|
|
71
|
+
}],
|
|
72
|
+
component: function component() {
|
|
73
|
+
return /*#__PURE__*/_react.default.createElement(_MenuItem.MenuItem, {
|
|
74
|
+
api: api,
|
|
75
|
+
extensionMenuItems: extensions
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return components;
|
|
80
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.migrateSelectionExtensionToMenuItem = void 0;
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* TODO: ED-29157 - remove once Confluence migrates to `extensionList`API
|
|
10
|
+
*
|
|
11
|
+
* NOTES:
|
|
12
|
+
* - This is temporary until we deprecate SelectionExtension and DynamicSelectionExtension.
|
|
13
|
+
* - Only supporing SelectionExtension as DynamicSelectionExtension is not being used and will be deprecated.
|
|
14
|
+
*
|
|
15
|
+
* Converts a SelectionExtension -> ExtensionMenuItemConfiguration. This allows existing extensions to appear in the new toolbar.
|
|
16
|
+
*/
|
|
17
|
+
var migrateSelectionExtensionToMenuItem = exports.migrateSelectionExtensionToMenuItem = function migrateSelectionExtensionToMenuItem(extension, api) {
|
|
18
|
+
if (!extension.icon) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Warning! These are inlined because the onClick handler must have up to date references to selection (which is awkwaradly set during extension.onClick invocation).
|
|
23
|
+
var getSelection = function getSelection() {
|
|
24
|
+
var _sharedState$activeEx;
|
|
25
|
+
var sharedState = api === null || api === void 0 ? void 0 : api.selectionExtension.sharedState.currentState();
|
|
26
|
+
return sharedState === null || sharedState === void 0 || (_sharedState$activeEx = sharedState.activeExtension) === null || _sharedState$activeEx === void 0 ? void 0 : _sharedState$activeEx.selection;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
label: extension.name,
|
|
30
|
+
icon: extension.icon,
|
|
31
|
+
isDisabled: extension.isDisabled && extension.isDisabled({
|
|
32
|
+
selection: getSelection(),
|
|
33
|
+
// pass undefined as no consumers use this
|
|
34
|
+
selectedNodeAdf: undefined,
|
|
35
|
+
selectionRanges: undefined
|
|
36
|
+
}),
|
|
37
|
+
/**
|
|
38
|
+
* SelectionExtension supports passing through selection, selectionAdf, and selectionRanges.
|
|
39
|
+
*
|
|
40
|
+
* To support backwards compatibility wrap the onClick with these parameters here and let MenuItem invoke onClick using its expected signature.
|
|
41
|
+
*/
|
|
42
|
+
onClick: function onClick() {
|
|
43
|
+
var selectionAdf = api === null || api === void 0 ? void 0 : api.selectionExtension.actions.getSelectionAdf();
|
|
44
|
+
extension.onClick && extension.onClick({
|
|
45
|
+
selection: getSelection(),
|
|
46
|
+
selectedNodeAdf: selectionAdf === null || selectionAdf === void 0 ? void 0 : selectionAdf.selectedNodeAdf,
|
|
47
|
+
selectionRanges: selectionAdf === null || selectionAdf === void 0 ? void 0 : selectionAdf.selectionRanges
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
contentComponent: extension.component
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -134,4 +134,29 @@ export function getSelectionAdfInfo(state) {
|
|
|
134
134
|
...selectionInfo,
|
|
135
135
|
selectedNodeAdf
|
|
136
136
|
};
|
|
137
|
+
}
|
|
138
|
+
export function getSelectionAdfInfoNew(selection) {
|
|
139
|
+
let selectionInfo = {
|
|
140
|
+
selectedNode: selection.$from.node(),
|
|
141
|
+
nodePos: selection.$from.depth > 0 ? selection.$from.before() : selection.from
|
|
142
|
+
};
|
|
143
|
+
if (selection instanceof TextSelection) {
|
|
144
|
+
const {
|
|
145
|
+
$from,
|
|
146
|
+
$to
|
|
147
|
+
} = selection;
|
|
148
|
+
if ($from.parent === $to.parent) {
|
|
149
|
+
selectionInfo = getSelectionInfoFromSameNode(selection);
|
|
150
|
+
} else {
|
|
151
|
+
// TODO: ED-28405 - when selection spans multiple nodes including nested node, we need to iterate through the nodes
|
|
152
|
+
}
|
|
153
|
+
} else if (selection instanceof CellSelection) {
|
|
154
|
+
selectionInfo = getSelectionInfoFromCellSelection(selection);
|
|
155
|
+
}
|
|
156
|
+
const serializer = new JSONTransformer();
|
|
157
|
+
const selectedNodeAdf = serializer.encodeNode(selectionInfo.selectedNode);
|
|
158
|
+
return {
|
|
159
|
+
...selectionInfo,
|
|
160
|
+
selectedNodeAdf
|
|
161
|
+
};
|
|
137
162
|
}
|
|
@@ -3,6 +3,7 @@ import { selectionExtensionMessages } from '@atlaskit/editor-common/messages';
|
|
|
3
3
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
4
4
|
import { usePluginStateEffect } from '@atlaskit/editor-common/use-plugin-state-effect';
|
|
5
5
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
6
|
+
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
6
7
|
import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
|
|
7
8
|
import { insertAdfAtEndOfDoc } from './pm-plugins/actions/insertAdfAtEndOfDoc';
|
|
8
9
|
import { replaceWithAdf } from './pm-plugins/actions/replaceWithAdf';
|
|
@@ -13,6 +14,7 @@ import { SelectionExtensionComponentWrapper } from './ui/extension/SelectionExte
|
|
|
13
14
|
import { getMenuItemExtensions, getToolbarItemExtensions } from './ui/extensions';
|
|
14
15
|
import { LegacyPrimaryToolbarComponent } from './ui/LegacyToolbarComponent';
|
|
15
16
|
import { selectionToolbar } from './ui/selectionToolbar';
|
|
17
|
+
import { getToolbarComponents } from './ui/toolbar-components';
|
|
16
18
|
import { registerBlockMenuItems } from './ui/utils/registerBlockMenuItems';
|
|
17
19
|
export const selectionExtensionPlugin = ({
|
|
18
20
|
api,
|
|
@@ -23,6 +25,7 @@ export const selectionExtensionPlugin = ({
|
|
|
23
25
|
};
|
|
24
26
|
let cachedSelection;
|
|
25
27
|
let cachedOverflowMenuOptions;
|
|
28
|
+
const isToolbarAIFCEnabled = expValEquals('platform_editor_toolbar_aifc', 'isEnabled', true);
|
|
26
29
|
const {
|
|
27
30
|
extensionList = [],
|
|
28
31
|
extensions = {}
|
|
@@ -31,7 +34,7 @@ export const selectionExtensionPlugin = ({
|
|
|
31
34
|
firstParty = [],
|
|
32
35
|
external = []
|
|
33
36
|
} = extensions || {};
|
|
34
|
-
if (fg('platform_editor_selection_extension_api_v2')) {
|
|
37
|
+
if (!isToolbarAIFCEnabled && fg('platform_editor_selection_extension_api_v2')) {
|
|
35
38
|
const primaryToolbarItemExtensions = getToolbarItemExtensions(extensionList, 'primaryToolbar');
|
|
36
39
|
if (primaryToolbarItemExtensions !== null && primaryToolbarItemExtensions !== void 0 && primaryToolbarItemExtensions.length) {
|
|
37
40
|
var _api$primaryToolbar, _api$primaryToolbar$a;
|
|
@@ -131,6 +134,13 @@ export const selectionExtensionPlugin = ({
|
|
|
131
134
|
if ((userIntentState === null || userIntentState === void 0 ? void 0 : userIntentState.currentUserIntent) === 'blockMenuOpen' && expValEqualsNoExposure('platform_editor_block_menu', 'isEnabled', true)) {
|
|
132
135
|
registerBlockMenuItems(extensionList, api);
|
|
133
136
|
}
|
|
137
|
+
if (isToolbarAIFCEnabled && expValEquals('platform_editor_toolbar_aifc_selection_extension', 'isEnabled', true)) {
|
|
138
|
+
var _api$toolbar;
|
|
139
|
+
api === null || api === void 0 ? void 0 : (_api$toolbar = api.toolbar) === null || _api$toolbar === void 0 ? void 0 : _api$toolbar.actions.registerComponents(getToolbarComponents({
|
|
140
|
+
api,
|
|
141
|
+
config
|
|
142
|
+
}), true);
|
|
143
|
+
}
|
|
134
144
|
});
|
|
135
145
|
},
|
|
136
146
|
contentComponent: ({
|
|
@@ -144,7 +154,7 @@ export const selectionExtensionPlugin = ({
|
|
|
144
154
|
});
|
|
145
155
|
},
|
|
146
156
|
pluginsOptions: {
|
|
147
|
-
selectionToolbar: (state, intl) => {
|
|
157
|
+
selectionToolbar: isToolbarAIFCEnabled ? undefined : (state, intl) => {
|
|
148
158
|
var _api$editorViewMode, _api$editorViewMode$s;
|
|
149
159
|
if (!config) {
|
|
150
160
|
return;
|
|
@@ -57,6 +57,8 @@ export const SelectionExtensionComponentWrapper = ({
|
|
|
57
57
|
if (!(activeExtension !== null && activeExtension !== void 0 && activeExtension.extension.component)) {
|
|
58
58
|
return null;
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
// TODO: ED-29142 - Currently this only accepts old extensions with `component` instead of `contentComponent`. Need to support ExtensionMenuItemConfiguration as well
|
|
60
62
|
const ExtensionComponent = activeExtension.extension.component;
|
|
61
63
|
return /*#__PURE__*/React.createElement(ExtensionComponent, {
|
|
62
64
|
closeExtension: handleOnClose,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useEditorToolbar } from '@atlaskit/editor-common/toolbar';
|
|
3
|
+
import { ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
|
|
4
|
+
import { selectionExtensionPluginKey } from '../../pm-plugins/main';
|
|
5
|
+
import { getSelectionAdfInfoNew, getSelectionTextInfo } from '../../pm-plugins/utils';
|
|
6
|
+
import { SelectionExtensionActionTypes } from '../../types';
|
|
7
|
+
export const MenuItem = ({
|
|
8
|
+
extensionMenuItems,
|
|
9
|
+
api
|
|
10
|
+
}) => {
|
|
11
|
+
const {
|
|
12
|
+
editorView
|
|
13
|
+
} = useEditorToolbar();
|
|
14
|
+
if (!(extensionMenuItems !== null && extensionMenuItems !== void 0 && extensionMenuItems.length) || !editorView || !api) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const onClickHandle = extension => () => {
|
|
18
|
+
if (extension.contentComponent) {
|
|
19
|
+
const selection = getSelectionTextInfo(editorView, api);
|
|
20
|
+
api.core.actions.execute(api.selectionExtension.commands.setActiveExtension({
|
|
21
|
+
extension,
|
|
22
|
+
selection
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
api.core.actions.execute(({
|
|
26
|
+
tr
|
|
27
|
+
}) => {
|
|
28
|
+
const {
|
|
29
|
+
selectedNode,
|
|
30
|
+
nodePos
|
|
31
|
+
} = getSelectionAdfInfoNew(tr.selection);
|
|
32
|
+
tr.setMeta(selectionExtensionPluginKey, {
|
|
33
|
+
type: SelectionExtensionActionTypes.SET_SELECTED_NODE,
|
|
34
|
+
selectedNode,
|
|
35
|
+
nodePos
|
|
36
|
+
});
|
|
37
|
+
return tr;
|
|
38
|
+
});
|
|
39
|
+
extension.onClick && extension.onClick();
|
|
40
|
+
};
|
|
41
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, extensionMenuItems.map(extension => {
|
|
42
|
+
const Icon = extension.icon;
|
|
43
|
+
return /*#__PURE__*/React.createElement(ToolbarDropdownItem, {
|
|
44
|
+
key: extension.label,
|
|
45
|
+
elemBefore: /*#__PURE__*/React.createElement(Icon, {
|
|
46
|
+
label: ""
|
|
47
|
+
}),
|
|
48
|
+
onClick: onClickHandle(extension),
|
|
49
|
+
isDisabled: extension.isDisabled
|
|
50
|
+
}, extension.label);
|
|
51
|
+
}));
|
|
52
|
+
};
|