@atlaskit/editor-common 102.10.4 → 102.11.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 102.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#127253](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/127253)
8
+ [`a2593d5c73ccb`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a2593d5c73ccb) -
9
+ [ux] Table overflow menu on floating toolbar
10
+
3
11
  ## 102.10.4
4
12
 
5
13
  ### Patch Changes
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.DropdownMenuExtensionItems = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactLoadable = _interopRequireDefault(require("react-loadable"));
14
+ var _extensions = require("../extensions");
15
+ var _utils = require("../utils");
16
+ var _DropdownMenuItem = require("./DropdownMenuItem");
17
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
+ var noop = function noop() {
20
+ return null;
21
+ };
22
+ var isDefaultExport = function isDefaultExport(mod) {
23
+ return mod.hasOwnProperty('default');
24
+ };
25
+ var resolveExtensionIcon = /*#__PURE__*/function () {
26
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(getIcon) {
27
+ var maybeIcon;
28
+ return _regenerator.default.wrap(function _callee$(_context) {
29
+ while (1) switch (_context.prev = _context.next) {
30
+ case 0:
31
+ if (getIcon) {
32
+ _context.next = 2;
33
+ break;
34
+ }
35
+ return _context.abrupt("return", noop);
36
+ case 2:
37
+ _context.next = 4;
38
+ return getIcon();
39
+ case 4:
40
+ maybeIcon = _context.sent;
41
+ return _context.abrupt("return", isDefaultExport(maybeIcon) ? maybeIcon.default : maybeIcon);
42
+ case 6:
43
+ case "end":
44
+ return _context.stop();
45
+ }
46
+ }, _callee);
47
+ }));
48
+ return function resolveExtensionIcon(_x) {
49
+ return _ref.apply(this, arguments);
50
+ };
51
+ }();
52
+ var convertExtensionToDropdownMenuItem = function convertExtensionToDropdownMenuItem(_ref2) {
53
+ var item = _ref2.item,
54
+ disabled = _ref2.disabled,
55
+ node = _ref2.node,
56
+ extension = _ref2.extension;
57
+ var ButtonIcon = item.icon ? (0, _reactLoadable.default)({
58
+ // Ignored via go/ees005
59
+ // eslint-disable-next-line require-await
60
+ loader: function () {
61
+ var _loader = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
62
+ return _regenerator.default.wrap(function _callee2$(_context2) {
63
+ while (1) switch (_context2.prev = _context2.next) {
64
+ case 0:
65
+ return _context2.abrupt("return", resolveExtensionIcon(item.icon));
66
+ case 1:
67
+ case "end":
68
+ return _context2.stop();
69
+ }
70
+ }, _callee2);
71
+ }));
72
+ function loader() {
73
+ return _loader.apply(this, arguments);
74
+ }
75
+ return loader;
76
+ }(),
77
+ loading: noop
78
+ }) : undefined;
79
+ var title = '';
80
+ if (item.label) {
81
+ title = item.label;
82
+ } else if (typeof item.tooltip === 'string') {
83
+ title = item.tooltip;
84
+ } else if (item.ariaLabel) {
85
+ title = item.ariaLabel;
86
+ }
87
+ item.disabled = (disabled === null || disabled === void 0 ? void 0 : disabled(item.key)) || false;
88
+ return {
89
+ title: title,
90
+ icon: ButtonIcon ? /*#__PURE__*/_react.default.createElement(ButtonIcon, {
91
+ label: item.label || ''
92
+ }) : undefined,
93
+ disabled: item.disabled,
94
+ onClick: function onClick() {
95
+ if (typeof item.action !== 'function') {
96
+ throw new Error("'action' of context toolbar item '".concat(item.key, "' is not a function"));
97
+ }
98
+ var targetNodeAdf = (0, _utils.nodeToJSON)(node);
99
+ extension.extensionApi && item.action(targetNodeAdf, extension.extensionApi);
100
+ return true;
101
+ }
102
+ };
103
+ };
104
+ var DropdownMenuExtensionItem = function DropdownMenuExtensionItem(_ref3) {
105
+ var item = _ref3.item,
106
+ editorView = _ref3.editorView,
107
+ disabled = _ref3.disabled,
108
+ node = _ref3.node,
109
+ extension = _ref3.extension,
110
+ dropdownOptions = _ref3.dropdownOptions;
111
+ var dropdownItem = convertExtensionToDropdownMenuItem({
112
+ item: item,
113
+ disabled: disabled,
114
+ node: node,
115
+ extension: extension
116
+ });
117
+ if (!dropdownItem) {
118
+ return null;
119
+ }
120
+ return /*#__PURE__*/_react.default.createElement(_DropdownMenuItem.DropdownMenuItem, {
121
+ key: item.key,
122
+ item: dropdownItem,
123
+ editorView: editorView,
124
+ hide: dropdownOptions.hide,
125
+ dispatchCommand: dropdownOptions.dispatchCommand,
126
+ showSelected: dropdownOptions.showSelected,
127
+ intl: dropdownOptions.intl
128
+ });
129
+ };
130
+ var DropdownMenuExtensionItems = exports.DropdownMenuExtensionItems = function DropdownMenuExtensionItems(props) {
131
+ var node = props.node,
132
+ editorView = props.editorView,
133
+ extension = props.extension,
134
+ disabled = props.disabled,
135
+ dropdownOptions = props.dropdownOptions;
136
+
137
+ // Ignored via go/ees005
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ var _useState = (0, _react.useState)([]),
140
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
141
+ extensions = _useState2[0],
142
+ setExtensions = _useState2[1];
143
+ (0, _react.useEffect)(function () {
144
+ getExtensions();
145
+ function getExtensions() {
146
+ return _getExtensions.apply(this, arguments);
147
+ }
148
+ function _getExtensions() {
149
+ _getExtensions = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
150
+ var provider;
151
+ return _regenerator.default.wrap(function _callee3$(_context3) {
152
+ while (1) switch (_context3.prev = _context3.next) {
153
+ case 0:
154
+ _context3.next = 2;
155
+ return extension.extensionProvider;
156
+ case 2:
157
+ provider = _context3.sent;
158
+ if (!provider) {
159
+ _context3.next = 9;
160
+ break;
161
+ }
162
+ _context3.t0 = setExtensions;
163
+ _context3.next = 7;
164
+ return provider.getExtensions();
165
+ case 7:
166
+ _context3.t1 = _context3.sent;
167
+ (0, _context3.t0)(_context3.t1);
168
+ case 9:
169
+ case "end":
170
+ return _context3.stop();
171
+ }
172
+ }, _callee3);
173
+ }));
174
+ return _getExtensions.apply(this, arguments);
175
+ }
176
+ }, [extension.extensionProvider]);
177
+ var nodeAdf = _react.default.useMemo(function () {
178
+ return (0, _utils.nodeToJSON)(node);
179
+ }, [node]);
180
+ var extensionItems = _react.default.useMemo(function () {
181
+ if (!extension.extensionApi) {
182
+ return [];
183
+ }
184
+ return (0, _extensions.getContextualToolbarItemsFromModule)(extensions, nodeAdf, extension.extensionApi);
185
+ }, [extensions, nodeAdf, extension.extensionApi]);
186
+ if (!extensionItems.length || !dropdownOptions) {
187
+ return null;
188
+ }
189
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, extensionItems.map(function (item, idx) {
190
+ if (!('key' in item)) {
191
+ return null;
192
+ }
193
+ return /*#__PURE__*/_react.default.createElement(DropdownMenuExtensionItem, {
194
+ key: item.key,
195
+ item: item,
196
+ editorView: editorView,
197
+ disabled: disabled,
198
+ node: node,
199
+ extension: extension,
200
+ dropdownOptions: dropdownOptions
201
+ });
202
+ }));
203
+ };
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.menuItemDimensions = exports.DropdownMenuItem = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
10
+ var _react2 = require("@emotion/react");
11
+ var _checkMarkEditorDone = _interopRequireDefault(require("@atlaskit/icon/core/migration/check-mark--editor-done"));
12
+ var _menu = require("@atlaskit/menu");
13
+ var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
14
+ var _floatingToolbar = require("../floating-toolbar");
15
+ /**
16
+ * @jsxRuntime classic
17
+ * @jsx jsx
18
+ */
19
+
20
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
21
+
22
+ // eslint-disable-next-line @atlaskit/design-system/no-deprecated-imports
23
+
24
+ var menuItemDimensions = exports.menuItemDimensions = {
25
+ width: 175,
26
+ height: 32
27
+ };
28
+ var labelStyles = (0, _react2.css)({
29
+ display: 'inline-block',
30
+ width: '100%'
31
+ });
32
+ var spacerStyles = (0, _react2.css)({
33
+ display: 'flex',
34
+ flex: 1,
35
+ padding: "var(--ds-space-100, 8px)"
36
+ });
37
+
38
+ // Extend the ButtonItem component type to allow mouse events to be accepted from the Typescript check
39
+
40
+ var DropdownButtonItem = _menu.ButtonItem;
41
+ var SelectedIconBefore = function SelectedIconBefore(_ref) {
42
+ var itemSelected = _ref.itemSelected,
43
+ intl = _ref.intl,
44
+ showSelected = _ref.showSelected;
45
+ if (showSelected && itemSelected) {
46
+ return (0, _react2.jsx)("span", {
47
+ "aria-hidden": "true"
48
+ }, (0, _react2.jsx)(_checkMarkEditorDone.default, {
49
+ LEGACY_primaryColor: "var(--ds-icon-selected, #0C66E4)",
50
+ LEGACY_size: "small",
51
+ label: intl.formatMessage(_floatingToolbar.messages.confirmModalOK),
52
+ spacing: "none"
53
+ }));
54
+ }
55
+ return (0, _react2.jsx)("span", {
56
+ css: spacerStyles
57
+ });
58
+ };
59
+ var DropdownMenuItem = exports.DropdownMenuItem = function DropdownMenuItem(props) {
60
+ var item = props.item,
61
+ hide = props.hide,
62
+ dispatchCommand = props.dispatchCommand,
63
+ editorView = props.editorView,
64
+ showSelected = props.showSelected,
65
+ intl = props.intl;
66
+ var itemSelected = item.selected;
67
+ var iconBefore = (0, _react.useMemo)(function () {
68
+ if (item.icon) {
69
+ return item.icon;
70
+ } else {
71
+ return (0, _react2.jsx)(SelectedIconBefore, {
72
+ itemSelected: itemSelected,
73
+ showSelected: showSelected,
74
+ intl: intl
75
+ });
76
+ }
77
+ }, [itemSelected, showSelected, intl, item.icon]);
78
+ var _useState = (0, _react.useState)(item.tooltip || ''),
79
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
80
+ tooltipContent = _useState2[0],
81
+ setTooltipContent = _useState2[1];
82
+ var handleItemMouseOut = (0, _react.useCallback)(function () {
83
+ setTooltipContent('');
84
+ if (item.onMouseOut) {
85
+ dispatchCommand(item.onMouseOut);
86
+ }
87
+ }, [item.onMouseOut, dispatchCommand]);
88
+ var handleItemMouseDown = (0, _react.useCallback)(function (e) {
89
+ e.preventDefault(); // ED-16204 - This is needed for safari to get handleItemClick() to work
90
+ if (item.onMouseDown) {
91
+ dispatchCommand(item.onMouseDown);
92
+ }
93
+ }, [item.onMouseDown, dispatchCommand]);
94
+ var handleItemMouseOver = (0, _react.useCallback)(function () {
95
+ setTooltipContent(item.tooltip || '');
96
+ if (item.onMouseOver) {
97
+ dispatchCommand(item.onMouseOver);
98
+ }
99
+ }, [item.tooltip, item.onMouseOver, dispatchCommand]);
100
+ var handleItemMouseEnter = (0, _react.useCallback)(function (e) {
101
+ if (item.onMouseEnter) {
102
+ e.preventDefault();
103
+ dispatchCommand(item.onMouseEnter);
104
+ }
105
+ }, [item.onMouseEnter, dispatchCommand]);
106
+ var handleItemMouseLeave = (0, _react.useCallback)(function (e) {
107
+ if (item.onMouseLeave) {
108
+ e.preventDefault();
109
+ dispatchCommand(item.onMouseLeave);
110
+ }
111
+ }, [item.onMouseLeave, dispatchCommand]);
112
+ var handleItemOnFocus = (0, _react.useCallback)(function (e) {
113
+ if (item.onFocus) {
114
+ e.preventDefault();
115
+ dispatchCommand(item.onFocus);
116
+ }
117
+ }, [item.onFocus, dispatchCommand]);
118
+ var handleItemOnBlur = (0, _react.useCallback)(function (e) {
119
+ if (item.onBlur) {
120
+ e.preventDefault();
121
+ dispatchCommand(item.onBlur);
122
+ }
123
+ }, [item.onBlur, dispatchCommand]);
124
+ var handleItemClick = (0, _react.useCallback)(function () {
125
+ /**
126
+ * The order of dispatching the event and hide() is important, because
127
+ * the ClickAreaBlock will be relying on the element to calculate the
128
+ * click coordinate.
129
+ * For more details, please visit the comment in this PR https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/5328/edm-1321-set-selection-near-smart-link?link_source=email#chg-packages/editor/editor-core/src/plugins/floating-toolbar/ui/DropdownMenu.tsx
130
+ */
131
+ dispatchCommand(item.onClick);
132
+ hide();
133
+ if (!(editorView !== null && editorView !== void 0 && editorView.hasFocus())) {
134
+ editorView === null || editorView === void 0 || editorView.focus();
135
+ }
136
+ }, [dispatchCommand, item.onClick, hide, editorView]);
137
+
138
+ /* ED-16704 - Native mouse event handler to overcome firefox issue on disabled <button> - https://github.com/whatwg/html/issues/5886 */
139
+ var labelRef = (0, _react.useRef)(null);
140
+ var handleTitleWrapperMouseEvent = (0, _react.useCallback)(
141
+ // Ignored via go/ees005
142
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
+ function (e) {
144
+ if (item.disabled) {
145
+ e.stopPropagation();
146
+ e.preventDefault();
147
+ }
148
+ }, [item.disabled]);
149
+
150
+ // Ignored via go/ees005
151
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
+ var isAriaChecked = function isAriaChecked(item) {
153
+ var selected = item.selected,
154
+ domItemOptions = item.domItemOptions;
155
+ return (domItemOptions === null || domItemOptions === void 0 ? void 0 : domItemOptions.type) === 'item-checkbox' ? selected : undefined;
156
+ };
157
+
158
+ // Ignored via go/ees005
159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
+ var hasRole = function hasRole(item) {
161
+ var _item$domItemOptions;
162
+ return ((_item$domItemOptions = item.domItemOptions) === null || _item$domItemOptions === void 0 ? void 0 : _item$domItemOptions.type) === 'item-checkbox' ? 'menuitemcheckbox' : undefined;
163
+ };
164
+ (0, _react.useEffect)(function () {
165
+ var labelRefCurrent = labelRef.current;
166
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
167
+ labelRefCurrent === null || labelRefCurrent === void 0 || labelRefCurrent.addEventListener('click', handleTitleWrapperMouseEvent);
168
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
169
+ labelRefCurrent === null || labelRefCurrent === void 0 || labelRefCurrent.addEventListener('mousedown', handleTitleWrapperMouseEvent);
170
+ return function () {
171
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
172
+ labelRefCurrent === null || labelRefCurrent === void 0 || labelRefCurrent.removeEventListener('click', handleTitleWrapperMouseEvent);
173
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
174
+ labelRefCurrent === null || labelRefCurrent === void 0 || labelRefCurrent.removeEventListener('mousedown', handleTitleWrapperMouseEvent);
175
+ };
176
+ });
177
+ var itemContent = (0, _react2.jsx)(DropdownButtonItem, {
178
+ isSelected: itemSelected,
179
+ iconBefore: iconBefore,
180
+ iconAfter: item.elemAfter,
181
+ onClick: handleItemClick,
182
+ "data-testid": item.testId,
183
+ isDisabled: item.disabled,
184
+ onMouseDown: handleItemMouseDown,
185
+ onMouseOver: handleItemMouseOver,
186
+ onMouseEnter: handleItemMouseEnter,
187
+ onMouseLeave: handleItemMouseLeave,
188
+ onMouseOut: handleItemMouseOut,
189
+ onFocus: handleItemOnFocus,
190
+ onBlur: handleItemOnBlur,
191
+ role: hasRole(item),
192
+ "aria-checked": isAriaChecked(item)
193
+ }, (0, _react2.jsx)("span", {
194
+ ref: labelRef,
195
+ css: labelStyles
196
+ }, item.title));
197
+ if (tooltipContent) {
198
+ return (0, _react2.jsx)(_tooltip.default, {
199
+ content: tooltipContent
200
+ }, itemContent);
201
+ }
202
+ return itemContent;
203
+ };
@@ -4,6 +4,18 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ Object.defineProperty(exports, "DropdownMenuExtensionItems", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _DropdownMenuExtensionItems.DropdownMenuExtensionItems;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "DropdownMenuItem", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _DropdownMenuItem.DropdownMenuItem;
17
+ }
18
+ });
7
19
  exports.isSameItem = exports.compareArrays = exports.areSameItems = void 0;
