@atlaskit/editor-plugin-type-ahead 0.6.0 → 0.7.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/.eslintrc.js +5 -0
- package/CHANGELOG.md +12 -0
- package/dist/cjs/api.js +215 -0
- package/dist/cjs/commands/insert-type-ahead-item.js +205 -0
- package/dist/cjs/commands/update-list-items.js +23 -0
- package/dist/cjs/commands/update-query.js +27 -0
- package/dist/cjs/commands/update-selected-index.js +27 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/insert-utils.js +107 -0
- package/dist/cjs/messages.js +79 -0
- package/dist/cjs/plugin.js +382 -0
- package/dist/cjs/pm-plugins/actions.js +16 -0
- package/dist/cjs/pm-plugins/decorations.js +148 -0
- package/dist/cjs/pm-plugins/input-rules.js +36 -0
- package/dist/cjs/pm-plugins/insert-item-plugin.js +22 -0
- package/dist/cjs/pm-plugins/key.js +8 -0
- package/dist/cjs/pm-plugins/main.js +110 -0
- package/dist/cjs/pm-plugins/reducer.js +158 -0
- package/dist/cjs/pm-plugins/utils.js +18 -0
- package/dist/cjs/stats-modifier.js +42 -0
- package/dist/cjs/transforms/close-type-ahead.js +13 -0
- package/dist/cjs/transforms/open-typeahead-at-cursor.js +75 -0
- package/dist/cjs/transforms/set-selection-before-query.js +18 -0
- package/dist/cjs/ui/AssistiveText.js +120 -0
- package/dist/cjs/ui/InputQuery.js +400 -0
- package/dist/cjs/ui/TypeAheadList.js +285 -0
- package/dist/cjs/ui/TypeAheadListItem.js +175 -0
- package/dist/cjs/ui/TypeAheadPopup.js +230 -0
- package/dist/cjs/ui/WrapperTypeAhead.js +127 -0
- package/dist/cjs/ui/hooks/use-item-insert.js +109 -0
- package/dist/cjs/ui/hooks/use-load-items.js +50 -0
- package/dist/cjs/ui/hooks/use-on-force-select.js +41 -0
- package/dist/cjs/utils.js +130 -0
- package/dist/es2019/api.js +205 -0
- package/dist/es2019/commands/insert-type-ahead-item.js +204 -0
- package/dist/es2019/commands/update-list-items.js +17 -0
- package/dist/es2019/commands/update-query.js +21 -0
- package/dist/es2019/commands/update-selected-index.js +21 -0
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/insert-utils.js +106 -0
- package/dist/es2019/messages.js +73 -0
- package/dist/es2019/plugin.js +381 -0
- package/dist/es2019/pm-plugins/actions.js +10 -0
- package/dist/es2019/pm-plugins/decorations.js +148 -0
- package/dist/es2019/pm-plugins/input-rules.js +29 -0
- package/dist/es2019/pm-plugins/insert-item-plugin.js +16 -0
- package/dist/es2019/pm-plugins/key.js +2 -0
- package/dist/es2019/pm-plugins/main.js +106 -0
- package/dist/es2019/pm-plugins/reducer.js +160 -0
- package/dist/es2019/pm-plugins/utils.js +12 -0
- package/dist/es2019/stats-modifier.js +33 -0
- package/dist/es2019/transforms/close-type-ahead.js +7 -0
- package/dist/es2019/transforms/open-typeahead-at-cursor.js +71 -0
- package/dist/es2019/transforms/set-selection-before-query.js +10 -0
- package/dist/es2019/ui/AssistiveText.js +88 -0
- package/dist/es2019/ui/InputQuery.js +392 -0
- package/dist/es2019/ui/TypeAheadList.js +273 -0
- package/dist/es2019/ui/TypeAheadListItem.js +212 -0
- package/dist/es2019/ui/TypeAheadPopup.js +233 -0
- package/dist/es2019/ui/WrapperTypeAhead.js +109 -0
- package/dist/es2019/ui/hooks/use-item-insert.js +112 -0
- package/dist/es2019/ui/hooks/use-load-items.js +41 -0
- package/dist/es2019/ui/hooks/use-on-force-select.js +38 -0
- package/dist/es2019/utils.js +126 -0
- package/dist/esm/api.js +209 -0
- package/dist/esm/commands/insert-type-ahead-item.js +198 -0
- package/dist/esm/commands/update-list-items.js +17 -0
- package/dist/esm/commands/update-query.js +21 -0
- package/dist/esm/commands/update-selected-index.js +21 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/insert-utils.js +101 -0
- package/dist/esm/messages.js +73 -0
- package/dist/esm/plugin.js +374 -0
- package/dist/esm/pm-plugins/actions.js +10 -0
- package/dist/esm/pm-plugins/decorations.js +141 -0
- package/dist/esm/pm-plugins/input-rules.js +29 -0
- package/dist/esm/pm-plugins/insert-item-plugin.js +16 -0
- package/dist/esm/pm-plugins/key.js +2 -0
- package/dist/esm/pm-plugins/main.js +104 -0
- package/dist/esm/pm-plugins/reducer.js +151 -0
- package/dist/esm/pm-plugins/utils.js +12 -0
- package/dist/esm/stats-modifier.js +35 -0
- package/dist/esm/transforms/close-type-ahead.js +7 -0
- package/dist/esm/transforms/open-typeahead-at-cursor.js +69 -0
- package/dist/esm/transforms/set-selection-before-query.js +12 -0
- package/dist/esm/ui/AssistiveText.js +115 -0
- package/dist/esm/ui/InputQuery.js +389 -0
- package/dist/esm/ui/TypeAheadList.js +276 -0
- package/dist/esm/ui/TypeAheadListItem.js +165 -0
- package/dist/esm/ui/TypeAheadPopup.js +220 -0
- package/dist/esm/ui/WrapperTypeAhead.js +117 -0
- package/dist/esm/ui/hooks/use-item-insert.js +103 -0
- package/dist/esm/ui/hooks/use-load-items.js +43 -0
- package/dist/esm/ui/hooks/use-on-force-select.js +35 -0
- package/dist/esm/utils.js +124 -0
- package/dist/types/api.d.ts +60 -0
- package/dist/types/commands/insert-type-ahead-item.d.ts +12 -0
- package/dist/types/commands/update-list-items.d.ts +3 -0
- package/dist/types/commands/update-query.d.ts +2 -0
- package/dist/types/commands/update-selected-index.d.ts +2 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/insert-utils.d.ts +18 -0
- package/dist/types/messages.d.ts +72 -0
- package/dist/types/plugin.d.ts +10 -0
- package/dist/types/pm-plugins/actions.d.ts +9 -0
- package/dist/types/pm-plugins/decorations.d.ts +14 -0
- package/dist/types/pm-plugins/input-rules.d.ts +6 -0
- package/dist/types/pm-plugins/insert-item-plugin.d.ts +2 -0
- package/dist/types/pm-plugins/key.d.ts +3 -0
- package/dist/types/pm-plugins/main.d.ts +14 -0
- package/dist/types/pm-plugins/reducer.d.ts +10 -0
- package/dist/types/pm-plugins/utils.d.ts +4 -0
- package/dist/types/stats-modifier.d.ts +20 -0
- package/dist/types/transforms/close-type-ahead.d.ts +2 -0
- package/dist/types/transforms/open-typeahead-at-cursor.d.ts +11 -0
- package/dist/types/transforms/set-selection-before-query.d.ts +2 -0
- package/dist/types/ui/AssistiveText.d.ts +33 -0
- package/dist/types/ui/InputQuery.d.ts +26 -0
- package/dist/types/ui/TypeAheadList.d.ts +25 -0
- package/dist/types/ui/TypeAheadListItem.d.ts +18 -0
- package/dist/types/ui/TypeAheadPopup.d.ts +29 -0
- package/dist/types/ui/WrapperTypeAhead.d.ts +20 -0
- package/dist/types/ui/hooks/use-item-insert.d.ts +3 -0
- package/dist/types/ui/hooks/use-load-items.d.ts +3 -0
- package/dist/types/ui/hooks/use-on-force-select.d.ts +11 -0
- package/dist/types/utils.d.ts +27 -0
- package/dist/types-ts4.5/api.d.ts +60 -0
- package/dist/types-ts4.5/commands/insert-type-ahead-item.d.ts +12 -0
- package/dist/types-ts4.5/commands/update-list-items.d.ts +3 -0
- package/dist/types-ts4.5/commands/update-query.d.ts +2 -0
- package/dist/types-ts4.5/commands/update-selected-index.d.ts +2 -0
- package/dist/types-ts4.5/index.d.ts +2 -1
- package/dist/types-ts4.5/insert-utils.d.ts +18 -0
- package/dist/types-ts4.5/messages.d.ts +72 -0
- package/dist/types-ts4.5/plugin.d.ts +10 -0
- package/dist/types-ts4.5/pm-plugins/actions.d.ts +9 -0
- package/dist/types-ts4.5/pm-plugins/decorations.d.ts +14 -0
- package/dist/types-ts4.5/pm-plugins/input-rules.d.ts +6 -0
- package/dist/types-ts4.5/pm-plugins/insert-item-plugin.d.ts +2 -0
- package/dist/types-ts4.5/pm-plugins/key.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/main.d.ts +14 -0
- package/dist/types-ts4.5/pm-plugins/reducer.d.ts +10 -0
- package/dist/types-ts4.5/pm-plugins/utils.d.ts +4 -0
- package/dist/types-ts4.5/stats-modifier.d.ts +20 -0
- package/dist/types-ts4.5/transforms/close-type-ahead.d.ts +2 -0
- package/dist/types-ts4.5/transforms/open-typeahead-at-cursor.d.ts +11 -0
- package/dist/types-ts4.5/transforms/set-selection-before-query.d.ts +2 -0
- package/dist/types-ts4.5/ui/AssistiveText.d.ts +33 -0
- package/dist/types-ts4.5/ui/InputQuery.d.ts +26 -0
- package/dist/types-ts4.5/ui/TypeAheadList.d.ts +25 -0
- package/dist/types-ts4.5/ui/TypeAheadListItem.d.ts +18 -0
- package/dist/types-ts4.5/ui/TypeAheadPopup.d.ts +29 -0
- package/dist/types-ts4.5/ui/WrapperTypeAhead.d.ts +20 -0
- package/dist/types-ts4.5/ui/hooks/use-item-insert.d.ts +7 -0
- package/dist/types-ts4.5/ui/hooks/use-load-items.d.ts +3 -0
- package/dist/types-ts4.5/ui/hooks/use-on-force-select.d.ts +11 -0
- package/dist/types-ts4.5/utils.d.ts +27 -0
- package/package.json +21 -25
- package/report.api.md +29 -1
- package/tmp/api-report-tmp.d.ts +26 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.InputQuery = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _react2 = require("@emotion/react");
|
|
12
|
+
var _reactIntlNext = require("react-intl-next");
|
|
13
|
+
var _w3cKeyname = require("w3c-keyname");
|
|
14
|
+
var _typeAhead = require("@atlaskit/editor-common/type-ahead");
|
|
15
|
+
var _utils = require("@atlaskit/editor-common/utils");
|
|
16
|
+
var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
|
|
17
|
+
var _constants = require("../constants");
|
|
18
|
+
var _messages = require("../messages");
|
|
19
|
+
var _utils2 = require("../utils");
|
|
20
|
+
var _AssistiveText = require("./AssistiveText");
|
|
21
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
22
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
23
|
+
/** @jsx jsx */
|
|
24
|
+
|
|
25
|
+
var querySpanStyles = (0, _react2.css)({
|
|
26
|
+
outline: 'none',
|
|
27
|
+
'& input': {
|
|
28
|
+
width: '5px',
|
|
29
|
+
border: 'none',
|
|
30
|
+
background: 'transparent',
|
|
31
|
+
padding: 0,
|
|
32
|
+
margin: 0,
|
|
33
|
+
// ED-17022 Fixes firefox caret position
|
|
34
|
+
fontSize: '1em',
|
|
35
|
+
height: _editorSharedStyles.blockNodesVerticalMargin,
|
|
36
|
+
caretColor: "var(--ds-text-accent-blue, #0052CC)"
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
var isNavigationKey = function isNavigationKey(event) {
|
|
40
|
+
return ['Enter', 'Tab', 'ArrowDown', 'ArrowUp'].includes(event.key);
|
|
41
|
+
};
|
|
42
|
+
var isUndoRedoShortcut = function isUndoRedoShortcut(event) {
|
|
43
|
+
var key = (0, _w3cKeyname.keyName)(event);
|
|
44
|
+
if (event.ctrlKey && key === 'y') {
|
|
45
|
+
return 'historyRedo';
|
|
46
|
+
}
|
|
47
|
+
if ((event.ctrlKey || event.metaKey) && event.shiftKey && key === 'Z') {
|
|
48
|
+
return 'historyRedo';
|
|
49
|
+
}
|
|
50
|
+
if ((event.ctrlKey || event.metaKey) && key === 'z') {
|
|
51
|
+
return 'historyUndo';
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
};
|
|
55
|
+
var getAriaLabel = function getAriaLabel(triggerPrefix, intl) {
|
|
56
|
+
switch (triggerPrefix) {
|
|
57
|
+
case '@':
|
|
58
|
+
return _messages.typeAheadListMessages.mentionInputLabel;
|
|
59
|
+
case '/':
|
|
60
|
+
return _messages.typeAheadListMessages.quickInsertInputLabel;
|
|
61
|
+
case ':':
|
|
62
|
+
return _messages.typeAheadListMessages.emojiInputLabel;
|
|
63
|
+
default:
|
|
64
|
+
return _messages.typeAheadListMessages.quickInsertInputLabel;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var InputQuery = exports.InputQuery = /*#__PURE__*/_react.default.memo(function (_ref) {
|
|
68
|
+
var triggerQueryPrefix = _ref.triggerQueryPrefix,
|
|
69
|
+
cancel = _ref.cancel,
|
|
70
|
+
onQueryChange = _ref.onQueryChange,
|
|
71
|
+
onItemSelect = _ref.onItemSelect,
|
|
72
|
+
selectNextItem = _ref.selectNextItem,
|
|
73
|
+
selectPreviousItem = _ref.selectPreviousItem,
|
|
74
|
+
forceFocus = _ref.forceFocus,
|
|
75
|
+
reopenQuery = _ref.reopenQuery,
|
|
76
|
+
onQueryFocus = _ref.onQueryFocus,
|
|
77
|
+
onUndoRedo = _ref.onUndoRedo,
|
|
78
|
+
editorView = _ref.editorView,
|
|
79
|
+
items = _ref.items;
|
|
80
|
+
var ref = (0, _react.useRef)(document.createElement('span'));
|
|
81
|
+
var inputRef = (0, _react.useRef)(null);
|
|
82
|
+
var _useState = (0, _react.useState)(null),
|
|
83
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
84
|
+
query = _useState2[0],
|
|
85
|
+
setQuery = _useState2[1];
|
|
86
|
+
var cleanedInputContent = (0, _react.useCallback)(function () {
|
|
87
|
+
var _ref$current;
|
|
88
|
+
var raw = ((_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.textContent) || '';
|
|
89
|
+
return raw;
|
|
90
|
+
}, []);
|
|
91
|
+
var onKeyUp = (0, _react.useCallback)(function (event) {
|
|
92
|
+
var text = cleanedInputContent();
|
|
93
|
+
onQueryChange(text);
|
|
94
|
+
}, [onQueryChange, cleanedInputContent]);
|
|
95
|
+
var _useState3 = (0, _react.useState)(false),
|
|
96
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
97
|
+
isInFocus = _useState4[0],
|
|
98
|
+
setInFocus = _useState4[1];
|
|
99
|
+
var checkKeyEvent = (0, _react.useCallback)(function (event) {
|
|
100
|
+
var _ref$current2;
|
|
101
|
+
var key = (0, _w3cKeyname.keyName)(event);
|
|
102
|
+
var sel = document.getSelection();
|
|
103
|
+
var raw = ((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.textContent) || '';
|
|
104
|
+
var text = cleanedInputContent();
|
|
105
|
+
var stopDefault = false;
|
|
106
|
+
var _ref2 = (0, _utils2.getPluginState)(editorView.state) || {},
|
|
107
|
+
selectedIndex = _ref2.selectedIndex;
|
|
108
|
+
setInFocus(true);
|
|
109
|
+
switch (key) {
|
|
110
|
+
case ' ':
|
|
111
|
+
// space key
|
|
112
|
+
if (text.length === 0) {
|
|
113
|
+
cancel({
|
|
114
|
+
forceFocusOnEditor: true,
|
|
115
|
+
text: ' ',
|
|
116
|
+
addPrefixTrigger: true,
|
|
117
|
+
setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED
|
|
118
|
+
});
|
|
119
|
+
stopDefault = true;
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
case 'Escape':
|
|
123
|
+
case 'PageUp':
|
|
124
|
+
case 'PageDown':
|
|
125
|
+
case 'Home':
|
|
126
|
+
cancel({
|
|
127
|
+
text: text,
|
|
128
|
+
forceFocusOnEditor: true,
|
|
129
|
+
addPrefixTrigger: true,
|
|
130
|
+
setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED
|
|
131
|
+
});
|
|
132
|
+
stopDefault = true;
|
|
133
|
+
break;
|
|
134
|
+
case 'Backspace':
|
|
135
|
+
if (raw.length === 0 || (sel === null || sel === void 0 ? void 0 : sel.anchorOffset) === 0) {
|
|
136
|
+
event.stopPropagation();
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
cancel({
|
|
139
|
+
forceFocusOnEditor: true,
|
|
140
|
+
text: text,
|
|
141
|
+
addPrefixTrigger: false,
|
|
142
|
+
setSelectionAt: _constants.CloseSelectionOptions.BEFORE_TEXT_INSERTED
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
case 'Enter':
|
|
147
|
+
// ED-14758 - Under the W3C specification, any keycode sent under IME would return a keycode 229
|
|
148
|
+
// 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.
|
|
149
|
+
// Some suggested the other workaround maybe listen on`keypress` instead of `keydown`
|
|
150
|
+
if (!event.isComposing && event.which !== 229 && event.keyCode !== 229) {
|
|
151
|
+
if (selectedIndex === -1) {
|
|
152
|
+
/**
|
|
153
|
+
* TODO DTR-1401: (also see ED-17200) There are two options
|
|
154
|
+
* here, either
|
|
155
|
+
* - set the index directly to 1 in WrapperTypeAhead.tsx's
|
|
156
|
+
* `insertSelectedItem` at the cost of breaking some of the a11y
|
|
157
|
+
* focus changes,
|
|
158
|
+
* - or do this jank at the cost of some small analytics noise.
|
|
159
|
+
*
|
|
160
|
+
* The focus behaviour still needs cleanup
|
|
161
|
+
*/
|
|
162
|
+
selectPreviousItem();
|
|
163
|
+
selectNextItem();
|
|
164
|
+
}
|
|
165
|
+
onItemSelect(event.shiftKey ? _typeAhead.SelectItemMode.SHIFT_ENTER : _typeAhead.SelectItemMode.ENTER);
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
case 'Tab':
|
|
169
|
+
if (selectedIndex === -1) {
|
|
170
|
+
/**
|
|
171
|
+
* TODO DTR-1401: (also see ED-17200) There are two options
|
|
172
|
+
* here, either
|
|
173
|
+
* - set the index directly to 1 in WrapperTypeAhead.tsx's
|
|
174
|
+
* `insertSelectedItem` at the cost of breaking some of the a11y
|
|
175
|
+
* focus changes,
|
|
176
|
+
* - or do this jank at the cost of some small analytics noise.
|
|
177
|
+
*
|
|
178
|
+
*/
|
|
179
|
+
selectPreviousItem();
|
|
180
|
+
selectNextItem();
|
|
181
|
+
}
|
|
182
|
+
// TODO DTR-1401: why is this calling select item when hitting tab? fix this in DTR-1401
|
|
183
|
+
onItemSelect(_typeAhead.SelectItemMode.TAB);
|
|
184
|
+
break;
|
|
185
|
+
case 'ArrowDown':
|
|
186
|
+
selectNextItem();
|
|
187
|
+
break;
|
|
188
|
+
case 'ArrowUp':
|
|
189
|
+
selectPreviousItem();
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
var undoRedoType = isUndoRedoShortcut(event);
|
|
193
|
+
if (onUndoRedo && undoRedoType && onUndoRedo(undoRedoType)) {
|
|
194
|
+
stopDefault = true;
|
|
195
|
+
}
|
|
196
|
+
if (isNavigationKey(event) || stopDefault) {
|
|
197
|
+
event.stopPropagation();
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}, [onUndoRedo, onItemSelect, selectNextItem, selectPreviousItem, cancel, cleanedInputContent, editorView.state]);
|
|
202
|
+
var onClick = (0, _react.useCallback)(function (event) {
|
|
203
|
+
var _inputRef$current;
|
|
204
|
+
event.stopPropagation();
|
|
205
|
+
event.preventDefault();
|
|
206
|
+
onQueryFocus();
|
|
207
|
+
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();
|
|
208
|
+
return false;
|
|
209
|
+
}, [onQueryFocus]);
|
|
210
|
+
(0, _react.useLayoutEffect)(function () {
|
|
211
|
+
if (!ref.current) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
var element = ref.current;
|
|
215
|
+
var onFocusIn = function onFocusIn(event) {
|
|
216
|
+
onQueryFocus();
|
|
217
|
+
};
|
|
218
|
+
var keyDown = function keyDown(event) {
|
|
219
|
+
var key = (0, _w3cKeyname.keyName)(event);
|
|
220
|
+
if (['ArrowLeft', 'ArrowRight'].includes(key) && document.getSelection && document.getSelection()) {
|
|
221
|
+
var _ref$current3;
|
|
222
|
+
var q = ((_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.textContent) || '';
|
|
223
|
+
var sel = document.getSelection();
|
|
224
|
+
var isMovingRight = sel && 'ArrowRight' === key && sel.anchorOffset === q.length;
|
|
225
|
+
var isMovingLeft = sel && 'ArrowLeft' === key && (sel.anchorOffset === 0 || event.metaKey);
|
|
226
|
+
if (!isMovingRight && !isMovingLeft) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
cancel({
|
|
230
|
+
forceFocusOnEditor: true,
|
|
231
|
+
addPrefixTrigger: true,
|
|
232
|
+
text: cleanedInputContent(),
|
|
233
|
+
setSelectionAt: isMovingRight ? _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED : _constants.CloseSelectionOptions.BEFORE_TEXT_INSERTED
|
|
234
|
+
});
|
|
235
|
+
event.preventDefault();
|
|
236
|
+
event.stopPropagation();
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
checkKeyEvent(event);
|
|
240
|
+
};
|
|
241
|
+
var onFocusOut = function onFocusOut(event) {
|
|
242
|
+
var _window$getSelection;
|
|
243
|
+
var relatedTarget = event.relatedTarget;
|
|
244
|
+
|
|
245
|
+
// Given the user is changing the focus
|
|
246
|
+
// When the target is inside the TypeAhead Popup
|
|
247
|
+
// Then the popup should stay open
|
|
248
|
+
if (relatedTarget instanceof HTMLElement && relatedTarget.closest && relatedTarget.closest(".".concat(_constants.TYPE_AHEAD_POPUP_CONTENT_CLASS))) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// See ED-14909: Chrome may emit focusout events where an input
|
|
253
|
+
// device was not directly responsible. (This rears in react v17+ consumers
|
|
254
|
+
// where react-managed node removal now appears to propagate focusout events to
|
|
255
|
+
// our event listener). As this path is strictly for click or other typeahead
|
|
256
|
+
// dismissals that don't involve typeahead item selection, we carve out an
|
|
257
|
+
// exception for Chrome-specific events where an input device was not the initiator.
|
|
258
|
+
if (_utils.browser.chrome && !(((_window$getSelection = window.getSelection()) === null || _window$getSelection === void 0 ? void 0 : _window$getSelection.type) === 'Range') && !('sourceCapabilities' in event && event.sourceCapabilities)) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
cancel({
|
|
262
|
+
addPrefixTrigger: true,
|
|
263
|
+
text: cleanedInputContent(),
|
|
264
|
+
setSelectionAt: _constants.CloseSelectionOptions.BEFORE_TEXT_INSERTED,
|
|
265
|
+
forceFocusOnEditor: false
|
|
266
|
+
});
|
|
267
|
+
};
|
|
268
|
+
var close = function close() {
|
|
269
|
+
cancel({
|
|
270
|
+
addPrefixTrigger: false,
|
|
271
|
+
text: '',
|
|
272
|
+
forceFocusOnEditor: true,
|
|
273
|
+
setSelectionAt: _constants.CloseSelectionOptions.BEFORE_TEXT_INSERTED
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
var beforeinput = function beforeinput(e) {
|
|
277
|
+
var _target$textContent;
|
|
278
|
+
setInFocus(false);
|
|
279
|
+
var target = e.target;
|
|
280
|
+
if (e.isComposing || !(target instanceof HTMLElement)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (e.inputType === 'historyUndo' && ((_target$textContent = target.textContent) === null || _target$textContent === void 0 ? void 0 : _target$textContent.length) === 0) {
|
|
284
|
+
e.preventDefault();
|
|
285
|
+
e.stopPropagation();
|
|
286
|
+
close();
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (e.data != null && inputRef.current === null) {
|
|
290
|
+
setQuery('');
|
|
291
|
+
|
|
292
|
+
// We need to change the content on Safari
|
|
293
|
+
// and set the cursor at the right place
|
|
294
|
+
if (_utils.browser.safari) {
|
|
295
|
+
e.preventDefault();
|
|
296
|
+
var dataElement = document.createTextNode(e.data);
|
|
297
|
+
element.appendChild(dataElement);
|
|
298
|
+
var sel = window.getSelection();
|
|
299
|
+
var range = document.createRange();
|
|
300
|
+
range.setStart(dataElement, dataElement.length);
|
|
301
|
+
range.collapse(true);
|
|
302
|
+
sel === null || sel === void 0 || sel.removeAllRanges();
|
|
303
|
+
sel === null || sel === void 0 || sel.addRange(range);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
var onInput = null;
|
|
308
|
+
if (_utils.browser.safari) {
|
|
309
|
+
// On Safari, for reasons beyond my understanding,
|
|
310
|
+
// The undo behavior is totally different from other browsers
|
|
311
|
+
// That why we need to have an specific branch only for Safari.
|
|
312
|
+
var _onInput = function _onInput(e) {
|
|
313
|
+
var _target$textContent2;
|
|
314
|
+
var target = e.target;
|
|
315
|
+
if (e.isComposing || !(target instanceof HTMLElement)) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (e.inputType === 'historyUndo' && ((_target$textContent2 = target.textContent) === null || _target$textContent2 === void 0 ? void 0 : _target$textContent2.length) === 1) {
|
|
319
|
+
e.preventDefault();
|
|
320
|
+
e.stopPropagation();
|
|
321
|
+
close();
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
element.addEventListener('input', _onInput);
|
|
326
|
+
}
|
|
327
|
+
element.addEventListener('focusout', onFocusOut);
|
|
328
|
+
element.addEventListener('focusin', onFocusIn);
|
|
329
|
+
element.addEventListener('keydown', keyDown);
|
|
330
|
+
element.addEventListener('beforeinput', beforeinput);
|
|
331
|
+
return function () {
|
|
332
|
+
element.removeEventListener('focusout', onFocusOut);
|
|
333
|
+
element.removeEventListener('focusin', onFocusIn);
|
|
334
|
+
element.removeEventListener('keydown', keyDown);
|
|
335
|
+
element.removeEventListener('beforeinput', beforeinput);
|
|
336
|
+
if (_utils.browser.safari) {
|
|
337
|
+
element.removeEventListener('input', onInput);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}, [triggerQueryPrefix, cleanedInputContent, onQueryFocus, cancel, checkKeyEvent, editorView.state]);
|
|
341
|
+
(0, _react.useLayoutEffect)(function () {
|
|
342
|
+
var hasReopenQuery = typeof reopenQuery === 'string' && reopenQuery.trim().length > 0;
|
|
343
|
+
if (ref.current && forceFocus) {
|
|
344
|
+
setQuery(hasReopenQuery ? reopenQuery : null);
|
|
345
|
+
requestAnimationFrame(function () {
|
|
346
|
+
if (!(ref !== null && ref !== void 0 && ref.current)) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
var sel = window.getSelection();
|
|
350
|
+
if (sel && hasReopenQuery && ref.current.lastChild instanceof Text) {
|
|
351
|
+
var lastChild = ref.current.lastChild;
|
|
352
|
+
var range = document.createRange();
|
|
353
|
+
range.setStart(ref.current.lastChild, lastChild.length);
|
|
354
|
+
range.collapse(true);
|
|
355
|
+
sel.removeAllRanges();
|
|
356
|
+
sel.addRange(range);
|
|
357
|
+
}
|
|
358
|
+
ref.current.focus();
|
|
359
|
+
setInFocus(true);
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}, [forceFocus, reopenQuery]);
|
|
363
|
+
var assistiveHintID = _constants.TYPE_AHEAD_DECORATION_ELEMENT_ID + '__assistiveHint';
|
|
364
|
+
var intl = (0, _reactIntlNext.useIntl)();
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
When we migrated to emotion from styled component, we started getting this error.
|
|
368
|
+
jsx-a11y/interactive-supports-focus
|
|
369
|
+
Task added in https://product-fabric.atlassian.net/wiki/spaces/E/pages/3182068181/Potential+improvements#Moderate-changes.
|
|
370
|
+
*/
|
|
371
|
+
return (0, _react2.jsx)(_react.Fragment, null, triggerQueryPrefix, (0, _react2.jsx)("span", {
|
|
372
|
+
css: querySpanStyles,
|
|
373
|
+
contentEditable: true,
|
|
374
|
+
ref: ref,
|
|
375
|
+
onKeyUp: onKeyUp,
|
|
376
|
+
onClick: onClick,
|
|
377
|
+
role: "combobox",
|
|
378
|
+
"aria-controls": _constants.TYPE_AHEAD_DECORATION_ELEMENT_ID,
|
|
379
|
+
"aria-autocomplete": "list",
|
|
380
|
+
"aria-expanded": items.length !== 0,
|
|
381
|
+
"aria-labelledby": assistiveHintID,
|
|
382
|
+
suppressContentEditableWarning: true,
|
|
383
|
+
"data-query-prefix": triggerQueryPrefix
|
|
384
|
+
}, query === null ? (0, _react2.jsx)("input", {
|
|
385
|
+
ref: inputRef,
|
|
386
|
+
type: "text"
|
|
387
|
+
}) : query), (0, _react2.jsx)("span", {
|
|
388
|
+
id: assistiveHintID,
|
|
389
|
+
style: {
|
|
390
|
+
display: 'none'
|
|
391
|
+
}
|
|
392
|
+
}, intl.formatMessage(getAriaLabel(triggerQueryPrefix, intl)), ",", intl.formatMessage(_messages.typeAheadListMessages.inputQueryAssistiveLabel)), (0, _react2.jsx)(_AssistiveText.AssistiveText, {
|
|
393
|
+
assistiveText: items.length === 0 ? intl.formatMessage(_messages.typeAheadListMessages.noSearchResultsLabel, {
|
|
394
|
+
itemsLength: items.length
|
|
395
|
+
}) : '',
|
|
396
|
+
isInFocus: items.length === 0 || isInFocus,
|
|
397
|
+
id: _constants.TYPE_AHEAD_DECORATION_ELEMENT_ID
|
|
398
|
+
}));
|
|
399
|
+
});
|
|
400
|
+
InputQuery.displayName = 'InputQuery';
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.TypeAheadList = void 0;
|
|
9
|
+
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _react2 = require("@emotion/react");
|
|
13
|
+
var _reactIntlNext = require("react-intl-next");
|
|
14
|
+
var _CellMeasurer = require("react-virtualized/dist/commonjs/CellMeasurer");
|
|
15
|
+
var _List = require("react-virtualized/dist/commonjs/List");
|
|
16
|
+
var _typeAhead = require("@atlaskit/editor-common/type-ahead");
|
|
17
|
+
var _menu = require("@atlaskit/menu");
|
|
18
|
+
var _updateSelectedIndex = require("../commands/update-selected-index");
|
|
19
|
+
var _constants = require("../constants");
|
|
20
|
+
var _messages = require("../messages");
|
|
21
|
+
var _utils = require("../utils");
|
|
22
|
+
var _AssistiveText = require("./AssistiveText");
|
|
23
|
+
var _TypeAheadListItem = require("./TypeAheadListItem");
|
|
24
|
+
var _templateObject;
|
|
25
|
+
/** @jsx jsx */
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
28
|
+
var LIST_ITEM_ESTIMATED_HEIGHT = _TypeAheadListItem.ICON_HEIGHT + _TypeAheadListItem.ITEM_PADDING * 2;
|
|
29
|
+
var LIST_WIDTH = 320;
|
|
30
|
+
var TypeaheadAssistiveTextPureComponent = /*#__PURE__*/_react.default.memo(function (_ref) {
|
|
31
|
+
var numberOfResults = _ref.numberOfResults;
|
|
32
|
+
var intl = (0, _reactIntlNext.useIntl)();
|
|
33
|
+
return (0, _react2.jsx)(_AssistiveText.AssistiveText, {
|
|
34
|
+
assistiveText: intl.formatMessage(_messages.typeAheadListMessages.searchResultsLabel, {
|
|
35
|
+
itemsLength: numberOfResults
|
|
36
|
+
})
|
|
37
|
+
// when the popup is open its always in focus
|
|
38
|
+
,
|
|
39
|
+
isInFocus: true,
|
|
40
|
+
id: _constants.TYPE_AHEAD_DECORATION_ELEMENT_ID + '__popup'
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
var TypeAheadListComponent = /*#__PURE__*/_react.default.memo(function (_ref2) {
|
|
44
|
+
var _decorationElement$qu2;
|
|
45
|
+
var items = _ref2.items,
|
|
46
|
+
selectedIndex = _ref2.selectedIndex,
|
|
47
|
+
editorView = _ref2.editorView,
|
|
48
|
+
onItemClick = _ref2.onItemClick,
|
|
49
|
+
intl = _ref2.intl,
|
|
50
|
+
fitHeight = _ref2.fitHeight,
|
|
51
|
+
decorationElement = _ref2.decorationElement,
|
|
52
|
+
triggerHandler = _ref2.triggerHandler;
|
|
53
|
+
var listRef = (0, _react.useRef)();
|
|
54
|
+
var listContainerRef = (0, _react.useRef)(null);
|
|
55
|
+
var lastVisibleIndexes = (0, _react.useRef)({
|
|
56
|
+
overscanStartIndex: 0,
|
|
57
|
+
overscanStopIndex: 0,
|
|
58
|
+
startIndex: 0,
|
|
59
|
+
stopIndex: 0
|
|
60
|
+
});
|
|
61
|
+
var estimatedHeight = items.length * LIST_ITEM_ESTIMATED_HEIGHT;
|
|
62
|
+
var _useState = (0, _react.useState)(Math.min(estimatedHeight, fitHeight)),
|
|
63
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
64
|
+
height = _useState2[0],
|
|
65
|
+
setHeight = _useState2[1];
|
|
66
|
+
var _useState3 = (0, _react.useState)(new _CellMeasurer.CellMeasurerCache({
|
|
67
|
+
fixedWidth: true,
|
|
68
|
+
defaultHeight: LIST_ITEM_ESTIMATED_HEIGHT
|
|
69
|
+
})),
|
|
70
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
71
|
+
cache = _useState4[0],
|
|
72
|
+
setCache = _useState4[1];
|
|
73
|
+
var onItemsRendered = (0, _react.useCallback)(function (props) {
|
|
74
|
+
lastVisibleIndexes.current = props;
|
|
75
|
+
}, []);
|
|
76
|
+
var actions = (0, _react.useMemo)(function () {
|
|
77
|
+
return {
|
|
78
|
+
onItemClick: onItemClick
|
|
79
|
+
};
|
|
80
|
+
}, [onItemClick]);
|
|
81
|
+
var isNavigationKey = function isNavigationKey(event) {
|
|
82
|
+
return ['ArrowDown', 'ArrowUp', 'Tab', 'Enter'].includes(event.key);
|
|
83
|
+
};
|
|
84
|
+
var focusTargetElement = (0, _react.useCallback)(function () {
|
|
85
|
+
var _decorationElement$qu;
|
|
86
|
+
//To reset the selected index
|
|
87
|
+
(0, _updateSelectedIndex.updateSelectedIndex)(-1)(editorView.state, editorView.dispatch);
|
|
88
|
+
listRef.current.scrollToRow(0);
|
|
89
|
+
decorationElement === null || decorationElement === void 0 || (_decorationElement$qu = decorationElement.querySelector("[role='combobox']")) === null || _decorationElement$qu === void 0 || _decorationElement$qu.focus();
|
|
90
|
+
}, [editorView, listRef, decorationElement]);
|
|
91
|
+
var selectNextItem = (0, _react.useMemo)(function () {
|
|
92
|
+
return (0, _utils.moveSelectedIndex)({
|
|
93
|
+
editorView: editorView,
|
|
94
|
+
direction: 'next'
|
|
95
|
+
});
|
|
96
|
+
}, [editorView]);
|
|
97
|
+
var selectPreviousItem = (0, _react.useMemo)(function () {
|
|
98
|
+
return (0, _utils.moveSelectedIndex)({
|
|
99
|
+
editorView: editorView,
|
|
100
|
+
direction: 'previous'
|
|
101
|
+
});
|
|
102
|
+
}, [editorView]);
|
|
103
|
+
var lastVisibleStartIndex = lastVisibleIndexes.current.startIndex;
|
|
104
|
+
var lastVisibleStopIndex = lastVisibleIndexes.current.stopIndex;
|
|
105
|
+
var onScroll = (0, _react.useCallback)(function (_ref3) {
|
|
106
|
+
var scrollUpdateWasRequested = _ref3.scrollUpdateWasRequested;
|
|
107
|
+
if (!scrollUpdateWasRequested) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// In case the user scroll to a non-visible item like press ArrowUp from the first index
|
|
112
|
+
// We will force the scroll calling the scrollToItem in the useEffect hook
|
|
113
|
+
// When the scroll happens and we render the elements,
|
|
114
|
+
// we still need calculate the items height and re-draw the List.
|
|
115
|
+
// It is possible the item selected became invisible again (because the items height changed)
|
|
116
|
+
// So, we need to wait for height to be calculated. Then we need to check
|
|
117
|
+
// if the selected item is visible or not. If it isn't visible we call the scrollToItem again.
|
|
118
|
+
//
|
|
119
|
+
// We can't do this check in the first frame because that frame is being used by the resetScreenThrottled
|
|
120
|
+
// to calculate each height. THen, we can schedule a new frame when this one finishs.
|
|
121
|
+
requestAnimationFrame(function () {
|
|
122
|
+
requestAnimationFrame(function () {
|
|
123
|
+
var isSelectedItemVisible = selectedIndex >= lastVisibleStartIndex && selectedIndex <= lastVisibleStopIndex;
|
|
124
|
+
|
|
125
|
+
//Should scroll to the list item only when the selectedIndex >= 0 and item is not visible
|
|
126
|
+
if (!isSelectedItemVisible && selectedIndex !== -1) {
|
|
127
|
+
listRef.current.scrollToRow(selectedIndex);
|
|
128
|
+
} else if (selectedIndex === -1) {
|
|
129
|
+
listRef.current.scrollToRow(0);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}, [selectedIndex, lastVisibleStartIndex, lastVisibleStopIndex]);
|
|
134
|
+
var _onMouseMove = function onMouseMove(event, index) {
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
event.stopPropagation();
|
|
137
|
+
if (selectedIndex === index) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
(0, _updateSelectedIndex.updateSelectedIndex)(index)(editorView.state, editorView.dispatch);
|
|
141
|
+
};
|
|
142
|
+
(0, _react.useLayoutEffect)(function () {
|
|
143
|
+
if (!listRef.current) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
var isSelectedItemVisible = selectedIndex >= lastVisibleStartIndex && selectedIndex <= lastVisibleStopIndex;
|
|
147
|
+
|
|
148
|
+
//Should scroll to the list item only when the selectedIndex >= 0 and item is not visible
|
|
149
|
+
if (!isSelectedItemVisible && selectedIndex !== -1) {
|
|
150
|
+
listRef.current.scrollToRow(selectedIndex);
|
|
151
|
+
} else if (selectedIndex === -1) {
|
|
152
|
+
listRef.current.scrollToRow(0);
|
|
153
|
+
}
|
|
154
|
+
}, [selectedIndex, lastVisibleStartIndex, lastVisibleStopIndex]);
|
|
155
|
+
(0, _react.useLayoutEffect)(function () {
|
|
156
|
+
setCache(new _CellMeasurer.CellMeasurerCache({
|
|
157
|
+
fixedWidth: true,
|
|
158
|
+
defaultHeight: LIST_ITEM_ESTIMATED_HEIGHT
|
|
159
|
+
}));
|
|
160
|
+
// When query is updated, sometimes the scroll position of the menu is not at the top
|
|
161
|
+
// Scrolling back to top for consistency
|
|
162
|
+
requestAnimationFrame(function () {
|
|
163
|
+
var _listContainerRef$cur;
|
|
164
|
+
if ((_listContainerRef$cur = listContainerRef.current) !== null && _listContainerRef$cur !== void 0 && _listContainerRef$cur.firstChild) {
|
|
165
|
+
listContainerRef.current.firstChild.scrollTo(0, 0);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}, [items]);
|
|
169
|
+
(0, _react.useLayoutEffect)(function () {
|
|
170
|
+
var height = Math.min(items.reduce(function (prevValue, currentValue, index) {
|
|
171
|
+
return prevValue + cache.rowHeight({
|
|
172
|
+
index: index
|
|
173
|
+
});
|
|
174
|
+
}, 0), fitHeight);
|
|
175
|
+
setHeight(height);
|
|
176
|
+
}, [items, cache, fitHeight]);
|
|
177
|
+
(0, _react.useLayoutEffect)(function () {
|
|
178
|
+
if (!listContainerRef.current) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
var element = listContainerRef.current;
|
|
182
|
+
/**
|
|
183
|
+
* To handle the key events on the list
|
|
184
|
+
* @param event
|
|
185
|
+
*/
|
|
186
|
+
var handleKeyDown = function handleKeyDown(event) {
|
|
187
|
+
if (isNavigationKey(event)) {
|
|
188
|
+
switch (event.key) {
|
|
189
|
+
case 'ArrowDown':
|
|
190
|
+
selectNextItem();
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
event.stopPropagation();
|
|
193
|
+
break;
|
|
194
|
+
case 'ArrowUp':
|
|
195
|
+
selectPreviousItem();
|
|
196
|
+
event.preventDefault();
|
|
197
|
+
event.stopPropagation();
|
|
198
|
+
break;
|
|
199
|
+
|
|
200
|
+
// TODO DTR-1401: why is this calling item click when hitting tab? fix this in DTR-1401
|
|
201
|
+
case 'Tab':
|
|
202
|
+
//Tab key quick inserts the selected item.
|
|
203
|
+
onItemClick(_typeAhead.SelectItemMode.TAB, selectedIndex);
|
|
204
|
+
event.preventDefault();
|
|
205
|
+
break;
|
|
206
|
+
case 'Enter':
|
|
207
|
+
//Enter key quick inserts the selected item.
|
|
208
|
+
if (!event.isComposing || event.which !== 229 && event.keyCode !== 229) {
|
|
209
|
+
onItemClick(event.shiftKey ? _typeAhead.SelectItemMode.SHIFT_ENTER : _typeAhead.SelectItemMode.ENTER, selectedIndex);
|
|
210
|
+
event.preventDefault();
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
default:
|
|
214
|
+
event.preventDefault();
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
//All the remaining keys sets focus on the typeahead query(inputQuery.tsx))
|
|
218
|
+
focusTargetElement();
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
element === null || element === void 0 || element.addEventListener('keydown', handleKeyDown);
|
|
222
|
+
return function () {
|
|
223
|
+
element === null || element === void 0 || element.removeEventListener('keydown', handleKeyDown);
|
|
224
|
+
};
|
|
225
|
+
}, [editorView.state, focusTargetElement, selectNextItem, selectPreviousItem, selectedIndex, onItemClick, items.length]);
|
|
226
|
+
var renderRow = function renderRow(_ref4) {
|
|
227
|
+
var index = _ref4.index,
|
|
228
|
+
key = _ref4.key,
|
|
229
|
+
style = _ref4.style,
|
|
230
|
+
parent = _ref4.parent;
|
|
231
|
+
var currentItem = items[index];
|
|
232
|
+
return (0, _react2.jsx)(_CellMeasurer.CellMeasurer, {
|
|
233
|
+
key: key,
|
|
234
|
+
cache: cache,
|
|
235
|
+
parent: parent,
|
|
236
|
+
columnIndex: 0,
|
|
237
|
+
rowIndex: index
|
|
238
|
+
}, (0, _react2.jsx)("div", {
|
|
239
|
+
style: style,
|
|
240
|
+
"data-index": index
|
|
241
|
+
}, (0, _react2.jsx)("div", {
|
|
242
|
+
"data-testid": "list-item-height-observed-".concat(index),
|
|
243
|
+
onMouseMove: function onMouseMove(e) {
|
|
244
|
+
return _onMouseMove(e, index);
|
|
245
|
+
}
|
|
246
|
+
}, (0, _react2.jsx)(_TypeAheadListItem.TypeAheadListItem, {
|
|
247
|
+
key: items[index].title,
|
|
248
|
+
item: currentItem,
|
|
249
|
+
itemsLength: items.length,
|
|
250
|
+
itemIndex: index,
|
|
251
|
+
selectedIndex: selectedIndex,
|
|
252
|
+
onItemClick: actions.onItemClick,
|
|
253
|
+
ariaLabel: (0, _utils.getTypeAheadListAriaLabels)(triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.trigger, intl, currentItem).listItemAriaLabel
|
|
254
|
+
}))));
|
|
255
|
+
};
|
|
256
|
+
var popupAriaLabel = (0, _utils.getTypeAheadListAriaLabels)(triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.trigger, intl).popupAriaLabel;
|
|
257
|
+
if (!Array.isArray(items)) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
var menuGroupId = ((_decorationElement$qu2 = decorationElement.querySelector("[role='combobox']")) === null || _decorationElement$qu2 === void 0 ? void 0 : _decorationElement$qu2.getAttribute('aria-controls')) || _constants.TYPE_AHEAD_DECORATION_ELEMENT_ID;
|
|
261
|
+
return (0, _react2.jsx)(_menu.MenuGroup, {
|
|
262
|
+
"aria-label": popupAriaLabel,
|
|
263
|
+
"aria-relevant": "additions removals"
|
|
264
|
+
}, (0, _react2.jsx)("div", {
|
|
265
|
+
id: menuGroupId,
|
|
266
|
+
ref: listContainerRef
|
|
267
|
+
}, (0, _react2.jsx)(_List.List, {
|
|
268
|
+
rowRenderer: renderRow,
|
|
269
|
+
ref: listRef,
|
|
270
|
+
rowCount: items.length,
|
|
271
|
+
rowHeight: cache.rowHeight,
|
|
272
|
+
onRowsRendered: onItemsRendered,
|
|
273
|
+
width: LIST_WIDTH,
|
|
274
|
+
onScroll: onScroll,
|
|
275
|
+
height: height,
|
|
276
|
+
overscanRowCount: 3,
|
|
277
|
+
containerRole: "presentation",
|
|
278
|
+
role: "listbox",
|
|
279
|
+
css: (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n button {\n padding: ", "\n ", " 11px;\n span:last-child span:last-child {\n white-space: normal;\n }\n }\n "])), "var(--ds-space-150, 12px)", "var(--ds-space-150, 12px)")
|
|
280
|
+
}), (0, _react2.jsx)(TypeaheadAssistiveTextPureComponent, {
|
|
281
|
+
numberOfResults: items.length.toString()
|
|
282
|
+
})));
|
|
283
|
+
});
|
|
284
|
+
var TypeAheadList = exports.TypeAheadList = (0, _reactIntlNext.injectIntl)(TypeAheadListComponent);
|
|
285
|
+
TypeAheadList.displayName = 'TypeAheadList';
|