@atlaskit/editor-plugin-type-ahead 30.0.5 → 31.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +15 -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 +11 -11
  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
@@ -1,229 +1,141 @@
1
1
  /* RegisteredTypeAheadMenu.tsx generated by @compiled/babel-plugin v3.0.2 */
2
2
  import "./RegisteredTypeAheadMenu.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
- import React, { useCallback, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
5
- import { useIntl } from 'react-intl';
4
+ import React, { useCallback, useMemo, useState, useSyncExternalStore } from 'react';
5
+ import { isOfflineMode } from '@atlaskit/editor-common/connectivity/isOfflineMode';
6
6
  import Popup from '@atlaskit/editor-common/Popup';
7
- import { getQuickInsertMenuModel, getQuickInsertMenuRows, selectQuickInsertCategoryItems } from '@atlaskit/editor-common/quick-insert/registered-menu-model';
8
- import { useMenuPopupSizing } from '@atlaskit/editor-common/quick-insert/use-menu-popup-sizing';
9
- import { useQuickInsertSearchAnalytics } from '@atlaskit/editor-common/quick-insert/use-search-analytics';
10
- import { isSectionOverflowItemKey } from '@atlaskit/editor-common/type-ahead-is-section-overflow-item-key';
11
- import { TYPE_AHEAD_SURFACE_CONTEXT } from '@atlaskit/editor-common/type-ahead-surface-context';
7
+ import { RegisteredMenuContext } from '@atlaskit/editor-common/registered-menu/context';
8
+ import { useMenuPopupSizing } from '@atlaskit/editor-common/registered-menu/popup-sizing';
9
+ import { createRegisteredMenuSurfaceContext } from '@atlaskit/editor-common/registered-menu/surface-context';
10
+ import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/useSharedPluginStateWithSelector';
12
11
  import { akEditorFloatingDialogZIndex } from '@atlaskit/editor-shared-styles/constants';
13
- import { createSurfaceContext } from '@atlaskit/editor-ui-control-model/create-surface-context';
12
+ import { performTypeAheadSelection } from '../../pm-plugins/commands/insert-type-ahead-item';
14
13
  import { InputQuery } from '../InputQuery';
15
- import { getTypeAheadGlobalViewMoreId } from './getTypeAheadGlobalViewMoreId';
16
- import { getTypeAheadItemId } from './getTypeAheadItemId';
17
- import { TypeAheadMenuRenderer } from './TypeAheadMenuRenderer';
18
- import { TypeAheadProvider } from './TypeAheadProvider';
19
- const styles = {
20
- menu: "_19itglyw _2rko1mok _1reo15vq _18m915vq _bfhk1bhr _r06hglyw _vchhusvi _16qs130s _1q51idpf _85i5idpf _1bsbnklw"
21
- };
22
14
  const DEFAULT_MENU_MAX_HEIGHT = 480;
23
- const MENU_WIDTH = 320;
24
15
  const POPUP_OFFSET = [0, 8];
16
+ const styles = {
17
+ popup: "_19itglyw _2rko1mok _1reo15vq _18m915vq _bfhk1bhr _r06hglyw _vchhusvi _1q51idpf _85i5idpf _16qs130s _1bsbnklw"
18
+ };
25
19
  const EMPTY_COMPONENTS = [];
26
20
  const subscribeToNothing = () => () => {};
27
- export const RegisteredTypeAheadMenu = ({
28
- anchorElement,
29
- api,
30
- cancel,
31
- editorView,
32
- forceFocus,
33
- maxHeight = DEFAULT_MENU_MAX_HEIGHT,
34
- onClose,
35
- onUndoRedo,
36
- popupsBoundariesElement,
37
- popupsMountPoint,
38
- popupsScrollableElement,
39
- query,
40
- reopenQuery,
41
- setQuery,
42
- surface,
43
- triggerHandler
44
- }) => {
45
- var _api$uiControlRegistr2, _api$uiControlRegistr3, _api$analytics;
46
- const menuHeight = useMenuPopupSizing({
47
- target: anchorElement,
48
- boundariesElement: popupsBoundariesElement,
49
- scrollableElement: popupsScrollableElement,
50
- maxHeight,
21
+ const noOp = () => {};
22
+ export const RegisteredTypeAheadMenu = props => {
23
+ var _props$maxHeight, _api$uiControlRegistr2, _api$uiControlRegistr3, _root$isHidden;
24
+ const {
25
+ api,
26
+ registeredMenuKey,
27
+ query,
28
+ editorView,
29
+ onClose,
30
+ triggerHandler,
31
+ popupsMountPoint
32
+ } = props;
33
+ const rootComponent = useMemo(() => ({
34
+ key: registeredMenuKey,
35
+ type: 'menu'
36
+ }), [registeredMenuKey]);
37
+ const [menuInteraction, setMenuInteraction] = useState();
38
+ const registerInteraction = useCallback(interaction => {
39
+ setMenuInteraction(interaction);
40
+ return () => setMenuInteraction(current => current === interaction ? undefined : current);
41
+ }, []);
42
+ const maxHeight = useMenuPopupSizing({
43
+ target: props.anchorElement,
44
+ boundariesElement: props.popupsBoundariesElement,
45
+ scrollableElement: props.popupsScrollableElement,
46
+ maxHeight: (_props$maxHeight = props.maxHeight) !== null && _props$maxHeight !== void 0 ? _props$maxHeight : DEFAULT_MENU_MAX_HEIGHT,
51
47
  offset: POPUP_OFFSET[1]
52
48
  });
53
- const {
54
- formatMessage
55
- } = useIntl();
56
- const generatedId = useId();
57
- const listId = `${surface.listIdPrefix}-${generatedId}`;
58
- const menuRef = useRef(null);
59
- const [typeAheadSurfaceContext] = useState(() => ({
60
- menuOpenId: Symbol('type-ahead-menu-open')
61
- }));
62
- const surfaceContext = useMemo(() => createSurfaceContext(TYPE_AHEAD_SURFACE_CONTEXT, typeAheadSurfaceContext), [typeAheadSurfaceContext]);
63
- const [selectedItemIndex, setSelectedItemIndex] = useState(0);
64
- const selectedItemIndexRef = useRef(selectedItemIndex);
49
+ const cancelMenu = useCallback(params => {
50
+ var _menuInteraction$onCl;
51
+ menuInteraction === null || menuInteraction === void 0 ? void 0 : (_menuInteraction$onCl = menuInteraction.onClose) === null || _menuInteraction$onCl === void 0 ? void 0 : _menuInteraction$onCl.call(menuInteraction);
52
+ props.cancel(params);
53
+ }, [menuInteraction, props.cancel]);
54
+ const [menuOpenId] = useState(() => Symbol('type-ahead-menu-open'));
55
+ const surfaceContext = useMemo(() => createRegisteredMenuSurfaceContext({
56
+ menuOpenId,
57
+ surface: 'typeahead'
58
+ }), [menuOpenId]);
65
59
  const getComponents = useCallback(() => {
66
60
  var _api$uiControlRegistr;
67
- const components = api === null || api === void 0 ? void 0 : (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.getComponents(surface.root.key);
61
+ const components = api === null || api === void 0 ? void 0 : (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.getComponents(rootComponent.key);
68
62
  return components !== null && components !== void 0 && components.length ? components : EMPTY_COMPONENTS;
69
- }, [api, surface.root.key]);
63
+ }, [api, rootComponent.key]);
70
64
  const components = useSyncExternalStore((_api$uiControlRegistr2 = api === null || api === void 0 ? 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);
71
- const hasSectionOverflowItems = useMemo(() => components.some(({
72
- key
73
- }) => isSectionOverflowItemKey(key)), [components]);
74
- const menuModel = useMemo(() => getQuickInsertMenuModel({
75
- components,
76
- formatMessage,
77
- getItemRank: triggerHandler.getRegisteredItemRank,
78
- query,
79
- rootComponent: surface.root,
80
- selectCategoryItems: hasSectionOverflowItems ? selectQuickInsertCategoryItems : undefined,
81
- surfaceContext
82
- }), [components, formatMessage, hasSectionOverflowItems, query, surfaceContext, surface.root, triggerHandler.getRegisteredItemRank]);
83
- const rows = useMemo(() => getQuickInsertMenuRows(menuModel), [menuModel]);
84
- const searchResultCount = useMemo(() => menuModel.sections.reduce((count, section) => count + section.filter(({
65
+ const root = useMemo(() => components.find(({
85
66
  key,
86
- type
87
- }) => type === 'menu-item' && !isSectionOverflowItemKey(key)).length, 0), [menuModel.sections]);
88
- const flushSearchAnalytics = useQuickInsertSearchAnalytics({
89
- fireAnalyticsEvent: api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions.fireAnalyticsEvent,
90
- query,
91
- resultCount: searchResultCount,
92
- surface: 'typeahead'
93
- });
94
- const closeMenu = useCallback(() => {
95
- flushSearchAnalytics();
67
+ type,
68
+ parents
69
+ }) => key === rootComponent.key && type === rootComponent.type && !(parents !== null && parents !== void 0 && parents.length)), [components, rootComponent]);
70
+ const Root = root !== null && root !== void 0 && (_root$isHidden = root.isHidden) !== null && _root$isHidden !== void 0 && _root$isHidden.call(root, {
71
+ surfaceContext
72
+ }) ? undefined : root === null || root === void 0 ? void 0 : root.component;
73
+ // Interaction updates should not recreate the registered component's own props.
74
+ const menu = useMemo(() => Root && /*#__PURE__*/React.createElement(Root, null, null), [Root]);
75
+ const {
76
+ isOffline
77
+ } = useSharedPluginStateWithSelector(api, ['connectivity'], ({
78
+ connectivityState
79
+ }) => ({
80
+ isOffline: isOfflineMode(connectivityState === null || connectivityState === void 0 ? void 0 : connectivityState.mode)
81
+ }));
82
+ const select = useCallback(selectItem => {
96
83
  onClose();
97
- }, [flushSearchAnalytics, onClose]);
98
- const [previewActivation, setPreviewActivation] = useState();
99
- const activePreviewItemKey = (previewActivation === null || previewActivation === void 0 ? void 0 : previewActivation.menuModel) === menuModel ? previewActivation.itemKey : undefined;
100
- const selectableRowIndexes = useMemo(() => rows.flatMap((registration, rowIndex) => registration.type === 'menu-item' ? [rowIndex] : []), [rows]);
101
- const selectableRowKeys = selectableRowIndexes.map(index => {
102
- var _rows$index;
103
- return (_rows$index = rows[index]) === null || _rows$index === void 0 ? void 0 : _rows$index.key;
104
- }).join(',');
105
- const selectableItemCount = selectableRowIndexes.length + (menuModel.footer ? 1 : 0);
106
- useLayoutEffect(() => {
107
- const initialItemIndex = selectableItemCount > 0 ? 0 : -1;
108
- selectedItemIndexRef.current = initialItemIndex;
109
- setSelectedItemIndex(initialItemIndex);
110
- }, [query, selectableItemCount, selectableRowKeys]);
111
- useLayoutEffect(() => {
112
- setPreviewActivation(undefined);
113
- }, [menuModel, query]);
114
- const selectActiveItem = useCallback(_mode => {
115
- const rowIndex = selectableRowIndexes[selectedItemIndex];
116
- const selectedId = rowIndex !== undefined ? getTypeAheadItemId(listId, rowIndex) : menuModel.footer && selectedItemIndex === selectableRowIndexes.length ? getTypeAheadGlobalViewMoreId(listId) : undefined;
117
- if (selectedId) {
118
- var _menuRef$current, _menuRef$current$owne;
119
- (_menuRef$current = menuRef.current) === null || _menuRef$current === void 0 ? void 0 : (_menuRef$current$owne = _menuRef$current.ownerDocument.getElementById(selectedId)) === null || _menuRef$current$owne === void 0 ? void 0 : _menuRef$current$owne.click();
120
- }
121
- }, [listId, menuModel.footer, selectableRowIndexes, selectedItemIndex]);
122
- const setKeyboardPreview = useCallback(itemIndex => {
123
- const rowIndex = selectableRowIndexes[itemIndex];
124
- const registration = rowIndex === undefined ? undefined : rows[rowIndex];
125
- setPreviewActivation((registration === null || registration === void 0 ? void 0 : registration.type) === 'menu-item' ? {
126
- itemKey: registration.key,
127
- menuModel,
128
- source: 'keyboard'
129
- } : undefined);
130
- }, [menuModel, rows, selectableRowIndexes]);
131
- const selectNextItem = useCallback(() => {
132
- const currentIndex = selectedItemIndexRef.current;
133
- const nextIndex = selectableItemCount === 0 ? -1 : currentIndex < 0 || currentIndex === selectableItemCount - 1 ? 0 : currentIndex + 1;
134
- selectedItemIndexRef.current = nextIndex;
135
- setSelectedItemIndex(nextIndex);
136
- setKeyboardPreview(nextIndex);
137
- }, [selectableItemCount, setKeyboardPreview]);
138
- const selectPreviousItem = useCallback(() => {
139
- const currentIndex = selectedItemIndexRef.current;
140
- const previousIndex = selectableItemCount === 0 ? -1 : currentIndex <= 0 ? selectableItemCount - 1 : currentIndex - 1;
141
- selectedItemIndexRef.current = previousIndex;
142
- setSelectedItemIndex(previousIndex);
143
- setKeyboardPreview(previousIndex);
144
- }, [selectableItemCount, setKeyboardPreview]);
145
- const onItemHover = useCallback((itemIndex, itemKey) => {
146
- selectedItemIndexRef.current = itemIndex;
147
- setSelectedItemIndex(itemIndex);
148
- setPreviewActivation(current => {
149
- 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') {
150
- return current;
151
- }
152
- return itemKey ? {
153
- itemKey,
154
- menuModel,
155
- source: 'pointer'
156
- } : undefined;
157
- });
158
- }, [menuModel]);
159
- const onItemLeave = useCallback(itemKey => {
160
- setPreviewActivation(current => (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current);
161
- }, []);
162
- const onItemVisibilityChange = useCallback((itemKey, isVisible) => {
163
- if (!isVisible) {
164
- setPreviewActivation(current => (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current);
165
- }
166
- }, []);
167
- const typeAheadContextValue = useMemo(() => ({
168
- activePreviewItemKey,
169
- api,
84
+ queueMicrotask(() => performTypeAheadSelection(editorView)({
85
+ handler: triggerHandler,
86
+ query,
87
+ selectItem
88
+ }));
89
+ }, [editorView, onClose, query, triggerHandler]);
90
+ const registeredMenu = useMemo(() => ({
91
+ components,
92
+ onClose,
93
+ maxHeight,
94
+ registerInteraction,
170
95
  editorView,
171
- inputMethod: surface.inputMethod,
172
- menuOpenId: typeAheadSurfaceContext.menuOpenId,
173
- onClose: closeMenu,
174
- popupsMountPoint,
96
+ getItemRank: triggerHandler.getRegisteredItemRank,
97
+ isOffline,
98
+ menuOpenId,
99
+ portalMountPoint: popupsMountPoint,
100
+ rootComponent,
175
101
  query,
176
- surfaceContext,
177
- triggerHandler
178
- }), [activePreviewItemKey, api, editorView, closeMenu, popupsMountPoint, query, surface.inputMethod, surfaceContext, triggerHandler, typeAheadSurfaceContext]);
179
- const noOp = useCallback(() => {}, []);
180
- const SurfaceProvider = surface.Provider;
181
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(InputQuery, {
182
- activeDescendantId: selectableRowIndexes[selectedItemIndex] !== undefined ? getTypeAheadItemId(listId, selectableRowIndexes[selectedItemIndex]) : menuModel.footer && selectedItemIndex === selectableRowIndexes.length ? getTypeAheadGlobalViewMoreId(listId) : undefined,
183
- cancel: cancel,
102
+ select,
103
+ surfaceContext
104
+ }), [onClose, maxHeight, registerInteraction, components, editorView, triggerHandler.getRegisteredItemRank, isOffline, menuOpenId, popupsMountPoint, rootComponent, query, select, surfaceContext]);
105
+ return /*#__PURE__*/React.createElement(RegisteredMenuContext.Provider, {
106
+ value: registeredMenu
107
+ }, /*#__PURE__*/React.createElement(InputQuery, {
108
+ menuInteraction: menuInteraction,
109
+ cancel: cancelMenu,
184
110
  editorView: editorView,
185
- forceFocus: forceFocus,
186
- listId: listId,
187
- onItemSelect: selectActiveItem,
188
- onQueryChange: setQuery,
111
+ forceFocus: props.forceFocus,
112
+ onItemSelect: noOp,
113
+ onQueryChange: props.setQuery,
189
114
  onQueryFocus: noOp,
190
- onUndoRedo: onUndoRedo,
191
- optionCount: selectableItemCount,
192
- reopenQuery: reopenQuery,
193
- selectNextItem: selectNextItem,
194
- selectPreviousItem: selectPreviousItem,
115
+ onUndoRedo: props.onUndoRedo,
116
+ optionCount: 0,
117
+ reopenQuery: props.reopenQuery,
118
+ selectNextItem: noOp,
119
+ selectPreviousItem: noOp,
195
120
  shouldKeepOpenOnRegisteredMenu: true,
196
121
  triggerQueryPrefix: triggerHandler.trigger
197
- }), /*#__PURE__*/React.createElement(Popup, {
198
- ariaLabel: null,
199
- boundariesElement: popupsBoundariesElement,
200
- fitHeight: menuHeight,
201
- fitWidth: MENU_WIDTH,
122
+ }), Root && /*#__PURE__*/React.createElement(Popup, {
123
+ zIndex: akEditorFloatingDialogZIndex,
124
+ target: props.anchorElement,
202
125
  mountTo: popupsMountPoint,
126
+ boundariesElement: props.popupsBoundariesElement,
127
+ scrollableElement: props.popupsScrollableElement,
128
+ fitHeight: maxHeight,
129
+ fitWidth: 320,
203
130
  offset: POPUP_OFFSET,
204
- preventOverflow: true,
205
- scrollableElement: popupsScrollableElement,
206
- target: anchorElement,
207
- zIndex: akEditorFloatingDialogZIndex
131
+ ariaLabel: null,
132
+ preventOverflow: true
208
133
  }, /*#__PURE__*/React.createElement("div", {
209
- ref: menuRef,
210
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Parent overlays use this class to restore pointer interaction.
211
- className: ax([styles.menu, "fabric-editor-typeahead"]),
134
+ // Legacy host integrations also use this popup selector.
135
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Preserve the typeahead popup selector.
136
+ className: ax([styles.popup, "fabric-editor-typeahead"]),
212
137
  "data-registered-type-ahead-menu": "",
213
- "data-testid": "registered-type-ahead-menu"
214
- }, /*#__PURE__*/React.createElement(TypeAheadProvider, {
215
- value: typeAheadContextValue
216
- }, /*#__PURE__*/React.createElement(SurfaceProvider, null, /*#__PURE__*/React.createElement(TypeAheadMenuRenderer, {
217
- Item: surface.Item,
218
- listLabel: surface.listLabel,
219
- listId: listId,
220
- maxHeight: Math.max(0, menuHeight),
221
- model: menuModel,
222
- query: query,
223
- hasScrollPadding: true,
224
- onItemHover: onItemHover,
225
- onItemLeave: onItemLeave,
226
- onItemVisibilityChange: onItemVisibilityChange,
227
- selectedItemIndex: selectedItemIndex
228
- }))))));
138
+ "data-testid": "registered-type-ahead-menu",
139
+ hidden: !menuInteraction
140
+ }, menu)));
229
141
  };
@@ -273,20 +273,16 @@ var executeTypeAheadSelection = function executeTypeAheadSelection(view) {
273
273
  };
274
274
  export var performTypeAheadSelection = function performTypeAheadSelection(view) {
275
275
  return function (_ref6) {
276
- var inputMethod = _ref6.inputMethod,
277
- selectionHandler = _ref6.selectionHandler,
278
- handler = _ref6.handler,
279
- query = _ref6.query;
276
+ var handler = _ref6.handler,
277
+ query = _ref6.query,
278
+ _selectItem = _ref6.selectItem;
280
279
  executeTypeAheadSelection(view)({
281
280
  handler: handler,
282
281
  mode: SelectItemMode.SELECTED,
283
282
  query: query,
284
283
  sourceListItem: [],
285
284
  selectItem: function selectItem(_state, insert) {
286
- return selectionHandler({
287
- insert: insert,
288
- source: inputMethod
289
- });
285
+ return _selectItem(insert);
290
286
  }
291
287
  });
292
288
  };
@@ -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(_ref) {
6
5
  var api = _ref.api,
@@ -30,7 +29,7 @@ export function ContentComponent(_ref) {
30
29
  if (items === undefined || sections === undefined || decorationSet === undefined || errorInfo === undefined || decorationElement === undefined || query === undefined || selectedIndex === undefined) {
31
30
  return null;
32
31
  }
33
- if (getTypeAheadSurface(triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.id)) {
32
+ if (triggerHandler !== null && triggerHandler !== void 0 && triggerHandler.registeredMenuKey) {
34
33
  return null;
35
34
  }
36
35
  return /*#__PURE__*/React.createElement(TypeAheadMenu, {
@@ -93,7 +93,7 @@ export var scheduleFocusAfterAttachment = function scheduleFocusAfterAttachment(
93
93
  };
94
94
  };
95
95
  export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
96
- var _ref2;
96
+ var _ref2, _ref3, _menuInteraction$opti, _ref4, _menuInteraction$list, _menuInteraction$expa, _ref7, _menuInteraction$labe;
97
97
  var activeDescendantId = _ref.activeDescendantId,
98
98
  triggerQueryPrefix = _ref.triggerQueryPrefix,
99
99
  cancel = _ref.cancel,
@@ -107,10 +107,14 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
107
107
  onUndoRedo = _ref.onUndoRedo,
108
108
  editorView = _ref.editorView,
109
109
  items = _ref.items,
110
+ inputLabel = _ref.inputLabel,
111
+ menuInteraction = _ref.menuInteraction,
110
112
  listId = _ref.listId,
111
113
  optionCount = _ref.optionCount,
112
114
  shouldKeepOpenOnRegisteredMenu = _ref.shouldKeepOpenOnRegisteredMenu;
113
- var resolvedOptionCount = (_ref2 = optionCount !== null && optionCount !== void 0 ? optionCount : items === null || items === void 0 ? void 0 : items.length) !== null && _ref2 !== void 0 ? _ref2 : 0;
115
+ var resolvedOptionCount = (_ref2 = (_ref3 = (_menuInteraction$opti = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.optionCount) !== null && _menuInteraction$opti !== void 0 ? _menuInteraction$opti : optionCount) !== null && _ref3 !== void 0 ? _ref3 : items === null || items === void 0 ? void 0 : items.length) !== null && _ref2 !== void 0 ? _ref2 : 0;
116
+ var resolvedActiveDescendantId = menuInteraction ? menuInteraction.activeDescendantId : activeDescendantId;
117
+ var resolvedListId = (_ref4 = (_menuInteraction$list = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.listId) !== null && _menuInteraction$list !== void 0 ? _menuInteraction$list : listId) !== null && _ref4 !== void 0 ? _ref4 : TYPE_AHEAD_DECORATION_ELEMENT_ID;
114
118
  var ref = useRef(document.createElement('span'));
115
119
  var inputRef = useRef(null);
116
120
  var _useState = useState(null),
@@ -138,9 +142,9 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
138
142
  var raw = ((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.textContent) || '';
139
143
  var text = cleanedInputContent();
140
144
  var stopDefault = false;
141
- var _ref3 = getPluginState(editorView.state) || {},
142
- selectedIndex = _ref3.selectedIndex,
143
- removePrefixTriggerOnCancel = _ref3.removePrefixTriggerOnCancel;
145
+ var _ref5 = getPluginState(editorView.state) || {},
146
+ selectedIndex = _ref5.selectedIndex,
147
+ removePrefixTriggerOnCancel = _ref5.removePrefixTriggerOnCancel;
144
148
  setInFocus(true);
145
149
  switch (key) {
146
150
  case ' ':
@@ -183,7 +187,7 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
183
187
  // TODO: ED-14758 - Under the W3C specification, any keycode sent under IME would return a keycode 229
184
188
  // 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.
185
189
  // Some suggested the other workaround maybe listen on`keypress` instead of `keydown`
186
- if (!event.isComposing && event.which !== 229 && event.keyCode !== 229) {
190
+ if (!menuInteraction && !event.isComposing && event.which !== 229 && event.keyCode !== 229) {
187
191
  if (selectedIndex === -1) {
188
192
  /**
189
193
  * TODO DTR-1401: (also see ED-17200) There are two options
@@ -202,12 +206,21 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
202
206
  }
203
207
  break;
204
208
  case 'Tab':
209
+ if (menuInteraction) {
210
+ break;
211
+ }
205
212
  event.shiftKey ? selectPreviousItem() : selectNextItem();
206
213
  break;
207
214
  case 'ArrowDown':
215
+ if (menuInteraction) {
216
+ break;
217
+ }
208
218
  selectNextItem();
209
219
  break;
210
220
  case 'ArrowUp':
221
+ if (menuInteraction) {
222
+ break;
223
+ }
211
224
  selectPreviousItem();
212
225
  break;
213
226
  }
@@ -215,24 +228,39 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
215
228
  if (onUndoRedo && undoRedoType && onUndoRedo(undoRedoType)) {
216
229
  stopDefault = true;
217
230
  }
218
- if (isNavigationKey(event) || stopDefault) {
231
+ if (!menuInteraction && isNavigationKey(event) || stopDefault) {
219
232
  event.stopPropagation();
220
233
  event.preventDefault();
221
234
  return false;
222
235
  }
223
- }, [onUndoRedo, onItemSelect, selectNextItem, selectPreviousItem, cancel, cleanedInputContent, editorView.state, isEditorControlsEnabled]);
236
+ }, [onUndoRedo, menuInteraction, onItemSelect, selectNextItem, selectPreviousItem, cancel, cleanedInputContent, editorView.state, isEditorControlsEnabled]);
224
237
  useLayoutEffect(function () {
225
238
  if (!ref.current) {
226
239
  return;
227
240
  }
228
241
  var browser = getBrowserInfo();
229
242
  var element = ref.current;
230
- var _ref4 = getPluginState(editorView.state) || {},
231
- removePrefixTriggerOnCancel = _ref4.removePrefixTriggerOnCancel;
243
+ var _ref6 = getPluginState(editorView.state) || {},
244
+ removePrefixTriggerOnCancel = _ref6.removePrefixTriggerOnCancel;
232
245
  var onFocusIn = function onFocusIn(_event) {
233
246
  onQueryFocus();
234
247
  };
235
248
  var keyDown = function keyDown(event) {
249
+ var isComposing = event.isComposing || event.which === 229 || event.keyCode === 229;
250
+ if (menuInteraction && isComposing) {
251
+ return;
252
+ }
253
+ if (menuInteraction && event.key === 'Tab') {
254
+ event.shiftKey ? menuInteraction.selectPrevious() : menuInteraction.selectNext();
255
+ event.stopPropagation();
256
+ event.preventDefault();
257
+ return;
258
+ }
259
+ if (menuInteraction !== null && menuInteraction !== void 0 && menuInteraction.onKeyDown(event)) {
260
+ event.stopPropagation();
261
+ event.preventDefault();
262
+ return;
263
+ }
236
264
  var key = keyNameNormalized(event);
237
265
  if (['ArrowLeft', 'ArrowRight'].includes(key) && document.getSelection && document.getSelection()) {
238
266
  var _ref$current3;
@@ -277,11 +305,9 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
277
305
  var onFocusOut = function onFocusOut(event) {
278
306
  var _window$getSelection;
279
307
  var relatedTarget = event.relatedTarget;
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(".".concat(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
+ var isInsideMenu = menuInteraction ? relatedTarget instanceof Node && menuInteraction.containsTarget(relatedTarget) : relatedTarget instanceof HTMLElement && (!!relatedTarget.closest(".".concat(TYPE_AHEAD_POPUP_CONTENT_CLASS)) || shouldKeepOpenOnRegisteredMenu && !!relatedTarget.closest('[data-registered-type-ahead-menu]'));
310
+ if (isInsideMenu) {
285
311
  return;
286
312
  }
287
313
 
@@ -400,7 +426,7 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
400
426
  element.removeEventListener('input', onInput);
401
427
  }
402
428
  };
403
- }, [triggerQueryPrefix, cleanedInputContent, onQueryFocus, cancel, checkKeyEvent, editorView.state, isEditorControlsEnabled, shouldKeepOpenOnRegisteredMenu]);
429
+ }, [triggerQueryPrefix, cleanedInputContent, onQueryFocus, cancel, checkKeyEvent, editorView.state, isEditorControlsEnabled, shouldKeepOpenOnRegisteredMenu, menuInteraction]);
404
430
  useLayoutEffect(function () {
405
431
  var hasReopenQuery = typeof reopenQuery === 'string' && reopenQuery.trim().length > 0;
406
432
  if (ref.current && forceFocus) {
@@ -435,18 +461,20 @@ export var InputQuery = /*#__PURE__*/React.memo(function (_ref) {
435
461
  onKeyUp: onKeyUp,
436
462
  tabIndex: -1,
437
463
  role: "combobox",
438
- "aria-activedescendant": activeDescendantId,
439
- "aria-controls": listId !== null && listId !== void 0 ? listId : TYPE_AHEAD_DECORATION_ELEMENT_ID,
464
+ "aria-activedescendant": resolvedActiveDescendantId,
465
+ "aria-controls": resolvedListId,
440
466
  "aria-autocomplete": "list",
441
- "aria-expanded": resolvedOptionCount !== 0,
442
- "aria-labelledby": assistiveHintID,
467
+ "aria-expanded": (_menuInteraction$expa = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.expanded) !== null && _menuInteraction$expa !== void 0 ? _menuInteraction$expa : resolvedOptionCount !== 0,
468
+ "aria-haspopup": menuInteraction ? 'listbox' : undefined,
469
+ "aria-label": menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.label,
470
+ "aria-labelledby": menuInteraction ? undefined : assistiveHintID,
443
471
  suppressContentEditableWarning: true,
444
472
  "data-query-prefix": triggerQueryPrefix,
445
473
  "data-place-holder": intl.formatMessage(typeAheadListMessages.quickInsertInputPlaceholderLabel)
446
474
  }, query === null ? jsx("input", {
447
475
  ref: inputRef,
448
476
  type: "text",
449
- "aria-label": intl.formatMessage(getAriaLabel(triggerQueryPrefix, intl))
477
+ "aria-label": (_ref7 = (_menuInteraction$labe = menuInteraction === null || menuInteraction === void 0 ? void 0 : menuInteraction.label) !== null && _menuInteraction$labe !== void 0 ? _menuInteraction$labe : inputLabel) !== null && _ref7 !== void 0 ? _ref7 : intl.formatMessage(getAriaLabel(triggerQueryPrefix, intl))
450
478
  }) : query), jsx("span", {
451
479
  id: assistiveHintID,
452
480
  style: {
@@ -15,7 +15,6 @@ import { useLoadItems } from './hooks/use-load-items';
15
15
  import { useOnForceSelect } from './hooks/use-on-force-select';
16
16
  import { InputQuery } from './InputQuery';
17
17
  import { RegisteredTypeAheadMenu } from './registered-menu/RegisteredTypeAheadMenu';
18
- import { getTypeAheadSurface } from './registered-menu/typeAheadSurfaces';
19
18
  export var WrapperTypeAhead = /*#__PURE__*/React.memo(function (_ref) {
20
19
  var triggerHandler = _ref.triggerHandler,
21
20
  editorView = _ref.editorView,
@@ -46,8 +45,8 @@ export var WrapperTypeAhead = /*#__PURE__*/React.memo(function (_ref) {
46
45
  setQuery = _useState4[1];
47
46
  var queryRef = useRef(query);
48
47
  var editorViewRef = useRef(editorView);
49
- var registeredSurface = getTypeAheadSurface(triggerHandler.id);
50
- var items = useLoadItems(triggerHandler, editorView, query, showMoreOptionsButton, api, intl, !registeredSurface);
48
+ var registeredMenuKey = triggerHandler.registeredMenuKey;
49
+ var items = useLoadItems(triggerHandler, editorView, query, showMoreOptionsButton, api, intl, !registeredMenuKey);
51
50
  useEffect(function () {
52
51
  if (!closed && fg('platform_editor_ease_of_use_metrics')) {
53
52
  var _api$metrics;
@@ -154,7 +153,7 @@ export var WrapperTypeAhead = /*#__PURE__*/React.memo(function (_ref) {
154
153
  if (!triggerHandler) {
155
154
  return null;
156
155
  }
157
- if (registeredSurface) {
156
+ if (registeredMenuKey) {
158
157
  return /*#__PURE__*/React.createElement(RegisteredTypeAheadMenu, {
159
158
  anchorElement: anchorElement,
160
159
  api: api,
@@ -169,7 +168,7 @@ export var WrapperTypeAhead = /*#__PURE__*/React.memo(function (_ref) {
169
168
  query: query,
170
169
  reopenQuery: reopenQuery,
171
170
  setQuery: setQuery,
172
- surface: registeredSurface,
171
+ registeredMenuKey: registeredMenuKey,
173
172
  triggerHandler: triggerHandler
174
173
  });
175
174
  }