@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.
- package/CHANGELOG.md +15 -0
- package/dist/cjs/pm-plugins/commands/insert-type-ahead-item.js +4 -8
- package/dist/cjs/ui/ContentComponent.js +1 -2
- package/dist/cjs/ui/InputQuery.js +49 -21
- package/dist/cjs/ui/WrapperTypeAhead.js +4 -5
- package/dist/cjs/ui/registered-menu/RegisteredTypeAheadMenu.js +128 -227
- package/dist/es2019/pm-plugins/commands/insert-type-ahead-item.js +3 -7
- package/dist/es2019/ui/ContentComponent.js +1 -2
- package/dist/es2019/ui/InputQuery.js +44 -16
- package/dist/es2019/ui/WrapperTypeAhead.js +4 -5
- package/dist/es2019/ui/registered-menu/RegisteredTypeAheadMenu.js +112 -200
- package/dist/esm/pm-plugins/commands/insert-type-ahead-item.js +4 -8
- package/dist/esm/ui/ContentComponent.js +1 -2
- package/dist/esm/ui/InputQuery.js +49 -21
- package/dist/esm/ui/WrapperTypeAhead.js +4 -5
- package/dist/esm/ui/registered-menu/RegisteredTypeAheadMenu.js +129 -228
- package/dist/types/pm-plugins/commands/insert-type-ahead-item.d.ts +4 -4
- package/dist/types/ui/InputQuery.d.ts +4 -1
- package/dist/types/ui/registered-menu/RegisteredTypeAheadMenu.d.ts +2 -3
- package/package.json +11 -11
- package/dist/cjs/ui/registered-menu/PassThrough.js +0 -10
- package/dist/cjs/ui/registered-menu/TypeAheadContext.js +0 -8
- package/dist/cjs/ui/registered-menu/TypeAheadItemRow.js +0 -48
- package/dist/cjs/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
- package/dist/cjs/ui/registered-menu/TypeAheadMenuFooter.js +0 -33
- package/dist/cjs/ui/registered-menu/TypeAheadMenuRenderer.js +0 -167
- package/dist/cjs/ui/registered-menu/TypeAheadProvider.js +0 -8
- package/dist/cjs/ui/registered-menu/TypeAheadSectionRow.js +0 -15
- package/dist/cjs/ui/registered-menu/buildTypeAheadMenuModel.js +0 -5
- package/dist/cjs/ui/registered-menu/createTypeAheadRowRenderer.js +0 -76
- package/dist/cjs/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -9
- package/dist/cjs/ui/registered-menu/getTypeAheadItemId.js +0 -9
- package/dist/cjs/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -40
- package/dist/cjs/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -66
- package/dist/cjs/ui/registered-menu/typeAheadMenuTypes.js +0 -5
- package/dist/cjs/ui/registered-menu/typeAheadSurfaces.js +0 -27
- package/dist/cjs/ui/registered-menu/useTypeAheadContext.js +0 -15
- package/dist/es2019/ui/registered-menu/PassThrough.js +0 -3
- package/dist/es2019/ui/registered-menu/TypeAheadContext.js +0 -2
- package/dist/es2019/ui/registered-menu/TypeAheadItemRow.js +0 -35
- package/dist/es2019/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
- package/dist/es2019/ui/registered-menu/TypeAheadMenuFooter.js +0 -24
- package/dist/es2019/ui/registered-menu/TypeAheadMenuRenderer.js +0 -134
- package/dist/es2019/ui/registered-menu/TypeAheadProvider.js +0 -2
- package/dist/es2019/ui/registered-menu/TypeAheadSectionRow.js +0 -9
- package/dist/es2019/ui/registered-menu/buildTypeAheadMenuModel.js +0 -1
- package/dist/es2019/ui/registered-menu/createTypeAheadRowRenderer.js +0 -67
- package/dist/es2019/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -1
- package/dist/es2019/ui/registered-menu/getTypeAheadItemId.js +0 -1
- package/dist/es2019/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -31
- package/dist/es2019/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -58
- package/dist/es2019/ui/registered-menu/typeAheadMenuTypes.js +0 -1
- package/dist/es2019/ui/registered-menu/typeAheadSurfaces.js +0 -21
- package/dist/es2019/ui/registered-menu/useTypeAheadContext.js +0 -9
- package/dist/esm/ui/registered-menu/PassThrough.js +0 -4
- package/dist/esm/ui/registered-menu/TypeAheadContext.js +0 -2
- package/dist/esm/ui/registered-menu/TypeAheadItemRow.js +0 -40
- package/dist/esm/ui/registered-menu/TypeAheadMenuFooter.compiled.css +0 -3
- package/dist/esm/ui/registered-menu/TypeAheadMenuFooter.js +0 -26
- package/dist/esm/ui/registered-menu/TypeAheadMenuRenderer.js +0 -158
- package/dist/esm/ui/registered-menu/TypeAheadProvider.js +0 -2
- package/dist/esm/ui/registered-menu/TypeAheadSectionRow.js +0 -8
- package/dist/esm/ui/registered-menu/buildTypeAheadMenuModel.js +0 -1
- package/dist/esm/ui/registered-menu/createTypeAheadRowRenderer.js +0 -69
- package/dist/esm/ui/registered-menu/getTypeAheadGlobalViewMoreId.js +0 -3
- package/dist/esm/ui/registered-menu/getTypeAheadItemId.js +0 -3
- package/dist/esm/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.js +0 -32
- package/dist/esm/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.js +0 -58
- package/dist/esm/ui/registered-menu/typeAheadMenuTypes.js +0 -1
- package/dist/esm/ui/registered-menu/typeAheadSurfaces.js +0 -21
- package/dist/esm/ui/registered-menu/useTypeAheadContext.js +0 -9
- package/dist/types/ui/registered-menu/PassThrough.d.ts +0 -2
- package/dist/types/ui/registered-menu/TypeAheadContext.d.ts +0 -20
- package/dist/types/ui/registered-menu/TypeAheadItemRow.d.ts +0 -15
- package/dist/types/ui/registered-menu/TypeAheadMenuFooter.d.ts +0 -11
- package/dist/types/ui/registered-menu/TypeAheadMenuRenderer.d.ts +0 -19
- package/dist/types/ui/registered-menu/TypeAheadProvider.d.ts +0 -3
- package/dist/types/ui/registered-menu/TypeAheadSectionRow.d.ts +0 -5
- package/dist/types/ui/registered-menu/buildTypeAheadMenuModel.d.ts +0 -3
- package/dist/types/ui/registered-menu/createTypeAheadRowRenderer.d.ts +0 -17
- package/dist/types/ui/registered-menu/getTypeAheadGlobalViewMoreId.d.ts +0 -1
- package/dist/types/ui/registered-menu/getTypeAheadItemId.d.ts +0 -1
- package/dist/types/ui/registered-menu/quick-insert/TypeAheadQuickInsertItem.d.ts +0 -3
- package/dist/types/ui/registered-menu/quick-insert/TypeAheadQuickInsertProvider.d.ts +0 -2
- package/dist/types/ui/registered-menu/typeAheadMenuTypes.d.ts +0 -8
- package/dist/types/ui/registered-menu/typeAheadSurfaces.d.ts +0 -17
- 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,
|
|
5
|
-
import {
|
|
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 {
|
|
8
|
-
import { useMenuPopupSizing } from '@atlaskit/editor-common/
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
menuOpenId
|
|
61
|
-
|
|
62
|
-
|
|
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(
|
|
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,
|
|
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
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
popupsMountPoint,
|
|
96
|
+
getItemRank: triggerHandler.getRegisteredItemRank,
|
|
97
|
+
isOffline,
|
|
98
|
+
menuOpenId,
|
|
99
|
+
portalMountPoint: popupsMountPoint,
|
|
100
|
+
rootComponent,
|
|
175
101
|
query,
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}), [
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
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
|
-
|
|
187
|
-
|
|
188
|
-
onQueryChange: setQuery,
|
|
111
|
+
forceFocus: props.forceFocus,
|
|
112
|
+
onItemSelect: noOp,
|
|
113
|
+
onQueryChange: props.setQuery,
|
|
189
114
|
onQueryFocus: noOp,
|
|
190
|
-
onUndoRedo: onUndoRedo,
|
|
191
|
-
optionCount:
|
|
192
|
-
reopenQuery: reopenQuery,
|
|
193
|
-
selectNextItem:
|
|
194
|
-
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
|
-
|
|
199
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
target: anchorElement,
|
|
207
|
-
zIndex: akEditorFloatingDialogZIndex
|
|
131
|
+
ariaLabel: null,
|
|
132
|
+
preventOverflow: true
|
|
208
133
|
}, /*#__PURE__*/React.createElement("div", {
|
|
209
|
-
|
|
210
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop --
|
|
211
|
-
className: ax([styles.
|
|
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
|
-
|
|
215
|
-
|
|
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
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
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 (
|
|
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 &&
|
|
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
|
|
142
|
-
selectedIndex =
|
|
143
|
-
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
|
|
231
|
-
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
|
-
|
|
282
|
-
|
|
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":
|
|
439
|
-
"aria-controls":
|
|
464
|
+
"aria-activedescendant": resolvedActiveDescendantId,
|
|
465
|
+
"aria-controls": resolvedListId,
|
|
440
466
|
"aria-autocomplete": "list",
|
|
441
|
-
"aria-expanded": resolvedOptionCount !== 0,
|
|
442
|
-
"aria-
|
|
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
|
|
50
|
-
var items = useLoadItems(triggerHandler, editorView, query, showMoreOptionsButton, api, intl, !
|
|
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 (
|
|
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
|
-
|
|
171
|
+
registeredMenuKey: registeredMenuKey,
|
|
173
172
|
triggerHandler: triggerHandler
|
|
174
173
|
});
|
|
175
174
|
}
|