@atlaskit/editor-plugin-type-ahead 30.0.5 → 31.0.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 (87) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/pm-plugins/commands/insert-type-ahead-item.js +4 -8
  3. package/dist/cjs/ui/ContentComponent.js +1 -2
  4. package/dist/cjs/ui/InputQuery.js +49 -21
  5. package/dist/cjs/ui/WrapperTypeAhead.js +4 -5
  6. package/dist/cjs/ui/registered-menu/RegisteredTypeAheadMenu.js +128 -227
  7. package/dist/es2019/pm-plugins/commands/insert-type-ahead-item.js +3 -7
  8. package/dist/es2019/ui/ContentComponent.js +1 -2
  9. package/dist/es2019/ui/InputQuery.js +44 -16
  10. package/dist/es2019/ui/WrapperTypeAhead.js +4 -5
  11. package/dist/es2019/ui/registered-menu/RegisteredTypeAheadMenu.js +112 -200
  12. package/dist/esm/pm-plugins/commands/insert-type-ahead-item.js +4 -8
  13. package/dist/esm/ui/ContentComponent.js +1 -2
  14. package/dist/esm/ui/InputQuery.js +49 -21
  15. package/dist/esm/ui/WrapperTypeAhead.js +4 -5
  16. package/dist/esm/ui/registered-menu/RegisteredTypeAheadMenu.js +129 -228
  17. package/dist/types/pm-plugins/commands/insert-type-ahead-item.d.ts +4 -4
  18. package/dist/types/ui/InputQuery.d.ts +4 -1
  19. package/dist/types/ui/registered-menu/RegisteredTypeAheadMenu.d.ts +2 -3
  20. package/package.json +9 -9
  21. package/dist/cjs/ui/registered-menu/PassThrough.js +0 -10
  22. package/dist/cjs/ui/registered-menu/TypeAheadContext.js +0 -8
  23. package/dist/cjs/ui/registered-menu/TypeAheadItemRow.js +0 -48
  24. package/dist/cjs/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
  25. package/dist/cjs/ui/registered-menu/TypeAheadMenuFooter.js +0 -33
  26. package/dist/cjs/ui/registered-menu/TypeAheadMenuRenderer.js +0 -167
  27. package/dist/cjs/ui/registered-menu/TypeAheadProvider.js +0 -8
  28. package/dist/cjs/ui/registered-menu/TypeAheadSectionRow.js +0 -15
  29. package/dist/cjs/ui/registered-menu/buildTypeAheadMenuModel.js +0 -5
  30. package/dist/cjs/ui/registered-menu/createTypeAheadRowRenderer.js +0 -76
  31. package/dist/cjs/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -9
  32. package/dist/cjs/ui/registered-menu/getTypeAheadItemId.js +0 -9
  33. package/dist/cjs/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -40
  34. package/dist/cjs/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -66
  35. package/dist/cjs/ui/registered-menu/typeAheadMenuTypes.js +0 -5
  36. package/dist/cjs/ui/registered-menu/typeAheadSurfaces.js +0 -27
  37. package/dist/cjs/ui/registered-menu/useTypeAheadContext.js +0 -15
  38. package/dist/es2019/ui/registered-menu/PassThrough.js +0 -3
  39. package/dist/es2019/ui/registered-menu/TypeAheadContext.js +0 -2
  40. package/dist/es2019/ui/registered-menu/TypeAheadItemRow.js +0 -35
  41. package/dist/es2019/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
  42. package/dist/es2019/ui/registered-menu/TypeAheadMenuFooter.js +0 -24
  43. package/dist/es2019/ui/registered-menu/TypeAheadMenuRenderer.js +0 -134
  44. package/dist/es2019/ui/registered-menu/TypeAheadProvider.js +0 -2
  45. package/dist/es2019/ui/registered-menu/TypeAheadSectionRow.js +0 -9
  46. package/dist/es2019/ui/registered-menu/buildTypeAheadMenuModel.js +0 -1
  47. package/dist/es2019/ui/registered-menu/createTypeAheadRowRenderer.js +0 -67
  48. package/dist/es2019/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -1
  49. package/dist/es2019/ui/registered-menu/getTypeAheadItemId.js +0 -1
  50. package/dist/es2019/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -31
  51. package/dist/es2019/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -58
  52. package/dist/es2019/ui/registered-menu/typeAheadMenuTypes.js +0 -1
  53. package/dist/es2019/ui/registered-menu/typeAheadSurfaces.js +0 -21
  54. package/dist/es2019/ui/registered-menu/useTypeAheadContext.js +0 -9
  55. package/dist/esm/ui/registered-menu/PassThrough.js +0 -4
  56. package/dist/esm/ui/registered-menu/TypeAheadContext.js +0 -2
  57. package/dist/esm/ui/registered-menu/TypeAheadItemRow.js +0 -40
  58. package/dist/esm/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
  59. package/dist/esm/ui/registered-menu/TypeAheadMenuFooter.js +0 -26
  60. package/dist/esm/ui/registered-menu/TypeAheadMenuRenderer.js +0 -158
  61. package/dist/esm/ui/registered-menu/TypeAheadProvider.js +0 -2
  62. package/dist/esm/ui/registered-menu/TypeAheadSectionRow.js +0 -8
  63. package/dist/esm/ui/registered-menu/buildTypeAheadMenuModel.js +0 -1
  64. package/dist/esm/ui/registered-menu/createTypeAheadRowRenderer.js +0 -69
  65. package/dist/esm/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -3
  66. package/dist/esm/ui/registered-menu/getTypeAheadItemId.js +0 -3
  67. package/dist/esm/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -32
  68. package/dist/esm/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -58
  69. package/dist/esm/ui/registered-menu/typeAheadMenuTypes.js +0 -1
  70. package/dist/esm/ui/registered-menu/typeAheadSurfaces.js +0 -21
  71. package/dist/esm/ui/registered-menu/useTypeAheadContext.js +0 -9
  72. package/dist/types/ui/registered-menu/PassThrough.d.ts +0 -2
  73. package/dist/types/ui/registered-menu/TypeAheadContext.d.ts +0 -20
  74. package/dist/types/ui/registered-menu/TypeAheadItemRow.d.ts +0 -15
  75. package/dist/types/ui/registered-menu/TypeAheadMenuFooter.d.ts +0 -11
  76. package/dist/types/ui/registered-menu/TypeAheadMenuRenderer.d.ts +0 -19
  77. package/dist/types/ui/registered-menu/TypeAheadProvider.d.ts +0 -3
  78. package/dist/types/ui/registered-menu/TypeAheadSectionRow.d.ts +0 -5
  79. package/dist/types/ui/registered-menu/buildTypeAheadMenuModel.d.ts +0 -3
  80. package/dist/types/ui/registered-menu/createTypeAheadRowRenderer.d.ts +0 -17
  81. package/dist/types/ui/registered-menu/getTypeAheadGlobalViewMoreId.d.ts +0 -1
  82. package/dist/types/ui/registered-menu/getTypeAheadItemId.d.ts +0 -1
  83. package/dist/types/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.d.ts +0 -3
  84. package/dist/types/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.d.ts +0 -2
  85. package/dist/types/ui/registered-menu/typeAheadMenuTypes.d.ts +0 -8
  86. package/dist/types/ui/registered-menu/typeAheadSurfaces.d.ts +0 -17
  87. package/dist/types/ui/registered-menu/useTypeAheadContext.d.ts +0 -2
