@atlaskit/editor-plugin-insert-block 28.0.4 → 28.0.6

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 (20) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/ui/registered-insert-menu/RegisteredInsertMenu.js +113 -16
  3. package/dist/cjs/ui/registered-insert-menu/RegisteredInsertMenuContent.js +12 -9
  4. package/dist/cjs/ui/registered-insert-menu/RegisteredInsertMenuItem.js +7 -2
  5. package/dist/cjs/ui/registered-insert-menu/RegisteredInsertMenuList.compiled.css +2 -0
  6. package/dist/cjs/ui/registered-insert-menu/RegisteredInsertMenuList.js +137 -51
  7. package/dist/es2019/ui/registered-insert-menu/RegisteredInsertMenu.js +98 -11
  8. package/dist/es2019/ui/registered-insert-menu/RegisteredInsertMenuContent.js +11 -7
  9. package/dist/es2019/ui/registered-insert-menu/RegisteredInsertMenuItem.js +7 -2
  10. package/dist/es2019/ui/registered-insert-menu/RegisteredInsertMenuList.compiled.css +2 -0
  11. package/dist/es2019/ui/registered-insert-menu/RegisteredInsertMenuList.js +99 -21
  12. package/dist/esm/ui/registered-insert-menu/RegisteredInsertMenu.js +113 -16
  13. package/dist/esm/ui/registered-insert-menu/RegisteredInsertMenuContent.js +13 -10
  14. package/dist/esm/ui/registered-insert-menu/RegisteredInsertMenuItem.js +7 -2
  15. package/dist/esm/ui/registered-insert-menu/RegisteredInsertMenuList.compiled.css +2 -0
  16. package/dist/esm/ui/registered-insert-menu/RegisteredInsertMenuList.js +138 -52
  17. package/dist/types/ui/registered-insert-menu/RegisteredInsertMenu.d.ts +3 -1
  18. package/dist/types/ui/registered-insert-menu/RegisteredInsertMenuItem.d.ts +1 -0
  19. package/dist/types/ui/registered-insert-menu/RegisteredInsertMenuList.d.ts +7 -2
  20. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/editor-plugin-insert-block
2
2
 
3
+ ## 28.0.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`f93da47c0d069`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f93da47c0d069) -
8
+ Add shared illustrated empty states and search outcome analytics for registered slash, Plus and
9
+ Element Browser searches under platform_editor_slash_command. Refresh resolved registrations on
10
+ search edits and retain eligible Ask Rovo and host Marketplace recovery. Remove duplicate top
11
+ spacing in the Plus menu and show its previews only for directly hovered or keyboard-selected
12
+ items. Subscribe all three registered entry points to live registry updates and rebuild their
13
+ models on search changes, keeping selection and category state valid as items arrive or disappear.
14
+ Omit the Plus footer divider when only the generic empty state is shown.
15
+ - Updated dependencies
16
+
17
+ ## 28.0.5
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+
3
23
  ## 28.0.4
4
24
 
5
25
  ### Patch Changes
@@ -17,6 +17,7 @@ var _browserApis = require("@atlaskit/browser-apis");
17
17
  var _insertBlock = require("@atlaskit/editor-common/messages/insert-block");
18
18
  var _keys = require("@atlaskit/editor-common/quick-insert/keys");
19
19
  var _registeredMenuModel = require("@atlaskit/editor-common/quick-insert/registered-menu-model");
20
+ var _useSearchAnalytics = require("@atlaskit/editor-common/quick-insert/use-search-analytics");
20
21
  var _typeAheadIsSectionOverflowItemKey = require("@atlaskit/editor-common/type-ahead-is-section-overflow-item-key");
21
22
  var _typeAheadSurfaceContext = require("@atlaskit/editor-common/type-ahead-surface-context");
22
23
  var _createSurfaceContext = require("@atlaskit/editor-ui-control-model/create-surface-context");
@@ -32,6 +33,7 @@ var styles = {
32
33
  var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredInsertMenu(_ref) {
33
34
  var components = _ref.components,
34
35
  emptyStateHandler = _ref.emptyStateHandler,
36
+ fireAnalyticsEvent = _ref.fireAnalyticsEvent,
35
37
  getItemRank = _ref.getItemRank,
36
38
  editorView = _ref.editorView,
37
39
  isOffline = _ref.isOffline,
@@ -58,6 +60,7 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
58
60
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
59
61
  selectedItemIndex = _useState6[0],
60
62
  setSelectedItemIndex = _useState6[1];
63
+ var selectedItemIndexRef = (0, _react.useRef)(selectedItemIndex);
61
64
  var _useState7 = (0, _react.useState)({
62
65
  startIndex: -1,
63
66
  stopIndex: -1
@@ -95,6 +98,34 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
95
98
  surfaceContext: surfaceContext
96
99
  });
97
100
  }, [components, formatMessage, getItemRank, hasSectionOverflowItems, query, surfaceContext]);