8
20
  Object.defineProperty(exports, "messages", {
9
21
  enumerable: true,
@@ -12,6 +24,8 @@ Object.defineProperty(exports, "messages", {
12
24
  }
13
25
  });
14
26
  exports.shallowEqual = void 0;
27
+ var _DropdownMenuExtensionItems = require("./DropdownMenuExtensionItems");
28
+ var _DropdownMenuItem = require("./DropdownMenuItem");
15
29
  var _messages = _interopRequireDefault(require("./messages"));
16
30
  // Ignored via go/ees005
17
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -132,4 +146,4 @@ var areSameItems = exports.areSameItems = function areSameItems(leftArr, rightAr
132
146
  });
133
147
  };
134
148
 
135
- // eslint-disable-next-line @atlaskit/editor/no-re-export
149
+ /* eslint-disable @atlaskit/editor/no-re-export */
@@ -17,7 +17,7 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
17
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
18
18
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
19
19
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
20
- var packageVersion = "102.10.4";
20
+ var packageVersion = "102.11.0";
21
21
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
22
22
  // Remove URL as it has UGC
23
23
  // Ignored via go/ees007
@@ -23,7 +23,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
23
23
  * @jsx jsx
24
24
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
25
25
  var packageName = "@atlaskit/editor-common";
26
- var packageVersion = "102.10.4";
26
+ var packageVersion = "102.11.0";
27
27
  var halfFocusRing = 1;
