@atlaskit/editor-plugin-selection-extension 3.7.2 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/pm-plugins/utils/index.js +23 -0
  3. package/dist/cjs/selectionExtensionPlugin.js +15 -5
  4. package/dist/cjs/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
  5. package/dist/cjs/ui/toolbar-components/MenuItem.js +57 -0
  6. package/dist/cjs/ui/toolbar-components/ToolbarButton.js +29 -0
  7. package/dist/cjs/ui/toolbar-components/ToolbarMenu.js +30 -0
  8. package/dist/cjs/ui/toolbar-components/register-inline-toolbar.js +114 -0
  9. package/dist/cjs/ui/toolbar-components.js +80 -0
  10. package/dist/cjs/ui/utils/migrate-selection-extention.js +52 -0
  11. package/dist/es2019/pm-plugins/utils/index.js +25 -0
  12. package/dist/es2019/selectionExtensionPlugin.js +12 -2
  13. package/dist/es2019/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
  14. package/dist/es2019/ui/toolbar-components/MenuItem.js +52 -0
  15. package/dist/es2019/ui/toolbar-components/ToolbarButton.js +23 -0
  16. package/dist/es2019/ui/toolbar-components/ToolbarMenu.js +24 -0
  17. package/dist/es2019/ui/toolbar-components/register-inline-toolbar.js +110 -0
  18. package/dist/es2019/ui/toolbar-components.js +67 -0
  19. package/dist/es2019/ui/utils/migrate-selection-extention.js +46 -0
  20. package/dist/esm/pm-plugins/utils/index.js +22 -0
  21. package/dist/esm/selectionExtensionPlugin.js +15 -5
  22. package/dist/esm/ui/extension/SelectionExtensionComponentWrapper.js +2 -0
  23. package/dist/esm/ui/toolbar-components/MenuItem.js +50 -0
  24. package/dist/esm/ui/toolbar-components/ToolbarButton.js +22 -0
  25. package/dist/esm/ui/toolbar-components/ToolbarMenu.js +23 -0
  26. package/dist/esm/ui/toolbar-components/register-inline-toolbar.js +107 -0
  27. package/dist/esm/ui/toolbar-components.js +73 -0
  28. package/dist/esm/ui/utils/migrate-selection-extention.js +46 -0
  29. package/dist/types/index.d.ts +1 -1
  30. package/dist/types/pm-plugins/utils/index.d.ts +2 -1
  31. package/dist/types/selectionExtensionPluginType.d.ts +4 -2
  32. package/dist/types/ui/toolbar-components/MenuItem.d.ts +10 -0
  33. package/dist/types/ui/toolbar-components/ToolbarButton.d.ts +10 -0
  34. package/dist/types/ui/toolbar-components/ToolbarMenu.d.ts +10 -0
  35. package/dist/types/ui/toolbar-components/register-inline-toolbar.d.ts +11 -0
  36. package/dist/types/ui/toolbar-components.d.ts +11 -0
  37. package/dist/types/ui/utils/migrate-selection-extention.d.ts +14 -0
  38. package/dist/types-ts4.5/index.d.ts +1 -1
  39. package/dist/types-ts4.5/pm-plugins/utils/index.d.ts +2 -1
  40. package/dist/types-ts4.5/selectionExtensionPluginType.d.ts +4 -2
  41. package/dist/types-ts4.5/ui/toolbar-components/MenuItem.d.ts +10 -0
  42. package/dist/types-ts4.5/ui/toolbar-components/ToolbarButton.d.ts +10 -0
  43. package/dist/types-ts4.5/ui/toolbar-components/ToolbarMenu.d.ts +10 -0
  44. package/dist/types-ts4.5/ui/toolbar-components/register-inline-toolbar.d.ts +11 -0
  45. package/dist/types-ts4.5/ui/toolbar-components.d.ts +11 -0
  46. package/dist/types-ts4.5/ui/utils/migrate-selection-extention.d.ts +14 -0
  47. package/package.json +11 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atlaskit/editor-plugin-selection-extension
2
2
 
3
+ ## 4.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`50976babce55d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/50976babce55d) -
8
+ Add new 'onClick' to dropdown menu, hook up new toolbar api to regsiter components on selection
9
+ change, add new safeRegistry method to replace existing objects
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
15
+ ## 4.0.0
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies
20
+
3
21
  ## 3.7.2
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 _selectionToolbar2 = require("./ui/selectionToolbar");
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 selectionToolbar(state, intl) {
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, _selectionToolbar2.selectionToolbar)({
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, _selectionToolbar2.selectionToolbar)({
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
+ };