101
+ var _useState9 = (0, _react.useState)(),
102
+ _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
103
+ previewActivation = _useState0[0],
104
+ setPreviewActivation = _useState0[1];
105
+ var activePreviewItemKey = (previewActivation === null || previewActivation === void 0 ? void 0 : previewActivation.model) === model ? previewActivation.itemKey : undefined;
106
+ var searchResultCount = (0, _react.useMemo)(function () {
107
+ return model.sections.reduce(function (count, section) {
108
+ return count + section.filter(function (_ref3) {
109
+ var key = _ref3.key,
110
+ type = _ref3.type;
111
+ return type === 'menu-item' && !(0, _typeAheadIsSectionOverflowItemKey.isSectionOverflowItemKey)(key);
112
+ }).length;
113
+ }, 0);
114
+ }, [model.sections]);
115
+ var flushSearchAnalytics = (0, _useSearchAnalytics.useQuickInsertSearchAnalytics)({
116
+ fireAnalyticsEvent: fireAnalyticsEvent,
117
+ query: query,
118
+ resultCount: searchResultCount,
119
+ surface: 'toolbar'
120
+ });
121
+ var closeWithAnalytics = (0, _react.useCallback)(function () {
122
+ flushSearchAnalytics();
123
+ onClose();
124
+ }, [flushSearchAnalytics, onClose]);
125
+ var selectWithAnalytics = (0, _react.useCallback)(function () {
126
+ flushSearchAnalytics();
127
+ onSelect();
128
+ }, [flushSearchAnalytics, onSelect]);
98
129
  var selectableItems = (0, _react.useMemo)(function () {
99
130
  return (0, _registeredMenuModel.getQuickInsertMenuRows)(model).filter(function (row) {
100
131
  return row.type === 'menu-item';
@@ -102,26 +133,88 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
102
133
  }, [model]);
103
134
  var itemCount = selectableItems.length + (model.footer ? 1 : 0);
104
135
  var selectableItemKeys = (0, _react.useMemo)(function () {
105
- return [].concat((0, _toConsumableArray2.default)(selectableItems), (0, _toConsumableArray2.default)(model.footer ? [model.footer] : [])).map(function (_ref3) {
106
- var key = _ref3.key;
136
+ return [].concat((0, _toConsumableArray2.default)(selectableItems), (0, _toConsumableArray2.default)(model.footer ? [model.footer] : [])).map(function (_ref4) {
137
+ var key = _ref4.key;
107
138
  return key;
108
139
  }).join(',');
109
140
  }, [model.footer, selectableItems]);
110
141
  (0, _react.useLayoutEffect)(function () {
111
- setSelectedItemIndex(itemCount > 0 ? 0 : -1);
142
+ var initialItemIndex = itemCount > 0 ? 0 : -1;
143
+ selectedItemIndexRef.current = initialItemIndex;
144
+ setSelectedItemIndex(initialItemIndex);
112
145
  }, [itemCount, query, selectableItemKeys]);
146
+ (0, _react.useLayoutEffect)(function () {
147
+ setPreviewActivation(undefined);
148
+ }, [model, query]);
113
149
  var isActiveItemMounted = selectedItemIndex >= 0 && selectedItemIndex < itemCount && (selectedItemIndex >= renderedItems.startIndex && selectedItemIndex <= renderedItems.stopIndex || Boolean(model.footer) && selectedItemIndex === itemCount - 1);
114
150
  var activeItemId = "".concat(listId, "-").concat(selectedItemIndex);
151
+ var setKeyboardPreview = (0, _react.useCallback)(function (itemIndex) {
152
+ var item = selectableItems[itemIndex];
153
+ setPreviewActivation(item ? {
154
+ itemKey: item.key,
155
+ model: model,
156
+ source: 'keyboard'
157
+ } : undefined);
158
+ }, [model, selectableItems]);
115
159
  var selectNextItem = (0, _react.useCallback)(function () {
116
- setSelectedItemIndex(function (index) {
117
- return itemCount === 0 ? -1 : (index + 1) % itemCount;
118
- });
119
- }, [itemCount]);
160
+ var currentIndex = selectedItemIndexRef.current;
161
+ var nextIndex = itemCount === 0 ? -1 : currentIndex < 0 ? 0 : (currentIndex + 1) % itemCount;
162
+ selectedItemIndexRef.current = nextIndex;
163
+ setSelectedItemIndex(nextIndex);
164
+ setKeyboardPreview(nextIndex);
165
+ }, [itemCount, setKeyboardPreview]);
120
166
  var selectPreviousItem = (0, _react.useCallback)(function () {
121
- setSelectedItemIndex(function (index) {
122
- return itemCount === 0 ? -1 : index <= 0 ? itemCount - 1 : index - 1;
167
+ var currentIndex = selectedItemIndexRef.current;
168
+ var previousIndex = itemCount === 0 ? -1 : currentIndex <= 0 ? itemCount - 1 : currentIndex - 1;
169
+ selectedItemIndexRef.current = previousIndex;
170
+ setSelectedItemIndex(previousIndex);
171
+ setKeyboardPreview(previousIndex);
172
+ }, [itemCount, setKeyboardPreview]);
173
+ var onItemHover = (0, _react.useCallback)(function (itemIndex, itemKey) {
174
+ selectedItemIndexRef.current = itemIndex;
175
+ setSelectedItemIndex(itemIndex);
176
+ setPreviewActivation(function (current) {
177
+ if ((current === null || current === void 0 ? void 0 : current.itemKey) === itemKey && (current === null || current === void 0 ? void 0 : current.model) === model && (current === null || current === void 0 ? void 0 : current.source) === 'pointer') {
178
+ return current;
179
+ }
180
+ return itemKey ? {
181
+ itemKey: itemKey,
182
+ model: model,
183
+ source: 'pointer'
184
+ } : undefined;
185
+ });
186
+ }, [model]);
187
+ var onItemFocus = (0, _react.useCallback)(function (itemIndex, itemKey) {
188
+ selectedItemIndexRef.current = itemIndex;
189
+ setSelectedItemIndex(itemIndex);
190
+ setPreviewActivation(function (current) {
191
+ if ((current === null || current === void 0 ? void 0 : current.itemKey) === itemKey && (current === null || current === void 0 ? void 0 : current.model) === model) {
192
+ return current;
193
+ }
194
+ return itemKey ? {
195
+ itemKey: itemKey,
196
+ model: model,
197
+ source: 'keyboard'
198
+ } : undefined;
199
+ });
200
+ }, [model]);
201
+ var onItemLeave = (0, _react.useCallback)(function (itemKey) {
202
+ setPreviewActivation(function (current) {
203
+ return (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current;
204
+ });
205
+ }, []);
206
+ var onItemBlur = (0, _react.useCallback)(function (itemKey) {
207
+ setPreviewActivation(function (current) {
208
+ return (current === null || current === void 0 ? void 0 : current.itemKey) === itemKey ? undefined : current;
123
209
  });
124
- }, [itemCount]);
210
+ }, []);
211
+ var onItemVisibilityChange = (0, _react.useCallback)(function (itemKey, isVisible) {
212
+ if (!isVisible) {
213
+ setPreviewActivation(function (current) {
214
+ return (current === null || current === void 0 ? void 0 : current.source) === 'pointer' && current.itemKey === itemKey ? undefined : current;
215
+ });
216
+ }
217
+ }, []);
125
218
  var selectActiveItem = (0, _react.useCallback)(function () {
126
219
  if (isActiveItemMounted) {
127
220
  var _getDocument;
@@ -130,12 +223,11 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
130
223
  }, [activeItemId, isActiveItemMounted]);
131
224
  var onQueryChange = (0, _react.useCallback)(function (event) {
132
225
  setQuery(event.currentTarget.value);
133
- setSelectedItemIndex(0);
134
226
  }, []);
135
227
  var onKeyDown = (0, _react.useCallback)(function (event) {
136
228
  if (event.key === 'Escape') {
137
229
  event.preventDefault();
138
- onClose();
230
+ closeWithAnalytics();
139
231
  return;
140
232
  }
141
233
 
@@ -159,7 +251,7 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
159
251
  selectActiveItem();
160
252
  break;
161
253
  }
162
- }, [onClose, selectActiveItem, selectNextItem, selectPreviousItem]);
254
+ }, [closeWithAnalytics, selectActiveItem, selectNextItem, selectPreviousItem]);
163
255
  return /*#__PURE__*/_react.default.createElement(_compiled.Box, {
164
256
  "data-keyboard-navigation-independent": "",
165
257
  testId: "registered-insert-menu",
@@ -186,11 +278,16 @@ var RegisteredInsertMenu = exports.RegisteredInsertMenu = function RegisteredIns
186
278
  maxHeight: maxHeight,
187
279
  menuOpenId: menuOpenId,
188
280
  model: model,
189
- onClose: onSelect,
190
- onItemHover: setSelectedItemIndex,
281
+ onClose: selectWithAnalytics,
282
+ onItemFocus: onItemFocus,
283
+ onItemHover: onItemHover,
284
+ onItemBlur: onItemBlur,
285
+ onItemLeave: onItemLeave,
286
+ onItemVisibilityChange: onItemVisibilityChange,
191
287
  onRenderedItemsChange: setRenderedItems,
192
288
  query: query,
193
289
  selectedItemIndex: selectedItemIndex,
194
- surfaceContext: surfaceContext
290
+ surfaceContext: surfaceContext,
291
+ activePreviewItemKey: activePreviewItemKey
195
292
  }));