28
28
  var dropOffset = '0, 8';
29
29
  // Ignored via go/ees005
@@ -0,0 +1,126 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import Loadable from 'react-loadable';
3
+ import { getContextualToolbarItemsFromModule } from '../extensions';
4
+ import { nodeToJSON } from '../utils';
5
+ import { DropdownMenuItem } from './DropdownMenuItem';
6
+ const noop = () => null;
7
+ const isDefaultExport = mod => {
8
+ return mod.hasOwnProperty('default');
9
+ };
10
+ const resolveExtensionIcon = async getIcon => {
11
+ if (!getIcon) {
12
+ return noop;
13
+ }
14
+ const maybeIcon = await getIcon();
15
+ return isDefaultExport(maybeIcon) ? maybeIcon.default : maybeIcon;
16
+ };
17
+ const convertExtensionToDropdownMenuItem = ({
18
+ item,
19
+ disabled,
20
+ node,
21
+ extension
22
+ }) => {
23
+ const ButtonIcon = item.icon ? Loadable({
24
+ // Ignored via go/ees005
25
+ // eslint-disable-next-line require-await
26
+ loader: async () => resolveExtensionIcon(item.icon),
27
+ loading: noop
28
+ }) : undefined;
29
+ let title = '';
30
+ if (item.label) {
31
+ title = item.label;
32
+ } else if (typeof item.tooltip === 'string') {
33
+ title = item.tooltip;
34
+ } else if (item.ariaLabel) {
35
+ title = item.ariaLabel;
36
+ }
37
+ item.disabled = (disabled === null || disabled === void 0 ? void 0 : disabled(item.key)) || false;
38
+ return {
39
+ title,
40
+ icon: ButtonIcon ? /*#__PURE__*/React.createElement(ButtonIcon, {
41
+ label: item.label || ''
42
+ }) : undefined,
43
+ disabled: item.disabled,
44
+ onClick: () => {
45
+ if (typeof item.action !== 'function') {
46
+ throw new Error(`'action' of context toolbar item '${item.key}' is not a function`);
47
+ }
48
+ const targetNodeAdf = nodeToJSON(node);
49
+ extension.extensionApi && item.action(targetNodeAdf, extension.extensionApi);
50
+ return true;
51
+ }
52
+ };
53
+ };
54
+ const DropdownMenuExtensionItem = ({
55
+ item,
56
+ editorView,
57
+ disabled,
58
+ node,
59
+ extension,
60
+ dropdownOptions
61
+ }) => {
62
+ const dropdownItem = convertExtensionToDropdownMenuItem({
63
+ item,
64
+ disabled,
65
+ node,
66
+ extension
67
+ });
68
+ if (!dropdownItem) {
69
+ return null;
70
+ }
71
+ return /*#__PURE__*/React.createElement(DropdownMenuItem, {
72
+ key: item.key,
73
+ item: dropdownItem,
74
+ editorView: editorView,
75
+ hide: dropdownOptions.hide,
76
+ dispatchCommand: dropdownOptions.dispatchCommand,
77
+ showSelected: dropdownOptions.showSelected,
78
+ intl: dropdownOptions.intl
79
+ });
80
+ };
81
+ export const DropdownMenuExtensionItems = props => {
82
+ const {
83
+ node,
84
+ editorView,
85
+ extension,
86
+ disabled,
87
+ dropdownOptions
88
+ } = props;
89
+
90
+ // Ignored via go/ees005
91
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ const [extensions, setExtensions] = useState([]);
93
+ useEffect(() => {
94
+ getExtensions();
95
+ async function getExtensions() {
96
+ const provider = await extension.extensionProvider;
97
+ if (provider) {
98
+ setExtensions(await provider.getExtensions());
99
+ }
100
+ }
101
+ }, [extension.extensionProvider]);
102
+ const nodeAdf = React.useMemo(() => nodeToJSON(node), [node]);
103
+ const extensionItems = React.useMemo(() => {
104
+ if (!extension.extensionApi) {
105
+ return [];
106
+ }
107
+ return getContextualToolbarItemsFromModule(extensions, nodeAdf, extension.extensionApi);
108
+ }, [extensions, nodeAdf, extension.extensionApi]);
109
+ if (!extensionItems.length || !dropdownOptions) {
110
+ return null;
111
+ }
112
+ return /*#__PURE__*/React.createElement(React.Fragment, null, extensionItems.map((item, idx) => {
113
+ if (!('key' in item)) {
114
+ return null;
115
+ }
116
+ return /*#__PURE__*/React.createElement(DropdownMenuExtensionItem, {
117
+ key: item.key,
118
+ item: item,
119
+ editorView: editorView,
120
+ disabled: disabled,
121
+ node: node,
122
+ extension: extension,
123
+ dropdownOptions: dropdownOptions
124
+ });
125
+ }));
126
+ };