@@ -11,264 +11,165 @@ require("./RegisteredTypeAheadMenu.compiled.css");
11
11
  var _runtime = require("@compiled/react/runtime");
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
- var _reactIntl = require("react-intl");
14
+ var _isOfflineMode = require("@atlaskit/editor-common/connectivity/isOfflineMode");
15
15
  var _Popup = _interopRequireDefault(require("@atlaskit/editor-common/Popup"));
16
- var _registeredMenuModel = require("@atlaskit/editor-common/quick-insert/registered-menu-model");
17
- var _useMenuPopupSizing = require("@atlaskit/editor-common/quick-insert/use-menu-popup-sizing");
18
- var _useSearchAnalytics = require("@atlaskit/editor-common/quick-insert/use-search-analytics");
19
- var _typeAheadIsSectionOverflowItemKey = require("@atlaskit/editor-common/type-ahead-is-section-overflow-item-key");
20
- var _typeAheadSurfaceContext = require("@atlaskit/editor-common/type-ahead-surface-context");
16
+ var _context = require("@atlaskit/editor-common/registered-menu/context");
17
+ var _popupSizing = require("@atlaskit/editor-common/registered-menu/popup-sizing");
18
+ var _surfaceContext = require("@atlaskit/editor-common/registered-menu/surface-context");
19
+ var _useSharedPluginStateWithSelector = require("@atlaskit/editor-common/useSharedPluginStateWithSelector");
21
20
  var _constants = require("@atlaskit/editor-shared-styles/constants");
22
- var _createSurfaceContext = require("@atlaskit/editor-ui-control-model/create-surface-context");
21
+ var _insertTypeAheadItem = require("../../pm-plugins/commands/insert-type-ahead-item");
23
22
  var _InputQuery = require("../InputQuery");
24
- var _getTypeAheadGlobalViewMoreId = require("./getTypeAheadGlobalViewMoreId");
25
- var _getTypeAheadItemId = require("./getTypeAheadItemId");
26
- var _TypeAheadMenuRenderer = require("./TypeAheadMenuRenderer");
27
- var _TypeAheadProvider = require("./TypeAheadProvider");
28
23
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
29
- var styles = {
30
- menu: "_19itglyw _2rko1mok _1reo15vq _18m915vq _bfhk1bhr _r06hglyw _vchhusvi _16qs130s _1q51idpf _85i5idpf _1bsbnklw"
31
- };
32
24
  var DEFAULT_MENU_MAX_HEIGHT = 480;
33
- var MENU_WIDTH = 320;
34
25
  var POPUP_OFFSET = [0, 8];
26
+ var styles = {
27
+ popup: "_19itglyw _2rko1mok _1reo15vq _18m915vq _bfhk1bhr _r06hglyw _vchhusvi _1q51idpf _85i5idpf _16qs130s _1bsbnklw"
28
+ };
35
29
  var EMPTY_COMPONENTS = [];
36
30
  var subscribeToNothing = function subscribeToNothing() {
37
31
  return function () {};
38
32
  };