196
293
  };
@@ -6,13 +6,16 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.RegisteredInsertMenuContent = void 0;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
9
  var _react = _interopRequireWildcard(require("react"));
11
10
  var _keys = require("@atlaskit/editor-common/quick-insert/keys");
12
11
  var _ui = require("@atlaskit/editor-common/ui");
13
12
  var _withOuterListeners = _interopRequireDefault(require("@atlaskit/editor-common/with-outer-listeners"));
14
13
  var _RegisteredInsertMenu = require("./RegisteredInsertMenu");
15
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ var EMPTY_COMPONENTS = [];
16
+ var subscribeToNothing = function subscribeToNothing() {
17
+ return function () {};
18
+ };
16
19
  var RegisteredInsertMenuContainer = function RegisteredInsertMenuContainer(_ref) {
17
20
  var children = _ref.children;
18
21
  var setOutsideClickTargetRef = (0, _react.useContext)(_ui.PlainOutsideClickTargetRefContext);
@@ -22,7 +25,7 @@ var RegisteredInsertMenuContainer = function RegisteredInsertMenuContainer(_ref)
22
25
  };
23
26
  var RegisteredInsertMenuWithListeners = (0, _withOuterListeners.default)(RegisteredInsertMenuContainer);
24
27
  var RegisteredInsertMenuContent = exports.RegisteredInsertMenuContent = function RegisteredInsertMenuContent(_ref2) {
25
- var _api$quickInsert, _api$quickInsert2;
28
+ var _api$uiControlRegistr2, _api$uiControlRegistr3, _api$quickInsert, _api$analytics, _api$quickInsert2;
26
29
  var api = _ref2.api,
27
30
  editorView = _ref2.editorView,
28
31
  isOffline = _ref2.isOffline,
@@ -31,13 +34,12 @@ var RegisteredInsertMenuContent = exports.RegisteredInsertMenuContent = function
31
34
  onDismiss = _ref2.onDismiss,
32
35
  onSelect = _ref2.onSelect,
33
36
  target = _ref2.target;
34
- // Keep registrations stable while the open menu is searched or navigated.
35
- var _useState = (0, _react.useState)(function () {
36
- var _api$uiControlRegistr, _api$uiControlRegistr2;
37
- return (_api$uiControlRegistr = api === null || api === void 0 || (_api$uiControlRegistr2 = api.uiControlRegistry) === null || _api$uiControlRegistr2 === void 0 ? void 0 : _api$uiControlRegistr2.actions.getComponents(_keys.MENU.key)) !== null && _api$uiControlRegistr !== void 0 ? _api$uiControlRegistr : [];
38
- }),
39
- _useState2 = (0, _slicedToArray2.default)(_useState, 1),
40
- components = _useState2[0];
37
+ var getComponents = (0, _react.useCallback)(function () {
38
+ var _api$uiControlRegistr;
39
+ var components = api === null || api === void 0 || (_api$uiControlRegistr = api.uiControlRegistry) === null || _api$uiControlRegistr === void 0 ? void 0 : _api$uiControlRegistr.actions.getComponents(_keys.MENU.key);
40
+ return components !== null && components !== void 0 && components.length ? components : EMPTY_COMPONENTS;
41
+ }, [api]);
42
+ var components = (0, _react.useSyncExternalStore)((_api$uiControlRegistr2 = api === null || api === void 0 || (_api$uiControlRegistr3 = api.uiControlRegistry) === null || _api$uiControlRegistr3 === void 0 ? void 0 : _api$uiControlRegistr3.actions.subscribe) !== null && _api$uiControlRegistr2 !== void 0 ? _api$uiControlRegistr2 : subscribeToNothing, getComponents, getComponents);
41
43
  var onClickOutside = (0, _react.useCallback)(function (event) {
42
44
  if (event.target instanceof Node && target !== null && target !== void 0 && target.contains(event.target)) {
43
45
  return;
@@ -50,6 +52,7 @@ var RegisteredInsertMenuContent = exports.RegisteredInsertMenuContent = function
50
52
  components: components,
51
53
  editorView: editorView,
52
54
  emptyStateHandler: api === null || api === void 0 || (_api$quickInsert = api.quickInsert) === null || _api$quickInsert === void 0 || (_api$quickInsert = _api$quickInsert.sharedState.currentState()) === null || _api$quickInsert === void 0 ? void 0 : _api$quickInsert.emptyStateHandler,
55
+ fireAnalyticsEvent: api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions.fireAnalyticsEvent,
53
56
  getItemRank: api === null || api === void 0 || (_api$quickInsert2 = api.quickInsert) === null || _api$quickInsert2 === void 0 || (_api$quickInsert2 = _api$quickInsert2.sharedState.currentState()) === null || _api$quickInsert2 === void 0 ? void 0 : _api$quickInsert2.getItemRank,
54
57
  isOffline: isOffline,
55
58
  maxHeight: maxHeight,
@@ -4,12 +4,14 @@ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.RegisteredInsertMenuItem = void 0;
7
+ exports.RegisteredInsertMenuPreviewContext = exports.RegisteredInsertMenuItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _enums = require("@atlaskit/editor-common/analytics/types/enums");
10
10
  var _insert = require("@atlaskit/editor-common/insert");
11
11
  var _provider = require("@atlaskit/editor-common/quick-insert/provider");
12
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
+ // Preview updates must remain live while react-virtualized caches row elements during scrolling.
14
+ var RegisteredInsertMenuPreviewContext = exports.RegisteredInsertMenuPreviewContext = /*#__PURE__*/(0, _react.createContext)(undefined);
13
15
  var RegisteredInsertMenuItem = exports.RegisteredInsertMenuItem = function RegisteredInsertMenuItem(_ref) {
14
16
  var _registration$compone;
15
17
  var editorView = _ref.editorView,
@@ -21,6 +23,8 @@ var RegisteredInsertMenuItem = exports.RegisteredInsertMenuItem = function Regis
21
23
  registration = _ref.registration,
22
24
  surfaceContext = _ref.surfaceContext;
23
25
  var Component = (_registration$compone = registration.component) !== null && _registration$compone !== void 0 ? _registration$compone : _react.default.Fragment;
26
+ var activePreviewItemKey = (0, _react.useContext)(RegisteredInsertMenuPreviewContext);
27
+ var isPreviewActive = activePreviewItemKey === registration.key;
24
28
  var select = (0, _react.useCallback)(function (selectionHandler) {
25
29
  // Close first so a registered item may safely focus the editor or open its picker.
26
30
  onClose();
@@ -45,6 +49,7 @@ var RegisteredInsertMenuItem = exports.RegisteredInsertMenuItem = function Regis
45
49
  isOffline: isOffline,
46
50
  item: {
47
51
  id: id,
52
+ isPreviewActive: isPreviewActive,
48
53
  isSelected: isSelected
49
54
  },
50
55
  menuOpenId: menuOpenId,
@@ -52,7 +57,7 @@ var RegisteredInsertMenuItem = exports.RegisteredInsertMenuItem = function Regis
52
57
  surface: 'toolbar',
53
58
  surfaceContext: surfaceContext
54
59
  };
55
- }, [editorView, id, isOffline, isSelected, menuOpenId, select, surfaceContext]);
60
+ }, [editorView, id, isOffline, isPreviewActive, isSelected, menuOpenId, select, surfaceContext]);
56
61
  return /*#__PURE__*/_react.default.createElement(_provider.QuickInsertProvider, {
57
62
  value: contextValue
58
63
  }, /*#__PURE__*/_react.default.createElement(Component, null, null));
@@ -4,6 +4,8 @@
4
4
  ._1e0c1txw{display:flex}
5
5
  ._1i531l7x{border-top-color:var(--ds-border,#0b120e24)}
6
6
  ._1o9zidpf{flex-shrink:0}
7
+ ._1q51u2gc{padding-block-start:var(--ds-space-100,8px)}
7
8
  ._1tkeidpf{min-height:0}
8
9
  ._2lx21bp4{flex-direction:column}
10
+ ._85i5u2gc{padding-block-end:var(--ds-space-100,8px)}
9
11
  ._uwhke4h9{border-top-width:var(--ds-border-width,1px)}
@@ -15,6 +15,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
15
15
  var _react = _interopRequireWildcard(require("react"));
16
16
  var _CellMeasurer = require("react-virtualized/dist/commonjs/CellMeasurer");
17
17
  var _List = require("react-virtualized/dist/commonjs/List");
18
+ var _emptyState = require("@atlaskit/editor-common/quick-insert/empty-state");
18
19
  var _registeredMenuModel = require("@atlaskit/editor-common/quick-insert/registered-menu-model");
19
20
  var _useMenuListHeight2 = require("@atlaskit/editor-common/quick-insert/use-menu-list-height");
20
21
  var _compiled = require("@atlaskit/primitives/compiled");
@@ -35,24 +36,77 @@ var listAriaProps = {
35
36
  var styles = {
36
37
  content: "_1e0c1txw _2lx21bp4 _1tkeidpf",
37
38
  scrollable: "_16jlkb7n _1tkeidpf _18m91wug",
38
- footer: "_1i531l7x _15a5nqa1 _uwhke4h9 _1o9zidpf"
39
+ footer: "_1o9zidpf",
40
+ footerWithDivider: "_1i531l7x _15a5nqa1 _uwhke4h9 _1o9zidpf",
41
+ externalControls: "_1i531l7x _15a5nqa1 _uwhke4h9 _1q51u2gc _85i5u2gc"
39
42
  };
40
- var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function RegisteredInsertMenuList(_ref) {
41
- var _model$root$component, _model$root;
43
+ var RegisteredInsertMenuItemRow = function RegisteredInsertMenuItemRow(_ref) {
42
44
  var editorView = _ref.editorView,
43
- emptyStateHandler = _ref.emptyStateHandler,
45
+ id = _ref.id,
44
46
  isOffline = _ref.isOffline,
45
- listId = _ref.listId,
46
- listLabel = _ref.listLabel,
47
- maxHeight = _ref.maxHeight,
47
+ isSelected = _ref.isSelected,
48
+ itemIndex = _ref.itemIndex,
48
49
  menuOpenId = _ref.menuOpenId,
49
- model = _ref.model,
50
50
  onClose = _ref.onClose,
51
- query = _ref.query,
51
+ onItemFocus = _ref.onItemFocus,
52
+ onItemBlur = _ref.onItemBlur,
52
53
  onItemHover = _ref.onItemHover,
53
- onRenderedItemsChange = _ref.onRenderedItemsChange,
54
- selectedItemIndex = _ref.selectedItemIndex,
54
+ onItemLeave = _ref.onItemLeave,
55
+ registration = _ref.registration,
55
56
  surfaceContext = _ref.surfaceContext;
57
+ (0, _react.useLayoutEffect)(function () {
58
+ return function () {
59
+ return onItemLeave(registration.key);
60
+ };
61
+ }, [onItemLeave, registration.key]);
62
+ var onBlur = (0, _react.useCallback)(function (event) {
63
+ if (!event.currentTarget.contains(event.relatedTarget)) {
64
+ onItemBlur(registration.key);
65
+ }
66
+ }, [onItemBlur, registration.key]);
67
+ return /*#__PURE__*/_react.default.createElement("div", {
68
+ onBlur: onBlur,
69
+ onFocus: function onFocus() {
70
+ return onItemFocus(itemIndex, registration.key);
71
+ },
72
+ onMouseLeave: function onMouseLeave() {
73
+ return onItemLeave(registration.key);
74
+ },
75
+ onMouseMove: function onMouseMove() {
76
+ return onItemHover(itemIndex, registration.key);
77
+ }
78
+ }, /*#__PURE__*/_react.default.createElement(_RegisteredInsertMenuItem.RegisteredInsertMenuItem, {
79
+ editorView: editorView,
80
+ id: id,
81
+ isOffline: isOffline,
82
+ isSelected: isSelected,
83
+ menuOpenId: menuOpenId,
84
+ onClose: onClose,
85
+ registration: registration,
86
+ surfaceContext: surfaceContext
87
+ }));
88
+ };
89
+ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function RegisteredInsertMenuList(_ref2) {
90
+ var _model$root$component, _model$root;
91
+ var editorView = _ref2.editorView,
92
+ emptyStateHandler = _ref2.emptyStateHandler,
93
+ isOffline = _ref2.isOffline,
94
+ listId = _ref2.listId,
95
+ listLabel = _ref2.listLabel,
96
+ maxHeight = _ref2.maxHeight,
97
+ menuOpenId = _ref2.menuOpenId,
98
+ model = _ref2.model,
99
+ onClose = _ref2.onClose,
100
+ onItemFocus = _ref2.onItemFocus,
101
+ onItemBlur = _ref2.onItemBlur,
102
+ query = _ref2.query,
103
+ onItemHover = _ref2.onItemHover,
104
+ onItemLeave = _ref2.onItemLeave,
105
+ onItemVisibilityChange = _ref2.onItemVisibilityChange,
106
+ onRenderedItemsChange = _ref2.onRenderedItemsChange,
107
+ selectedItemIndex = _ref2.selectedItemIndex,
108
+ surfaceContext = _ref2.surfaceContext,
109
+ activePreviewItemKey = _ref2.activePreviewItemKey;
56
110
  var Root = (_model$root$component = (_model$root = model.root) === null || _model$root === void 0 ? void 0 : _model$root.component) !== null && _model$root$component !== void 0 ? _model$root$component : _react.default.Fragment;
57
111
  var listRef = (0, _react.useRef)(null);
58
112
  var setListRef = (0, _react.useCallback)(function (list) {
@@ -97,9 +151,9 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
97
151
  return -1;
98
152
  }, [itemIndexByRowIndex, selectedItemIndex]);
99
153
  var rowKeySignature = (0, _react.useMemo)(function () {
100
- return rows.map(function (_ref2) {
101
- var key = _ref2.key,
102
- type = _ref2.type;
154
+ return rows.map(function (_ref3) {
155
+ var key = _ref3.key,
156
+ type = _ref3.type;
103
157
  return "".concat(type, ":").concat(key);
104
158
  }).join('\0');
105
159
  }, [rows]);
@@ -112,61 +166,75 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
112
166
  (_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.recomputeRowHeights();
113
167
  (_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 || _listRef$current2.scrollToPosition(0);
114
168
  }, [cache, rowKeySignature]);
115
- var onRowsRendered = (0, _react.useCallback)(function (_ref3) {
169
+ var onRowsRendered = (0, _react.useCallback)(function (_ref4) {
116
170
  var _indexes$, _indexes;
117
- var overscanStartIndex = _ref3.overscanStartIndex,
118
- overscanStopIndex = _ref3.overscanStopIndex;
171
+ var overscanStartIndex = _ref4.overscanStartIndex,
172
+ overscanStopIndex = _ref4.overscanStopIndex,
173
+ startIndex = _ref4.startIndex,
174
+ stopIndex = _ref4.stopIndex;
175
+ if (activePreviewItemKey) {
176
+ var previewRowIndex = rows.findIndex(function (_ref5) {
177
+ var key = _ref5.key;
178
+ return key === activePreviewItemKey;
179
+ });
180
+ if (previewRowIndex < startIndex || previewRowIndex > stopIndex) {
181
+ onItemVisibilityChange(activePreviewItemKey, false);
182
+ }
183
+ }
119
184
  updateHeight();
120
- var indexes = (0, _toConsumableArray2.default)(itemIndexByRowIndex).filter(function (_ref4) {
121
- var _ref5 = (0, _slicedToArray2.default)(_ref4, 1),
122
- rowIndex = _ref5[0];
185
+ var indexes = (0, _toConsumableArray2.default)(itemIndexByRowIndex).filter(function (_ref6) {
186
+ var _ref7 = (0, _slicedToArray2.default)(_ref6, 1),
187
+ rowIndex = _ref7[0];
123
188
  return rowIndex >= overscanStartIndex && rowIndex <= overscanStopIndex;
124
- }).map(function (_ref6) {
125
- var _ref7 = (0, _slicedToArray2.default)(_ref6, 2),
126
- itemIndex = _ref7[1];
189
+ }).map(function (_ref8) {
190
+ var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
191
+ itemIndex = _ref9[1];
127
192
  return itemIndex;
128
193
  });
129
194
  onRenderedItemsChange({
130
195
  startIndex: (_indexes$ = indexes[0]) !== null && _indexes$ !== void 0 ? _indexes$ : -1,
131
196
  stopIndex: (_indexes = indexes[indexes.length - 1]) !== null && _indexes !== void 0 ? _indexes : -1
132
197
  });
133
- }, [itemIndexByRowIndex, onRenderedItemsChange, updateHeight]);
134
- var renderRow = (0, _react.useCallback)(function (_ref8) {
198
+ }, [activePreviewItemKey, itemIndexByRowIndex, onItemVisibilityChange, onRenderedItemsChange, rows, updateHeight]);
199
+ var onScrollableContentScroll = (0, _react.useCallback)(function (event) {
200
+ if (event.target === event.currentTarget && activePreviewItemKey) {
201
+ onItemVisibilityChange(activePreviewItemKey, false);
202
+ }
203
+ }, [activePreviewItemKey, onItemVisibilityChange]);
204
+ var renderRow = (0, _react.useCallback)(function (_ref0) {
135
205
  var _registration$compone;
136
- var index = _ref8.index,
137
- key = _ref8.key,
138
- parent = _ref8.parent,
139
- style = _ref8.style;
206
+ var index = _ref0.index,
207
+ key = _ref0.key,
208
+ parent = _ref0.parent,
209
+ style = _ref0.style;
140
210
  var registration = rows[index];
141
211
  if (!registration) {
142
212
  return null;
143
213
  }
144
214
  var itemIndex = itemIndexByRowIndex.get(index);
145
- var rowContent = registration.type === 'menu-section' ? ( /*#__PURE__*/_react.default.createElement((_registration$compone = registration.component) !== null && _registration$compone !== void 0 ? _registration$compone : _react.default.Fragment, null, null)) : /*#__PURE__*/_react.default.createElement("div", {
146
- onFocus: function onFocus() {
147
- return onItemHover(itemIndex !== null && itemIndex !== void 0 ? itemIndex : 0);
148
- },
149
- onMouseMove: function onMouseMove() {
150
- return onItemHover(itemIndex !== null && itemIndex !== void 0 ? itemIndex : 0);
151
- }
152
- }, /*#__PURE__*/_react.default.createElement(_RegisteredInsertMenuItem.RegisteredInsertMenuItem, {
215
+ var rowContent = registration.type === 'menu-section' ? ( /*#__PURE__*/_react.default.createElement((_registration$compone = registration.component) !== null && _registration$compone !== void 0 ? _registration$compone : _react.default.Fragment, null, null)) : /*#__PURE__*/_react.default.createElement(RegisteredInsertMenuItemRow, {
153
216
  editorView: editorView,
154
217
  id: "".concat(listId, "-").concat(itemIndex),
155
218
  isOffline: isOffline,
156
219
  isSelected: itemIndex === selectedItemIndex,
220
+ itemIndex: itemIndex !== null && itemIndex !== void 0 ? itemIndex : 0,
157
221
  menuOpenId: menuOpenId,
158
222
  onClose: onClose,
223
+ onItemFocus: onItemFocus,
224
+ onItemBlur: onItemBlur,
225
+ onItemHover: onItemHover,
226
+ onItemLeave: onItemLeave,
159
227
  registration: registration,
160
228
  surfaceContext: surfaceContext
161
- }));
229
+ });
162
230
  return /*#__PURE__*/_react.default.createElement(_CellMeasurer.CellMeasurer, {
163
231
  key: key,
164
232
  cache: cache,
165
233
  parent: parent,
166
234
  columnIndex: 0,
167
235
  rowIndex: index
168
- }, function (_ref9) {
169
- var registerChild = _ref9.registerChild;
236
+ }, function (_ref1) {
237
+ var registerChild = _ref1.registerChild;
170
238
  return /*#__PURE__*/_react.default.createElement("div", {
171
239
  ref: function ref(element) {
172
240
  return registerChild === null || registerChild === void 0 ? void 0 : registerChild(element !== null && element !== void 0 ? element : undefined);
@@ -174,12 +242,21 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
174
242
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
175
243
  ,
176
244
  style: style
177
- }, rowContent);
245
+ }, /*#__PURE__*/_react.default.createElement(_compiled.Box, {
246
+ paddingBlockEnd: index === rows.length - 1 ? 'space.100' : undefined
247
+ }, rowContent));
178
248
  });
179
- }, [cache, editorView, isOffline, itemIndexByRowIndex, listId, menuOpenId, onClose, onItemHover, rows, selectedItemIndex, surfaceContext]);
249
+ }, [cache, editorView, isOffline, itemIndexByRowIndex, listId, menuOpenId, onClose, onItemFocus, onItemBlur, onItemHover, onItemLeave, rows, selectedItemIndex, surfaceContext]);
180
250
  var footerItemIndex = itemIndexByRowIndex.size;
181
251
  var footerItemId = "".concat(listId, "-").concat(footerItemIndex);
182
252
  var hasExternalControls = model.fallbackItems !== undefined && emptyStateHandler !== undefined;
253
+ var hasNoSearchResults = query !== '' && rows.length === 0;
254
+ var externalControls = hasExternalControls && emptyStateHandler ? emptyStateHandler({
255
+ mode: 'inline',
256
+ searchTerm: query,
257
+ showNoResultsMessage: false
258
+ }) : null;
259
+ var showFooterDivider = !hasNoSearchResults || Boolean(externalControls);
183
260
  var listMaxHeight = Math.max(0, maxHeight - MENU_SEARCH_HEIGHT - (model.footer ? MENU_FOOTER_HEIGHT : 0));
184
261
  var contentStyle = {
185
262
  maxHeight: Math.max(0, maxHeight - MENU_SEARCH_HEIGHT)
@@ -187,9 +264,13 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
187
264
  var onFooterItemHover = (0, _react.useCallback)(function () {
188
265
  return onItemHover(footerItemIndex);
189
266
  }, [footerItemIndex, onItemHover]);
267
+ var onFooterItemFocus = (0, _react.useCallback)(function () {
268
+ return onItemFocus(footerItemIndex);
269
+ }, [footerItemIndex, onItemFocus]);
190
270
  var footer = model.footer ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
191
- xcss: styles.footer,
192
- onFocus: onFooterItemHover,
271
+ testId: "registered-insert-menu-footer",
272
+ xcss: showFooterDivider ? styles.footerWithDivider : styles.footer,
273
+ onFocus: onFooterItemFocus,
193
274
  onMouseMove: onFooterItemHover
194
275
  }, /*#__PURE__*/_react.default.createElement(_RegisteredInsertMenuItem.RegisteredInsertMenuItem, {
195
276
  editorView: editorView,
@@ -204,11 +285,14 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
204
285
  if (!model.root) {
205
286
  return null;
206
287
  }
207
- return /*#__PURE__*/_react.default.createElement(Root, null, /*#__PURE__*/_react.default.createElement(_compiled.Box, {
288
+ return /*#__PURE__*/_react.default.createElement(Root, null, /*#__PURE__*/_react.default.createElement(_RegisteredInsertMenuItem.RegisteredInsertMenuPreviewContext.Provider, {
289
+ value: activePreviewItemKey
290
+ }, /*#__PURE__*/_react.default.createElement(_compiled.Box, {
208
291
  xcss: styles.content,
209
292
  style: contentStyle
210
293
  }, /*#__PURE__*/_react.default.createElement(_compiled.Box, {
211
- xcss: styles.scrollable
294
+ xcss: styles.scrollable,
295
+ onScroll: onScrollableContentScroll
212
296
  }, /*#__PURE__*/_react.default.createElement(_compiled.Box, {
213
297
  "aria-label": listLabel,
214
298
  "aria-owns": model.footer ? footerItemId : undefined,
@@ -230,9 +314,11 @@ var RegisteredInsertMenuList = exports.RegisteredInsertMenuList = function Regis
230
314
  scrollToAlignment: "auto",
231
315
  scrollToIndex: selectedRowIndex,
232
316
  width: LIST_WIDTH
233
- }))), hasExternalControls && /*#__PURE__*/_react.default.createElement(_compiled.Box, null, emptyStateHandler({
234
- mode: 'inline',
235
- searchTerm: query,
236
- showNoResultsMessage: false
237
- }))), footer));
317
+ }))), hasNoSearchResults && /*#__PURE__*/_react.default.createElement(_emptyState.QuickInsertEmptyState, {
318
+ mode: "inline",
319
+ spacing: "compact"
320
+ }), externalControls && /*#__PURE__*/_react.default.createElement(_compiled.Box, {
321
+ testId: "registered-insert-menu-external-controls",
322
+ xcss: styles.externalControls
323
+ }, externalControls)), footer)));
238
324
  };