@atlaskit/editor-plugin-type-ahead 2.0.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlaskit/editor-plugin-type-ahead
2
2
 
3
+ ## 2.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#120472](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/120472)
8
+ [`73c800ab5f2fc`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/73c800ab5f2fc) -
9
+ ED-26766 update adf-schema from 47.2.1 to 47.6.0 and adf-schema-json from 1.27.0 to 1.31.0
10
+
11
+ ### Patch Changes
12
+
13
+ - [#121073](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/121073)
14
+ [`9c197731fcbf8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/9c197731fcbf8) -
15
+ [ux] [ED-26824] When platform_editor_controls is enabled, add 'View more' button to quick
16
+ insertpopup to open element browser modal
17
+ - Updated dependencies
18
+
19
+ ## 2.0.5
20
+
21
+ ### Patch Changes
22
+
23
+ - [#121049](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/121049)
24
+ [`0c8ca53dace33`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0c8ca53dace33) -
25
+ [ux] Uses ViewAllButtonItem from the editor-element-browser package instead of custom Pressable
26
+ button
27
+
3
28
  ## 2.0.4
4
29
 
5
30
  ### Patch Changes
@@ -12,8 +12,10 @@ var _react2 = require("@emotion/react");
12
12
  var _reactIntlNext = require("react-intl-next");
13
13
  var _CellMeasurer = require("react-virtualized/dist/commonjs/CellMeasurer");
14
14
  var _List = require("react-virtualized/dist/commonjs/List");
15
+ var _messages = require("@atlaskit/editor-common/messages");
15
16
  var _typeAhead = require("@atlaskit/editor-common/type-ahead");
16
17
  var _menu = require("@atlaskit/menu");
18
+ var _primitives = require("@atlaskit/primitives");
17
19
  var _updateSelectedIndex = require("../pm-plugins/commands/update-selected-index");
18
20
  var _constants = require("../pm-plugins/constants");
19
21
  var _utils = require("../pm-plugins/utils");
@@ -60,7 +62,8 @@ var TypeAheadListComponent = /*#__PURE__*/_react.default.memo(function (_ref2) {
60
62
  decorationElement = _ref2.decorationElement,
61
63
  triggerHandler = _ref2.triggerHandler,
62
64
  moreElementsInQuickInsertViewEnabled = _ref2.moreElementsInQuickInsertViewEnabled,
63
- api = _ref2.api;
65
+ api = _ref2.api,
66
+ showViewMore = _ref2.showViewMore;
64
67
  var listRef = (0, _react.useRef)();
65
68
  var listContainerRef = (0, _react.useRef)(null);
66
69
  var lastVisibleIndexes = (0, _react.useRef)({
@@ -287,13 +290,21 @@ var TypeAheadListComponent = /*#__PURE__*/_react.default.memo(function (_ref2) {
287
290
  return null;
288
291
  }
289
292
  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;
290
- return (0, _react2.jsx)(_menu.MenuGroup, {
291
- "aria-label": popupAriaLabel,
292
- "aria-relevant": "additions removals"
293
- }, (0, _react2.jsx)("div", {
294
- id: menuGroupId,
295
- ref: listContainerRef
296
- }, (0, _react2.jsx)(_List.List, {
293
+ var EmptyResultView = (0, _react2.jsx)(_primitives.Box, {
294
+ paddingBlock: "space.150",
295
+ paddingInline: "space.250"
296
+ }, (0, _react2.jsx)(_primitives.Text, {
297
+ align: "center",
298
+ as: "p"
299
+ }, intl.formatMessage(_typeAhead.typeAheadListMessages.emptySearchResults)), (0, _react2.jsx)(_primitives.Text, {
300
+ align: "center",
301
+ as: "p"
302
+ }, intl.formatMessage(_typeAhead.typeAheadListMessages.emptySearchResultsSuggestion, {
303
+ buttonName: (0, _react2.jsx)(_primitives.Text, {
304
+ weight: "medium"
305
+ }, intl.formatMessage(_messages.toolbarInsertBlockMessages.viewMore))
306
+ })));
307
+ var ListContent = (0, _react2.jsx)(_List.List, {
297
308
  rowRenderer: renderRow,
298
309
  ref: listRef,
299
310
  rowCount: items.length,
@@ -323,7 +334,14 @@ var TypeAheadListComponent = /*#__PURE__*/_react.default.memo(function (_ref2) {
323
334
  }
324
335
  }
325
336
  }), moreElementsInQuickInsertViewEnabled && list]
326
- }), (0, _react2.jsx)(TypeaheadAssistiveTextPureComponent, {
337
+ });
338
+ return (0, _react2.jsx)(_menu.MenuGroup, {
339
+ "aria-label": popupAriaLabel,
340
+ "aria-relevant": "additions removals"
341
+ }, (0, _react2.jsx)("div", {
342
+ id: menuGroupId,
343
+ ref: listContainerRef
344
+ }, !showViewMore || items.length ? ListContent : EmptyResultView, (0, _react2.jsx)(TypeaheadAssistiveTextPureComponent, {
327
345
  numberOfResults: items.length.toString()
328
346
  })));
329
347
  });
@@ -8,6 +8,7 @@ exports.TypeAheadMenu = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _react = _interopRequireDefault(require("react"));
10
10
  var _typeAhead = require("@atlaskit/editor-common/type-ahead");
11
+ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
11
12
  var _updateSelectedIndex = require("../pm-plugins/commands/update-selected-index");
12
13
  var _useItemInsert3 = require("./hooks/use-item-insert");
13
14
  var _TypeAheadPopup = require("./TypeAheadPopup");
@@ -77,7 +78,11 @@ var TypeAheadMenu = exports.TypeAheadMenu = /*#__PURE__*/_react.default.memo(fun
77
78
  return;
78
79
  }
79
80
  }, [isOpen, query, onItemMatch]);
80
- if (!isOpen || !triggerHandler || !(decorationElement instanceof HTMLElement) || items.length === 0 && !errorInfo) {
81
+
82
+ // @ts-ignore
83
+ var openElementBrowserModal = triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.openElementBrowserModal;
84
+ var showViewMore = (triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.id) === _typeAhead.TypeAheadAvailableNodes.QUICK_INSERT && !!openElementBrowserModal && (0, _experiments.editorExperiment)('platform_editor_controls', 'variant1');
85
+ if (!isOpen || !triggerHandler || !(decorationElement instanceof HTMLElement) || !showViewMore && items.length === 0 && !errorInfo) {
81
86
  return null;
82
87
  }
83
88
  return /*#__PURE__*/_react.default.createElement(_TypeAheadPopup.TypeAheadPopup, {
@@ -95,6 +100,7 @@ var TypeAheadMenu = exports.TypeAheadMenu = /*#__PURE__*/_react.default.memo(fun
95
100
  decorationSet: decorationSet,
96
101
  isEmptyQuery: !query,
97
102
  cancel: cancel,
98
- api: api
103
+ api: api,
104
+ showViewMore: showViewMore
99
105
  });
100
106
  });
@@ -20,6 +20,7 @@ var _colors = require("@atlaskit/theme/colors");
20
20
  var _constants = require("../pm-plugins/constants");
21
21
  var _TypeAheadErrorFallback = require("./TypeAheadErrorFallback");
22
22
  var _TypeAheadList = require("./TypeAheadList");
23
+ var _ViewMore = require("./ViewMore");
23
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
26
  /**
@@ -30,6 +31,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
30
31
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
31
32
 
32
33
  var DEFAULT_TYPEAHEAD_MENU_HEIGHT = 380;
34
+ var VIEWMORE_BUTTON_HEIGHT = 53;
33
35
  var DEFAULT_TYPEAHEAD_MENU_HEIGHT_NEW = 480;
34
36
  var ITEM_PADDING = 12;
35
37
  var typeAheadContent = (0, _react2.css)({
@@ -46,6 +48,10 @@ var typeAheadContent = (0, _react2.css)({
46
48
  var typeAheadContentOverride = (0, _react2.css)({
47
49
  maxHeight: "".concat(DEFAULT_TYPEAHEAD_MENU_HEIGHT_NEW, "px")
48
50
  });
51
+ var typeAheadWrapperWithViewMoreOverride = (0, _react2.css)({
52
+ display: 'flex',
53
+ flexDirection: 'column'
54
+ });
49
55
  var Highlight = function Highlight(_ref) {
50
56
  var state = _ref.state,
51
57
  triggerHandler = _ref.triggerHandler;
@@ -68,7 +74,8 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
68
74
  onItemInsert = props.onItemInsert,
69
75
  isEmptyQuery = props.isEmptyQuery,
70
76
  cancel = props.cancel,
71
- api = props.api;
77
+ api = props.api,
78
+ showViewMore = props.showViewMore;
72
79
  var ref = (0, _react.useRef)(null);
73
80
  var _useSharedPluginState = (0, _hooks.useSharedPluginState)(api, ['featureFlags']),
74
81
  featureFlagsState = _useSharedPluginState.featureFlagsState;
@@ -130,6 +137,12 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
130
137
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
131
138
  fitHeight = _useState2[0],
132
139
  setFitHeight = _useState2[1];
140
+ var fitHeightWithViewMore = (0, _react.useMemo)(function () {
141
+ if (showViewMore) {
142
+ return fitHeight - VIEWMORE_BUTTON_HEIGHT;
143
+ }
144
+ return fitHeight;
145
+ }, [fitHeight, showViewMore]);
133
146
  var getFitHeight = (0, _react.useCallback)(function () {
134
147
  if (!anchorElement || !popupsMountPoint) {
135
148
  return;
@@ -269,6 +282,19 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
269
282
  element === null || element === void 0 || element.removeEventListener('keydown', escape);
270
283
  };
271
284
  }, [ref, cancel]);
285
+
286
+ // @ts-ignore
287
+ var openElementBrowserModal = triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.openElementBrowserModal;
288
+ var onViewMoreClick = (0, _react.useCallback)(function () {
289
+ // TODO: when clean up, remove config in quick insert plugin
290
+ // platform/packages/editor/editor-plugin-quick-insert/src/quickInsertPlugin.tsx (typeAhead.openElementBrowserModal)
291
+ openElementBrowserModal === null || openElementBrowserModal === void 0 || openElementBrowserModal();
292
+ cancel({
293
+ addPrefixTrigger: false,
294
+ setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED,
295
+ forceFocusOnEditor: false
296
+ });
297
+ }, [openElementBrowserModal, cancel]);
272
298
  return (0, _react2.jsx)(_ui.Popup, {
273
299
  zIndex: _editorSharedStyles.akEditorFloatingDialogZIndex,
274
300
  target: anchorElement,
@@ -281,7 +307,7 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
281
307
  ariaLabel: null,
282
308
  preventOverflow: true
283
309
  }, (0, _react2.jsx)("div", {
284
- css: [typeAheadContent, moreElementsInQuickInsertViewEnabled && typeAheadContentOverride]
310
+ css: [typeAheadContent, moreElementsInQuickInsertViewEnabled && typeAheadContentOverride, showViewMore && typeAheadWrapperWithViewMoreOverride]
285
311
  // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
286
312
  ,
287
313
  tabIndex: 0
@@ -296,12 +322,15 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
296
322
  items: items,
297
323
  selectedIndex: selectedIndex,
298
324
  onItemClick: onItemInsert,
299
- fitHeight: fitHeight,
325
+ fitHeight: fitHeightWithViewMore,
300
326
  editorView: editorView,
301
327
  decorationElement: anchorElement,
302
328
  triggerHandler: triggerHandler,
303
329
  moreElementsInQuickInsertViewEnabled: moreElementsInQuickInsertViewEnabled,
304
- api: api
330
+ api: api,
331
+ showViewMore: showViewMore
332
+ }), showViewMore && (0, _react2.jsx)(_ViewMore.ViewMore, {
333
+ onClick: onViewMoreClick
305
334
  }))));
306
335
  });
307
336
  TypeAheadPopup.displayName = 'TypeAheadPopup';
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ViewMore = void 0;
8
+ var _react = require("@emotion/react");
9
+ var _reactIntlNext = require("react-intl-next");
10
+ var _messages = require("@atlaskit/editor-common/messages");
11
+ var _showMoreHorizontalEditorMore = _interopRequireDefault(require("@atlaskit/icon/core/migration/show-more-horizontal--editor-more"));
12
+ var _menu = require("@atlaskit/menu");
13
+ var _colors = require("@atlaskit/theme/colors");
14
+ /**
15
+ * @jsxRuntime classic
16
+ * @jsx jsx
17
+ */
18
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
19
+
20
+ var buttonStyles = (0, _react.css)({
21
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
22
+ '& > button:hover': {
23
+ backgroundColor: "var(--ds-background-neutral-subtle-hovered, ".concat(_colors.N30, ")")
24
+ }
25
+ });
26
+ var ViewMore = exports.ViewMore = function ViewMore(_ref) {
27
+ var onClick = _ref.onClick;
28
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
29
+ formatMessage = _useIntl.formatMessage;
30
+ return (0, _react.jsx)(_menu.Section, {
31
+ hasSeparator: true
32
+ }, (0, _react.jsx)("span", {
33
+ css: buttonStyles
34
+ }, (0, _react.jsx)(_menu.ButtonItem, {
35
+ onClick: onClick,
36
+ iconBefore: (0, _react.jsx)(_showMoreHorizontalEditorMore.default, {
37
+ label: ""
38
+ }),
39
+ "aria-describedby": formatMessage(_messages.toolbarInsertBlockMessages.viewMore),
40
+ "data-testid": "quick-insert-view-more-elements-item"
41
+ }, formatMessage(_messages.toolbarInsertBlockMessages.viewMore))));
42
+ };
@@ -10,17 +10,20 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _react2 = require("@emotion/react");
12
12
  var _rafSchd = _interopRequireDefault(require("raf-schd"));
13
+ var _reactIntlNext = require("react-intl-next");
13
14
  var _analytics = require("@atlaskit/editor-common/analytics");
15
+ var _messages = require("@atlaskit/editor-common/messages");
14
16
  var _ui = require("@atlaskit/editor-common/ui");
15
17
  var _editorElementBrowser = require("@atlaskit/editor-element-browser");
16
18
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
19
+ var _add = _interopRequireDefault(require("@atlaskit/icon/core/add"));
17
20
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
21
  var _colors = require("@atlaskit/theme/colors");
19
22
  var _constants = require("../../pm-plugins/constants");
20
23
  var _TypeAheadErrorFallback = require("../TypeAheadErrorFallback");
21
- var _ViewAllButton = require("./ViewAllButton");
22
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
23
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
26
+ /* eslint-disable @atlaskit/ui-styling-standard/use-compiled */
24
27
  /**
25
28
  * @jsxRuntime classic
26
29
  * @jsx jsx
@@ -32,6 +35,7 @@ var DEFAULT_TYPEAHEAD_MENU_HEIGHT = 520;
32
35
  // const DEFAULT_TYPEAHEAD_MENU_HEIGHT_NEW = 480;
33
36
 
34
37
  var ITEM_PADDING = 12;
38
+ var INSERT_PANEL_WIDTH = 320;
35
39
  var typeAheadContent = (0, _react2.css)({
36
40
  background: "var(--ds-surface-overlay, ".concat(_colors.N0, ")"),
37
41
  borderRadius: "var(--ds-border-radius, 3px)",
@@ -63,6 +67,8 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
63
67
  query = props.query,
64
68
  setSelectedItem = props.setSelectedItem;
65
69
  var ref = (0, _react.useRef)(null);
70
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
71
+ formatMessage = _useIntl.formatMessage;
66
72
  var defaultMenuHeight = DEFAULT_TYPEAHEAD_MENU_HEIGHT;
67
73
  var startTime = (0, _react.useMemo)(function () {
68
74
  return performance.now();
@@ -264,13 +270,39 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
264
270
  element === null || element === void 0 || element.removeEventListener('keydown', escape);
265
271
  };
266
272
  }, [ref, cancel]);
267
- var handlePanelOpen = (0, _react.useCallback)(function () {
268
- return cancel({
273
+ var handleViewAllItemsClick = (0, _react.useCallback)(function () {
274
+ var _api$contextPanel;
275
+ var showContextPanel = api === null || api === void 0 || (_api$contextPanel = api.contextPanel) === null || _api$contextPanel === void 0 || (_api$contextPanel = _api$contextPanel.actions) === null || _api$contextPanel === void 0 ? void 0 : _api$contextPanel.showPanel;
276
+ if (!showContextPanel || !items) {
277
+ return;
278
+ }
279
+
280
+ // Opens main editor controls side panel
281
+ showContextPanel({
282
+ id: 'editor-element-insert-sidebar-panel',
283
+ headerComponentElements: {
284
+ headerLabel: _messages.elementInsertSidePanel.title,
285
+ HeaderIcon: function HeaderIcon() {
286
+ return (0, _react2.jsx)(_add.default, {
287
+ label: formatMessage(_messages.elementInsertSidePanel.title)
288
+ });
289
+ }
290
+ },
291
+ BodyComponent: function BodyComponent() {
292
+ return (0, _react2.jsx)(_editorElementBrowser.SideInsertPanel, {
293
+ items: items,
294
+ onItemInsert: onItemInsert
295
+ });
296
+ }
297
+ }, 'push', INSERT_PANEL_WIDTH);
298
+
299
+ // Closes typeahead
300
+ cancel({
269
301
  addPrefixTrigger: true,
270
302
  setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED,
271
303
  forceFocusOnEditor: true
272
304
  });
273
- }, [cancel]);
305
+ }, [api, cancel, formatMessage, items, onItemInsert]);
274
306
  return (0, _react2.jsx)(_ui.Popup, {
275
307
  zIndex: _editorSharedStyles.akEditorFloatingDialogZIndex,
276
308
  target: anchorElement,
@@ -295,12 +327,8 @@ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(f
295
327
  items: items,
296
328
  onItemInsert: onItemInsert,
297
329
  query: query,
298
- setSelectedItem: setSelectedItem
299
- }), (api === null || api === void 0 ? void 0 : api.contextPanel) && (0, _react2.jsx)(_ViewAllButton.ViewAllButton, {
300
- items: items,
301
- editorApi: api,
302
- onItemInsert: onItemInsert,
303
- onPanelOpen: handlePanelOpen
330
+ setSelectedItem: setSelectedItem,
331
+ onViewAllItemsClick: Boolean(api === null || api === void 0 ? void 0 : api.contextPanel) ? handleViewAllItemsClick : undefined
304
332
  }))));
305
333
  });
306
334
  TypeAheadPopup.displayName = 'TypeAheadPopup';
@@ -10,8 +10,10 @@ import { css, jsx } from '@emotion/react';
10
10
  import { injectIntl, useIntl } from 'react-intl-next';
11
11
  import { CellMeasurer, CellMeasurerCache } from 'react-virtualized/dist/commonjs/CellMeasurer';
12
12
  import { List } from 'react-virtualized/dist/commonjs/List';
13
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
13
14
  import { SelectItemMode, typeAheadListMessages } from '@atlaskit/editor-common/type-ahead';
14
15
  import { MenuGroup } from '@atlaskit/menu';
16
+ import { Text, Box } from '@atlaskit/primitives';
15
17
  import { updateSelectedIndex } from '../pm-plugins/commands/update-selected-index';
16
18
  import { TYPE_AHEAD_DECORATION_ELEMENT_ID } from '../pm-plugins/constants';
17
19
  import { getTypeAheadListAriaLabels, moveSelectedIndex } from '../pm-plugins/utils';
@@ -49,7 +51,8 @@ const TypeAheadListComponent = /*#__PURE__*/React.memo(({
49
51
  decorationElement,
50
52
  triggerHandler,
51
53
  moreElementsInQuickInsertViewEnabled,
52
- api
54
+ api,
55
+ showViewMore
53
56
  }) => {
54
57
  var _decorationElement$qu2;
55
58
  const listRef = useRef();
@@ -266,13 +269,21 @@ const TypeAheadListComponent = /*#__PURE__*/React.memo(({
266
269
  return null;
267
270
  }
268
271
  const menuGroupId = ((_decorationElement$qu2 = decorationElement.querySelector(`[role='combobox']`)) === null || _decorationElement$qu2 === void 0 ? void 0 : _decorationElement$qu2.getAttribute('aria-controls')) || TYPE_AHEAD_DECORATION_ELEMENT_ID;
269
- return jsx(MenuGroup, {
270
- "aria-label": popupAriaLabel,
271
- "aria-relevant": "additions removals"
272
- }, jsx("div", {
273
- id: menuGroupId,
274
- ref: listContainerRef
275
- }, jsx(List, {
272
+ const EmptyResultView = jsx(Box, {
273
+ paddingBlock: "space.150",
274
+ paddingInline: "space.250"
275
+ }, jsx(Text, {
276
+ align: "center",
277
+ as: "p"
278
+ }, intl.formatMessage(typeAheadListMessages.emptySearchResults)), jsx(Text, {
279
+ align: "center",
280
+ as: "p"
281
+ }, intl.formatMessage(typeAheadListMessages.emptySearchResultsSuggestion, {
282
+ buttonName: jsx(Text, {
283
+ weight: "medium"
284
+ }, intl.formatMessage(messages.viewMore))
285
+ })));
286
+ const ListContent = jsx(List, {
276
287
  rowRenderer: renderRow,
277
288
  ref: listRef,
278
289
  rowCount: items.length,
@@ -302,7 +313,14 @@ const TypeAheadListComponent = /*#__PURE__*/React.memo(({
302
313
  }
303
314
  }
304
315
  }), moreElementsInQuickInsertViewEnabled && list]
305
- }), jsx(TypeaheadAssistiveTextPureComponent, {
316
+ });
317
+ return jsx(MenuGroup, {
318
+ "aria-label": popupAriaLabel,
319
+ "aria-relevant": "additions removals"
320
+ }, jsx("div", {
321
+ id: menuGroupId,
322
+ ref: listContainerRef
323
+ }, !showViewMore || items.length ? ListContent : EmptyResultView, jsx(TypeaheadAssistiveTextPureComponent, {
306
324
  numberOfResults: items.length.toString()
307
325
  })));
308
326
  });
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { SelectItemMode } from '@atlaskit/editor-common/type-ahead';
2
+ import { SelectItemMode, TypeAheadAvailableNodes } from '@atlaskit/editor-common/type-ahead';
3
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
3
4
  import { updateSelectedIndex } from '../pm-plugins/commands/update-selected-index';
4
5
  import { useItemInsert } from './hooks/use-item-insert';
5
6
  import { TypeAheadPopup } from './TypeAheadPopup';
@@ -68,7 +69,11 @@ export const TypeAheadMenu = /*#__PURE__*/React.memo(({
68
69
  return;
69
70
  }
70
71
  }, [isOpen, query, onItemMatch]);
71
- if (!isOpen || !triggerHandler || !(decorationElement instanceof HTMLElement) || items.length === 0 && !errorInfo) {
72
+
73
+ // @ts-ignore
74
+ const openElementBrowserModal = triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.openElementBrowserModal;
75
+ const showViewMore = (triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.id) === TypeAheadAvailableNodes.QUICK_INSERT && !!openElementBrowserModal && editorExperiment('platform_editor_controls', 'variant1');
76
+ if (!isOpen || !triggerHandler || !(decorationElement instanceof HTMLElement) || !showViewMore && items.length === 0 && !errorInfo) {
72
77
  return null;
73
78
  }
74
79
  return /*#__PURE__*/React.createElement(TypeAheadPopup, {
@@ -86,6 +91,7 @@ export const TypeAheadMenu = /*#__PURE__*/React.memo(({
86
91
  decorationSet: decorationSet,
87
92
  isEmptyQuery: !query,
88
93
  cancel: cancel,
89
- api: api
94
+ api: api,
95
+ showViewMore: showViewMore
90
96
  });
91
97
  });
@@ -17,7 +17,9 @@ import { N0, N50A, N60A } from '@atlaskit/theme/colors';
17
17
  import { CloseSelectionOptions, TYPE_AHEAD_DECORATION_DATA_ATTRIBUTE, TYPE_AHEAD_POPUP_CONTENT_CLASS } from '../pm-plugins/constants';
18
18
  import { TypeAheadErrorFallback } from './TypeAheadErrorFallback';
19
19
  import { TypeAheadList } from './TypeAheadList';
20
+ import { ViewMore } from './ViewMore';
20
21
  const DEFAULT_TYPEAHEAD_MENU_HEIGHT = 380;
22
+ const VIEWMORE_BUTTON_HEIGHT = 53;
21
23
  const DEFAULT_TYPEAHEAD_MENU_HEIGHT_NEW = 480;
22
24
  const ITEM_PADDING = 12;
23
25
  const typeAheadContent = css({
@@ -34,6 +36,10 @@ const typeAheadContent = css({
34
36
  const typeAheadContentOverride = css({
35
37
  maxHeight: `${DEFAULT_TYPEAHEAD_MENU_HEIGHT_NEW}px`
36
38
  });
39
+ const typeAheadWrapperWithViewMoreOverride = css({
40
+ display: 'flex',
41
+ flexDirection: 'column'
42
+ });
37
43
  const Highlight = ({
38
44
  state,
39
45
  triggerHandler
@@ -58,7 +64,8 @@ export const TypeAheadPopup = /*#__PURE__*/React.memo(props => {
58
64
  onItemInsert,
59
65
  isEmptyQuery,
60
66
  cancel,
61
- api
67
+ api,
68
+ showViewMore
62
69
  } = props;
63
70
  const ref = useRef(null);
64
71
  const {
@@ -115,6 +122,12 @@ export const TypeAheadPopup = /*#__PURE__*/React.memo(props => {
115
122
  // eslint-disable-next-line react-hooks/exhaustive-deps
116
123
  triggerHandler]);
117
124
  const [fitHeight, setFitHeight] = useState(defaultMenuHeight);
125
+ const fitHeightWithViewMore = useMemo(() => {
126
+ if (showViewMore) {
127
+ return fitHeight - VIEWMORE_BUTTON_HEIGHT;
128
+ }
129
+ return fitHeight;
130
+ }, [fitHeight, showViewMore]);
118
131
  const getFitHeight = useCallback(() => {
119
132
  if (!anchorElement || !popupsMountPoint) {
120
133
  return;
@@ -262,6 +275,19 @@ export const TypeAheadPopup = /*#__PURE__*/React.memo(props => {
262
275
  element === null || element === void 0 ? void 0 : element.removeEventListener('keydown', escape);
263
276
  };
264
277
  }, [ref, cancel]);
278
+
279
+ // @ts-ignore
280
+ const openElementBrowserModal = triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.openElementBrowserModal;
281
+ const onViewMoreClick = useCallback(() => {
282
+ // TODO: when clean up, remove config in quick insert plugin
283
+ // platform/packages/editor/editor-plugin-quick-insert/src/quickInsertPlugin.tsx (typeAhead.openElementBrowserModal)
284
+ openElementBrowserModal === null || openElementBrowserModal === void 0 ? void 0 : openElementBrowserModal();
285
+ cancel({
286
+ addPrefixTrigger: false,
287
+ setSelectionAt: CloseSelectionOptions.AFTER_TEXT_INSERTED,
288
+ forceFocusOnEditor: false
289
+ });
290
+ }, [openElementBrowserModal, cancel]);
265
291
  return jsx(Popup, {
266
292
  zIndex: akEditorFloatingDialogZIndex,
267
293
  target: anchorElement,
@@ -274,7 +300,7 @@ export const TypeAheadPopup = /*#__PURE__*/React.memo(props => {
274
300
  ariaLabel: null,
275
301
  preventOverflow: true
276
302
  }, jsx("div", {
277
- css: [typeAheadContent, moreElementsInQuickInsertViewEnabled && typeAheadContentOverride]
303
+ css: [typeAheadContent, moreElementsInQuickInsertViewEnabled && typeAheadContentOverride, showViewMore && typeAheadWrapperWithViewMoreOverride]
278
304
  // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
279
305
  ,
280
306
  tabIndex: 0
@@ -289,12 +315,15 @@ export const TypeAheadPopup = /*#__PURE__*/React.memo(props => {
289
315
  items: items,
290
316
  selectedIndex: selectedIndex,
291
317
  onItemClick: onItemInsert,
292
- fitHeight: fitHeight,
318
+ fitHeight: fitHeightWithViewMore,
293
319
  editorView: editorView,
294
320
  decorationElement: anchorElement,
295
321
  triggerHandler: triggerHandler,
296
322
  moreElementsInQuickInsertViewEnabled: moreElementsInQuickInsertViewEnabled,
297
- api: api
323
+ api: api,
324
+ showViewMore: showViewMore
325
+ }), showViewMore && jsx(ViewMore, {
326
+ onClick: onViewMoreClick
298
327
  }))));
299
328
  });
300
329
  TypeAheadPopup.displayName = 'TypeAheadPopup';
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @jsxRuntime classic
3
+ * @jsx jsx
4
+ */
5
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
6
+ import { css, jsx } from '@emotion/react';
7
+ import { useIntl } from 'react-intl-next';
8
+ import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
9
+ import ShowMoreHorizontalIcon from '@atlaskit/icon/core/migration/show-more-horizontal--editor-more';
10
+ import { ButtonItem, Section } from '@atlaskit/menu';
11
+ import { N30 } from '@atlaskit/theme/colors';
12
+ const buttonStyles = css({
13
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
14
+ '& > button:hover': {
15
+ backgroundColor: `var(--ds-background-neutral-subtle-hovered, ${N30})`
16
+ }
17
+ });
18
+ export const ViewMore = ({
19
+ onClick
20
+ }) => {
21
+ const {
22
+ formatMessage
23
+ } = useIntl();
24
+ return jsx(Section, {
25
+ hasSeparator: true
26
+ }, jsx("span", {
27
+ css: buttonStyles
28
+ }, jsx(ButtonItem, {
29
+ onClick: onClick,
30
+ iconBefore: jsx(ShowMoreHorizontalIcon, {
31
+ label: ""
32
+ }),
33
+ "aria-describedby": formatMessage(messages.viewMore),
34
+ "data-testid": "quick-insert-view-more-elements-item"
35
+ }, formatMessage(messages.viewMore))));
36
+ };