39
- var RegisteredTypeAheadMenu = exports.RegisteredTypeAheadMenu = function RegisteredTypeAheadMenu(_ref) {
40
- var _api$uiControlRegistr2, _api$uiControlRegistr3, _api$analytics;
41
- var anchorElement = _ref.anchorElement,
42
- api = _ref.api,
43
- cancel = _ref.cancel,
44
- editorView = _ref.editorView,
45
- forceFocus = _ref.forceFocus,
46
- _ref$maxHeight = _ref.maxHeight,
47
- maxHeight = _ref$maxHeight === void 0 ? DEFAULT_MENU_MAX_HEIGHT : _ref$maxHeight,
48
- onClose = _ref.onClose,
49
- onUndoRedo = _ref.onUndoRedo,
50
- popupsBoundariesElement = _ref.popupsBoundariesElement,
51
- popupsMountPoint = _ref.popupsMountPoint,
52
- popupsScrollableElement = _ref.popupsScrollableElement,
53
- query = _ref.query,
54
- reopenQuery = _ref.reopenQuery,
55
- setQuery = _ref.setQuery,
56
- surface = _ref.surface,
57
- triggerHandler = _ref.triggerHandler;
58
- var menuHeight = (0, _useMenuPopupSizing.useMenuPopupSizing)({
59
- target: anchorElement,
60
- boundariesElement: popupsBoundariesElement,
61
- scrollableElement: popupsScrollableElement,
62
- maxHeight: maxHeight,
33
+ var noOp = function noOp() {};
34
+ var RegisteredTypeAheadMenu = exports.RegisteredTypeAheadMenu = function RegisteredTypeAheadMenu(props) {
35
+ var _props$maxHeight, _api$uiControlRegistr2, _api$uiControlRegistr3, _root$isHidden;
36
+ var api = props.api,
37
+ registeredMenuKey = props.registeredMenuKey,
38
+ query = props.query,
39
+ editorView = props.editorView,
40
+ onClose = props.onClose,
41
+ triggerHandler = props.triggerHandler,
42
+ popupsMountPoint = props.popupsMountPoint;
43
+ var rootComponent = (0, _react.useMemo)(function () {
44
+ return {
45
+ key: registeredMenuKey,
46
+ type: 'menu'
47
+ };
48
+ }, [registeredMenuKey]);
49
+ var _useState = (0, _react.useState)(),
50
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
51
+ menuInteraction = _useState2[0],
52
+ setMenuInteraction = _useState2[1];
53
+ var registerInteraction = (0, _react.useCallback)(function (interaction) {
54
+ setMenuInteraction(interaction);
55
+ return function () {
56
+ return setMenuInteraction(function (current) {
57
+ return current === interaction ? undefined : current;
58
+ });
59
+ };
60
+ }, []);
61
+ var maxHeight = (0, _popupSizing.useMenuPopupSizing)({
62
+ target: props.anchorElement,
63
+ boundariesElement: props.popupsBoundariesElement,
64
+ scrollableElement: props.popupsScrollableElement,
65
+ maxHeight: (_props$maxHeight = props.maxHeight) !== null && _props$maxHeight !== void 0 ? _props$maxHeight : DEFAULT_MENU_MAX_HEIGHT,
63
66
  offset: POPUP_OFFSET[1]
64
67
  });
65
- var _useIntl = (0, _reactIntl.useIntl)(),
66
- formatMessage = _useIntl.formatMessage;
67
- var generatedId = (0, _react.useId)();
68
- var listId = "".concat(surface.listIdPrefix, "-").concat(generatedId);
69
- var menuRef = (0, _react.useRef)(null);
70
- var _useState = (0, _react.useState)(function () {
71
- return {
72
- menuOpenId: Symbol('type-ahead-menu-open')
73
- };
68
+ var cancelMenu = (0, _react.useCallback)(function (params) {
69
+ var _menuInteraction$onCl;
70
+ menuInteraction === null || menuInteraction === void 0 || (_menuInteraction$onCl = menuInteraction.onClose) === null || _menuInteraction$onCl === void 0 || _menuInteraction$onCl.call(menuInteraction);
71
+ props.cancel(params);
72
+ }, [menuInteraction, props.cancel]);
73
+ var _useState3 = (0, _react.useState)(function () {
74
+ return Symbol('type-ahead-menu-open');
74
75
  }),
75
- _useState2 = (0, _slicedToArray2.default)(_useState, 1),
76
- typeAheadSurfaceContext = _useState2[0];
76
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 1),
77
+ menuOpenId = _useState4[0];
77
78
  var surfaceContext = (0, _react.useMemo)(function () {
78
- return (0, _createSurfaceContext.createSurfaceContext)(_typeAheadSurfaceContext.TYPE_AHEAD_SURFACE_CONTEXT, typeAheadSurfaceContext);
79
- }, [typeAheadSurfaceContext]);
80
- var _useState3 = (0, _react.useState)(0),
81
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
82
- selectedItemIndex = _useState4[0],
83
- setSelectedItemIndex = _useState4[1];
84
- var selectedItemIndexRef = (0, _react.useRef)(selectedItemIndex);
79
+ return (0, _surfaceContext.createRegisteredMenuSurfaceContext)({
80
+ menuOpenId: menuOpenId,
81
+ surface: 'typeahead'
82
+ });
83
+ }, [menuOpenId]);
85
84
  var getComponents = (0, _react.useCallback)(function () {
86
85
  var _api$uiControlRegistr;
87
- var components = api === null || api === void 0 || (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.getComponents(surface.root.key);
86
+ var components = api === null || api === void 0 || (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.getComponents(rootComponent.key);
88
87
  return components !== null && components !== void 0 && components.length ? components : EMPTY_COMPONENTS;
89
- }, [api, surface.root.key]);
88
+ }, [api, rootComponent.key]);
90
89
  var components = (0, _react.useSyncExternalStore)((_api$uiControlRegistr2 = api === null || api === void 0 || (_api$uiControlRegistr3 = api.uiControlRegistry) === null || _api$uiControlRegistr3 === void 0 ? void 0 : _api$uiControlRegistr3.actions.subscribe) !== null && _api$uiControlRegistr2 !== void 0 ? _api$uiControlRegistr2 : subscribeToNothing, getComponents, getComponents);
91
- var hasSectionOverflowItems = (0, _react.useMemo)(function () {
92
- return components.some(function (_ref2) {
93
- var key = _ref2.key;
94
- return (0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(key);
95
- });
96
- }, [components]);
97
- var menuModel = (0, _react.useMemo)(function () {
98
- return (0, _registeredMenuModel.getQuickInsertMenuModel)({
99
- components: components,
100
- formatMessage: formatMessage,
101
- getItemRank: triggerHandler.getRegisteredItemRank,
102
- query: query,
103
- rootComponent: surface.root,
104
- selectCategoryItems: hasSectionOverflowItems ? _registeredMenuModel.selectQuickInsertCategoryItems : undefined,
105
- surfaceContext: surfaceContext
90
+ var root = (0, _react.useMemo)(function () {
91
+ return components.find(function (_ref) {
92
+ var key = _ref.key,
93
+ type = _ref.type,
94
+ parents = _ref.parents;
95
+ return key === rootComponent.key && type === rootComponent.type && !(parents !== null && parents !== void 0 && parents.length);
106
96
  });
107
- }, [components, formatMessage, hasSectionOverflowItems, query, surfaceContext, surface.root, triggerHandler.getRegisteredItemRank]);
108
- var rows = (0, _react.useMemo)(function () {
109
- return (0, _registeredMenuModel.getQuickInsertMenuRows)(menuModel);
110
- }, [menuModel]);
111
- var searchResultCount = (0, _react.useMemo)(function () {
112
- return menuModel.sections.reduce(function (count, section) {
113
- return count + section.filter(function (_ref3) {
114
- var key = _ref3.key,
115
- type = _ref3.type;
116
- return type === 'menu-item' && !(0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(key);
117
- }).length;
118
- }, 0);
119
- }, [menuModel.sections]);
120
- var flushSearchAnalytics = (0, _useSearchAnalytics.useQuickInsertSearchAnalytics)({
121
- fireAnalyticsEvent: api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions.fireAnalyticsEvent,
122
- query: query,
123
- resultCount: searchResultCount,
124
- surface: 'typeahead'
125
- });
126
- var closeMenu = (0, _react.useCallback)(function () {
127
- flushSearchAnalytics();
97
+ }, [components, rootComponent]);
98
+ var Root = root !== null && root !== void 0 && (_root$isHidden = root.isHidden) !== null && _root$isHidden !== void 0 && _root$isHidden.call(root, {
99
+ surfaceContext: surfaceContext
100
+ }) ? undefined : root === null || root === void 0 ? void 0 : root.component;
101
+ // Interaction updates should not recreate the registered component's own props.
102
+ var menu = (0, _react.useMemo)(function () {
103
+ return Root && /*#__PURE__*/_react.default.createElement(Root, null, null);
104
+ }, [Root]);
105
+ var _useSharedPluginState = (0, _useSharedPluginStateWithSelector.useSharedPluginStateWithSelector)(api, ['connectivity'], function (_ref2) {
106
+ var connectivityState = _ref2.connectivityState;
107
+ return {
108
+ isOffline: (0, _isOfflineMode.isOfflineMode)(connectivityState === null || connectivityState === void 0 ? void 0 : connectivityState.mode)
109
+ };
110
+ }),
111
+ isOffline = _useSharedPluginState.isOffline;
112
+ var select = (0, _react.useCallback)(function (selectItem) {
128
113
  onClose();
129
- }, [flushSearchAnalytics, onClose]);
130
- var _useState5 = (0, _react.useState)(),
131
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
132
- previewActivation = _useState6[0],
133
- setPreviewActivation = _useState6[1];
134
- var activePreviewItemKey = (previewActivation === null || previewActivation === void 0 ? void 0 : previewActivation.menuModel) === menuModel ? previewActivation.itemKey : undefined;
135
- var selectableRowIndexes = (0, _react.useMemo)(function () {
136
- return rows.flatMap(function (registration, rowIndex) {
137
- return registration.type === 'menu-item' ? [rowIndex] : [];
138
- });
139
- }, [rows]);
140
- var selectableRowKeys = selectableRowIndexes.map(function (index) {
141
- var _rows$index;
142
- return (_rows$index = rows[index]) === null || _rows$index === void 0 ? void 0 : _rows$index.key;
143
- }).join(',');
144
- var selectableItemCount = selectableRowIndexes.length + (menuModel.footer ? 1 : 0);
145
- (0, _react.useLayoutEffect)(function () {
146
- var initialItemIndex = selectableItemCount > 0 ? 0 : -1;
147
- selectedItemIndexRef.current = initialItemIndex;
148
- setSelectedItemIndex(initialItemIndex);
149
- }, [query, selectableItemCount, selectableRowKeys]);
150
- (0, _react.useLayoutEffect)(function () {
151
- setPreviewActivation(undefined);
152
- }, [menuModel, query]);
153
- var selectActiveItem = (0, _react.useCallback)(function (_mode) {
154
- var rowIndex = selectableRowIndexes[selectedItemIndex];
155
- var selectedId = rowIndex !== undefined ? (0, _getTypeAheadItemId.getTypeAheadItemId)(listId, rowIndex) : menuModel.footer && selectedItemIndex === selectableRowIndexes.length ? (0, _getTypeAheadGlobalViewMoreId.getTypeAheadGlobalViewMoreId)(listId) : undefined;
156
- if (selectedId) {
157
- var _menuRef$current;
158
- (_menuRef$current = menuRef.current) === null || _menuRef$current === void 0 || (_menuRef$current = _menuRef$current.ownerDocument.getElementById(selectedId)) === null || _menuRef$current === void 0 || _menuRef$current.click();
159
- }
160
- }, [listId, menuModel.footer, selectableRowIndexes, selectedItemIndex]);
161
- var setKeyboardPreview = (0, _react.useCallback)(function (itemIndex) {
162
- var rowIndex = selectableRowIndexes[itemIndex];
163
- var registration = rowIndex === undefined ? undefined : rows[rowIndex];
164
- setPreviewActivation((registration === null || registration === void 0 ? void 0 : registration.type) === 'menu-item' ? {
165
- itemKey: registration.key,
166
- menuModel: menuModel,
167
- source: 'keyboard'
168
- } : undefined);
169
- }, [menuModel, rows, selectableRowIndexes]);
170
- var selectNextItem = (0, _react.useCallback)(function () {
171
- var currentIndex = selectedItemIndexRef.current;
172
- var nextIndex = selectableItemCount === 0 ? -1 : currentIndex < 0 || currentIndex === selectableItemCount - 1 ? 0 : currentIndex + 1;
173
- selectedItemIndexRef.current = nextIndex;
174
- setSelectedItemIndex(nextIndex);
175
- setKeyboardPreview(nextIndex);
176
- }, [selectableItemCount, setKeyboardPreview]);
177
- var selectPreviousItem = (0, _react.useCallback)(function () {
178
- var currentIndex = selectedItemIndexRef.current;
179
- var previousIndex = selectableItemCount === 0 ? -1 : currentIndex <= 0 ? selectableItemCount - 1 : currentIndex - 1;
180
- selectedItemIndexRef.current = previousIndex;
181
- setSelectedItemIndex(previousIndex);
182
- setKeyboardPreview(previousIndex);
183
- }, [selectableItemCount, setKeyboardPreview]);
184
- var onItemHover = (0, _react.useCallback)(function (itemIndex, itemKey) {
185
- selectedItemIndexRef.current = itemIndex;
186
- setSelectedItemIndex(itemIndex);
187
- setPreviewActivation(function (current) {
188
- if ((current === null || current === void 0 ? void 0 : current.itemKey) === itemKey && (current === null || current === void 0 ? void 0 : current.menuModel) === menuModel && (current === null || current === void 0 ? void 0 : current.source) === 'pointer') {
189
- return current;
190
- }
191
- return itemKey ? {
192
- itemKey: itemKey,
193
- menuModel: menuModel,
194
- source: 'pointer'
195
- } : undefined;
196
- });
197
- }, [menuModel]);
198
- var onItemLeave = (0, _react.useCallback)(function (itemKey) {
199
- setPreviewActivation(function (current) {
200
- return (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current;
201
- });
202
- }, []);
203
- var onItemVisibilityChange = (0, _react.useCallback)(function (itemKey, isVisible) {
204
- if (!isVisible) {
205
- setPreviewActivation(function (current) {
206
- return (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current;
114
+ queueMicrotask(function () {
115
+ return (0, _insertTypeAheadItem.performTypeAheadSelection)(editorView)({
116
+ handler: triggerHandler,
117
+ query: query,
118
+ selectItem: selectItem
207
119
  });
208
- }
209
- }, []);
210
- var typeAheadContextValue = (0, _react.useMemo)(function () {
120
+ });
121
+ }, [editorView, onClose, query, triggerHandler]);
122
+ var registeredMenu = (0, _react.useMemo)(function () {
211
123
  return {
212
- activePreviewItemKey: activePreviewItemKey,
213
- api: api,
124
+ components: components,
125
+ onClose: onClose,
126
+ maxHeight: maxHeight,
127
+ registerInteraction: registerInteraction,
214
128
  editorView: editorView,
215
- inputMethod: surface.inputMethod,
216
- menuOpenId: typeAheadSurfaceContext.menuOpenId,
217
- onClose: closeMenu,
218
- popupsMountPoint: popupsMountPoint,
129
+ getItemRank: triggerHandler.getRegisteredItemRank,
130
+ isOffline: isOffline,
131
+ menuOpenId: menuOpenId,
132
+ portalMountPoint: popupsMountPoint,
133
+ rootComponent: rootComponent,
219
134
  query: query,
220
- surfaceContext: surfaceContext,
221
- triggerHandler: triggerHandler
135
+ select: select,
136
+ surfaceContext: surfaceContext
222
137
  };
223
- }, [activePreviewItemKey, api, editorView, closeMenu, popupsMountPoint, query, surface.inputMethod, surfaceContext, triggerHandler, typeAheadSurfaceContext]);
224
- var noOp = (0, _react.useCallback)(function () {}, []);
225
- var SurfaceProvider = surface.Provider;
226
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_InputQuery.InputQuery, {
227
- activeDescendantId: selectableRowIndexes[selectedItemIndex] !== undefined ? (0, _getTypeAheadItemId.getTypeAheadItemId)(listId, selectableRowIndexes[selectedItemIndex]) : menuModel.footer && selectedItemIndex === selectableRowIndexes.length ? (0, _getTypeAheadGlobalViewMoreId.getTypeAheadGlobalViewMoreId)(listId) : undefined,
228
- cancel: cancel,
138
+ }, [onClose, maxHeight, registerInteraction, components, editorView, triggerHandler.getRegisteredItemRank, isOffline, menuOpenId, popupsMountPoint, rootComponent, query, select, surfaceContext]);
139
+ return /*#__PURE__*/_react.default.createElement(_context.RegisteredMenuContext.Provider, {
140
+ value: registeredMenu
141
+ }, /*#__PURE__*/_react.default.createElement(_InputQuery.InputQuery, {
142
+ menuInteraction: menuInteraction,
143
+ cancel: cancelMenu,
229
144
  editorView: editorView,
230
- forceFocus: forceFocus,
231
- listId: listId,
232
- onItemSelect: selectActiveItem,
233
- onQueryChange: setQuery,
145
+ forceFocus: props.forceFocus,
146
+ onItemSelect: noOp,
147
+ onQueryChange: props.setQuery,
234
148
  onQueryFocus: noOp,
235
- onUndoRedo: onUndoRedo,
236
- optionCount: selectableItemCount,
237
- reopenQuery: reopenQuery,
238
- selectNextItem: selectNextItem,
239
- selectPreviousItem: selectPreviousItem,
149
+ onUndoRedo: props.onUndoRedo,
150
+ optionCount: 0,
151
+ reopenQuery: props.reopenQuery,
152
+ selectNextItem: noOp,
153
+ selectPreviousItem: noOp,
240
154
  shouldKeepOpenOnRegisteredMenu: true,
241
155
  triggerQueryPrefix: triggerHandler.trigger
242
- }), /*#__PURE__*/_react.default.createElement(_Popup.default, {
243
- ariaLabel: null,
244
- boundariesElement: popupsBoundariesElement,
245
- fitHeight: menuHeight,
246
- fitWidth: MENU_WIDTH,
156
+ }), Root && /*#__PURE__*/_react.default.createElement(_Popup.default, {
157
+ zIndex: _constants.akEditorFloatingDialogZIndex,
158
+ target: props.anchorElement,
247
159
  mountTo: popupsMountPoint,
160
+ boundariesElement: props.popupsBoundariesElement,
161
+ scrollableElement: props.popupsScrollableElement,
162
+ fitHeight: maxHeight,
163
+ fitWidth: 320,
248
164
  offset: POPUP_OFFSET,
249
- preventOverflow: true,
250
- scrollableElement: popupsScrollableElement,
251
- target: anchorElement,
252
- zIndex: _constants.akEditorFloatingDialogZIndex
165
+ ariaLabel: null,
166
+ preventOverflow: true
253
167
  }, /*#__PURE__*/_react.default.createElement("div", {
254
- ref: menuRef,
255
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Parent overlays use this class to restore pointer interaction.
256
- className: (0, _runtime.ax)([styles.menu, "fabric-editor-typeahead"]),
168
+ // Legacy host integrations also use this popup selector.
169
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Preserve the typeahead popup selector.
170
+ className: (0, _runtime.ax)([styles.popup, "fabric-editor-typeahead"]),
257
171
  "data-registered-type-ahead-menu": "",
258
- "data-testid": "registered-type-ahead-menu"
259
- }, /*#__PURE__*/_react.default.createElement(_TypeAheadProvider.TypeAheadProvider, {
260
- value: typeAheadContextValue
261
- }, /*#__PURE__*/_react.default.createElement(SurfaceProvider, null, /*#__PURE__*/_react.default.createElement(_TypeAheadMenuRenderer.TypeAheadMenuRenderer, {
262
- Item: surface.Item,
263
- listLabel: surface.listLabel,
264
- listId: listId,
265
- maxHeight: Math.max(0, menuHeight),
266
- model: menuModel,
267
- query: query,
268
- hasScrollPadding: true,
269
- onItemHover: onItemHover,
270
- onItemLeave: onItemLeave,
271
- onItemVisibilityChange: onItemVisibilityChange,
272
- selectedItemIndex: selectedItemIndex
273
- }))))));
172
+ "data-testid": "registered-type-ahead-menu",
173
+ hidden: !menuInteraction
174
+ }, menu)));
274
175
  };
@@ -283,19 +283,15 @@ const executeTypeAheadSelection = view => ({
283
283
  view.focus();
284
284
  };
285
285
  export const performTypeAheadSelection = view => ({
286
- inputMethod,
287
- selectionHandler,
288
286
  handler,
289
- query
287
+ query,
288
+ selectItem
290
289
  }) => {
291
290
  executeTypeAheadSelection(view)({
292
291
  handler,
293
292
  mode: SelectItemMode.SELECTED,
294
293
  query,
295
294
  sourceListItem: [],
296
- selectItem: (_state, insert) => selectionHandler({
297
- insert,
298
- source: inputMethod
299
- })
295
+ selectItem: (_state, insert) => selectItem(insert)
300
296
  });
301
297
  };
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/useSharedPluginStateWithSelector';
3
- import { getTypeAheadSurface } from './registered-menu/typeAheadSurfaces';
4
3
  import { TypeAheadMenu } from './TypeAheadMenu';
5
4
  export function ContentComponent({
6
5
  api,
@@ -32,7 +31,7 @@ export function ContentComponent({
32
31
  if (items === undefined || sections === undefined || decorationSet === undefined || errorInfo === undefined || decorationElement === undefined || query === undefined || selectedIndex === undefined) {
33
32
  return null;
34
33
  }
35
- if (getTypeAheadSurface(triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.id)) {
34
+ if (triggerHandler !== null && triggerHandler !== void 0 && triggerHandler.registeredMenuKey) {
36
35
  return null;
37
36
  }
38
37
  return /*#__PURE__*/React.createElement(TypeAheadMenu, {
@@ -105,12 +105,16 @@ export const InputQuery = /*#__PURE__*/React.memo(({
105
105
  onUndoRedo,
106
106
  editorView,
107
107
  items,
108
+ inputLabel,
109
+ menuInteraction,
108
110
  listId,
109
111
  optionCount,
110
112
  shouldKeepOpenOnRegisteredMenu
111
113
  }) => {
112
- var _ref;
113
- const resolvedOptionCount = (_ref = optionCount !== null && optionCount !== void 0 ? optionCount : items === null || items === void 0 ? void 0 : items.length) !== null && _ref !== void 0 ? _ref : 0;
114
+ var _ref, _ref2, _menuInteraction$opti, _ref3, _menuInteraction$list, _menuInteraction$expa, _ref4, _menuInteraction$labe;
115
+ const resolvedOptionCount = (_ref = (_ref2 = (_menuInteraction$opti = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.optionCount) !== null && _menuInteraction$opti !== void 0 ? _menuInteraction$opti : optionCount) !== null && _ref2 !== void 0 ? _ref2 : items === null || items === void 0 ? void 0 : items.length) !== null && _ref !== void 0 ? _ref : 0;
116
+ const resolvedActiveDescendantId = menuInteraction ? menuInteraction.activeDescendantId : activeDescendantId;
117
+ const resolvedListId = (_ref3 = (_menuInteraction$list = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.listId) !== null && _menuInteraction$list !== void 0 ? _menuInteraction$list : listId) !== null && _ref3 !== void 0 ? _ref3 : TYPE_AHEAD_DECORATION_ELEMENT_ID;
114
118
  const ref = useRef(document.createElement('span'));
115
119
  const inputRef = useRef(null);
116
120
  const [query, setQuery] = useState(null);
@@ -178,7 +182,7 @@ export const InputQuery = /*#__PURE__*/React.memo(({
178
182
  // TODO: ED-14758 - Under the W3C specification, any keycode sent under IME would return a keycode 229
179
183
  // event.isComposing can't be used alone as this also included a virtual keyboard under a keyboardless device, therefore, it seems the best practice would be intercepting the event as below.
180
184
  // Some suggested the other workaround maybe listen on`keypress` instead of `keydown`
181
- if (!event.isComposing && event.which !== 229 && event.keyCode !== 229) {
185
+ if (!menuInteraction && !event.isComposing && event.which !== 229 && event.keyCode !== 229) {
182
186
  if (selectedIndex === -1) {
183
187
  /**
184
188
  * TODO DTR-1401: (also see ED-17200) There are two options
@@ -197,12 +201,21 @@ export const InputQuery = /*#__PURE__*/React.memo(({
197
201
  }
198
202
  break;
199
203
  case 'Tab':
204
+ if (menuInteraction) {
205
+ break;
206
+ }
200
207
  event.shiftKey ? selectPreviousItem() : selectNextItem();
201
208
  break;
202
209
  case 'ArrowDown':
210
+ if (menuInteraction) {
211
+ break;
212
+ }
203
213
  selectNextItem();
204
214
  break;
205
215
  case 'ArrowUp':
216
+ if (menuInteraction) {
217
+ break;
218
+ }
206
219
  selectPreviousItem();
207
220
  break;
208
221
  }
@@ -210,12 +223,12 @@ export const InputQuery = /*#__PURE__*/React.memo(({
210
223
  if (onUndoRedo && undoRedoType && onUndoRedo(undoRedoType)) {
211
224
  stopDefault = true;
212
225
  }
213
- if (isNavigationKey(event) || stopDefault) {
226
+ if (!menuInteraction && isNavigationKey(event) || stopDefault) {
214
227
  event.stopPropagation();
215
228
  event.preventDefault();
216
229
  return false;
217
230
  }
218
- }, [onUndoRedo, onItemSelect, selectNextItem, selectPreviousItem, cancel, cleanedInputContent, editorView.state, isEditorControlsEnabled]);
231
+ }, [onUndoRedo, menuInteraction, onItemSelect, selectNextItem, selectPreviousItem, cancel, cleanedInputContent, editorView.state, isEditorControlsEnabled]);
219
232
  useLayoutEffect(() => {
220
233
  if (!ref.current) {
221
234
  return;
@@ -231,6 +244,21 @@ export const InputQuery = /*#__PURE__*/React.memo(({
231
244
  onQueryFocus();
232
245
  };
233
246
  const keyDown = event => {
247
+ const isComposing = event.isComposing || event.which === 229 || event.keyCode === 229;
248
+ if (menuInteraction && isComposing) {
249
+ return;
250
+ }
251
+ if (menuInteraction && event.key === 'Tab') {
252
+ event.shiftKey ? menuInteraction.selectPrevious() : menuInteraction.selectNext();
253
+ event.stopPropagation();
254
+ event.preventDefault();
255
+ return;
256
+ }
257
+ if (menuInteraction !== null && menuInteraction !== void 0 && menuInteraction.onKeyDown(event)) {
258
+ event.stopPropagation();
259
+ event.preventDefault();
260
+ return;
261
+ }
234
262
  const key = keyNameNormalized(event);
235
263
  if (['ArrowLeft', 'ArrowRight'].includes(key) && document.getSelection && document.getSelection()) {
236
264
  var _ref$current3;
@@ -277,11 +305,9 @@ export const InputQuery = /*#__PURE__*/React.memo(({
277
305
  const {
278
306
  relatedTarget
279
307
  } = event;
280
-
281
- // Given the user is changing the focus
282
- // When the target is inside the TypeAhead Popup
283
- // Then the popup should stay open
284
- if (relatedTarget instanceof HTMLElement && relatedTarget.closest && (relatedTarget.closest(`.${TYPE_AHEAD_POPUP_CONTENT_CLASS}`) || shouldKeepOpenOnRegisteredMenu && relatedTarget.closest('[data-registered-type-ahead-menu]'))) {
308
+ // Given the user is changing focus, keep the popup open when the target belongs to its menu.
309
+ const isInsideMenu = menuInteraction ? relatedTarget instanceof Node && menuInteraction.containsTarget(relatedTarget) : relatedTarget instanceof HTMLElement && (!!relatedTarget.closest(`.${TYPE_AHEAD_POPUP_CONTENT_CLASS}`) || shouldKeepOpenOnRegisteredMenu && !!relatedTarget.closest('[data-registered-type-ahead-menu]'));
310
+ if (isInsideMenu) {
285
311
  return;
286
312
  }
287
313
 
@@ -404,7 +430,7 @@ export const InputQuery = /*#__PURE__*/React.memo(({
404
430
  element.removeEventListener('input', onInput);
405
431
  }
406
432
  };
407
- }, [triggerQueryPrefix, cleanedInputContent, onQueryFocus, cancel, checkKeyEvent, editorView.state, isEditorControlsEnabled, shouldKeepOpenOnRegisteredMenu]);
433
+ }, [triggerQueryPrefix, cleanedInputContent, onQueryFocus, cancel, checkKeyEvent, editorView.state, isEditorControlsEnabled, shouldKeepOpenOnRegisteredMenu, menuInteraction]);
408
434
  useLayoutEffect(() => {
409
435
  const hasReopenQuery = typeof reopenQuery === 'string' && reopenQuery.trim().length > 0;
410
436
  if (ref.current && forceFocus) {
@@ -439,18 +465,20 @@ export const InputQuery = /*#__PURE__*/React.memo(({
439
465
  onKeyUp: onKeyUp,
440
466
  tabIndex: -1,
441
467
  role: "combobox",
442
- "aria-activedescendant": activeDescendantId,
443
- "aria-controls": listId !== null && listId !== void 0 ? listId : TYPE_AHEAD_DECORATION_ELEMENT_ID,
468
+ "aria-activedescendant": resolvedActiveDescendantId,
469
+ "aria-controls": resolvedListId,
444
470
  "aria-autocomplete": "list",
445
- "aria-expanded": resolvedOptionCount !== 0,
446
- "aria-labelledby": assistiveHintID,
471
+ "aria-expanded": (_menuInteraction$expa = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.expanded) !== null && _menuInteraction$expa !== void 0 ? _menuInteraction$expa : resolvedOptionCount !== 0,
472
+ "aria-haspopup": menuInteraction ? 'listbox' : undefined,
473
+ "aria-label": menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.label,
474
+ "aria-labelledby": menuInteraction ? undefined : assistiveHintID,
447
475
  suppressContentEditableWarning: true,
448
476
  "data-query-prefix": triggerQueryPrefix,
449
477
  "data-place-holder": intl.formatMessage(typeAheadListMessages.quickInsertInputPlaceholderLabel)
450
478
  }, query === null ? jsx("input", {
451
479
  ref: inputRef,
452
480
  type: "text",
453
- "aria-label": intl.formatMessage(getAriaLabel(triggerQueryPrefix, intl))
481
+ "aria-label": (_ref4 = (_menuInteraction$labe = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.label) !== null && _menuInteraction$labe !== void 0 ? _menuInteraction$labe : inputLabel) !== null && _ref4 !== void 0 ? _ref4 : intl.formatMessage(getAriaLabel(triggerQueryPrefix, intl))
454
482
  }) : query), jsx("span", {
455
483
  id: assistiveHintID,
456
484
  style: {
@@ -14,7 +14,6 @@ import { useLoadItems } from './hooks/use-load-items';
14
14
  import { useOnForceSelect } from './hooks/use-on-force-select';
15
15
  import { InputQuery } from './InputQuery';
16
16
  import { RegisteredTypeAheadMenu } from './registered-menu/RegisteredTypeAheadMenu';
17
- import { getTypeAheadSurface } from './registered-menu/typeAheadSurfaces';
18
17
  export const WrapperTypeAhead = /*#__PURE__*/React.memo(({
19
18
  triggerHandler,
20
19
  editorView,
@@ -40,8 +39,8 @@ export const WrapperTypeAhead = /*#__PURE__*/React.memo(({
40
39
  const [query, setQuery] = useState(reopenQuery || '');
41
40
  const queryRef = useRef(query);
42
41
  const editorViewRef = useRef(editorView);
43
- const registeredSurface = getTypeAheadSurface(triggerHandler.id);
44
- const items = useLoadItems(triggerHandler, editorView, query, showMoreOptionsButton, api, intl, !registeredSurface);
42
+ const registeredMenuKey = triggerHandler.registeredMenuKey;
43
+ const items = useLoadItems(triggerHandler, editorView, query, showMoreOptionsButton, api, intl, !registeredMenuKey);
45
44
  useEffect(() => {
46
45
  if (!closed && fg('platform_editor_ease_of_use_metrics')) {
47
46
  var _api$metrics;
@@ -144,7 +143,7 @@ export const WrapperTypeAhead = /*#__PURE__*/React.memo(({
144
143
  if (!triggerHandler) {
145
144
  return null;
146
145
  }
147
- if (registeredSurface) {
146
+ if (registeredMenuKey) {
148
147
  return /*#__PURE__*/React.createElement(RegisteredTypeAheadMenu, {
149
148
  anchorElement: anchorElement,
150
149
  api: api,
@@ -159,7 +158,7 @@ export const WrapperTypeAhead = /*#__PURE__*/React.memo(({
159
158
  query: query,
160
159
  reopenQuery: reopenQuery,
161
160
  setQuery: setQuery,
162
- surface: registeredSurface,
161
+ registeredMenuKey: registeredMenuKey,
163
162
  triggerHandler: triggerHandler
164
163
  });
165
164
  }