@atlaskit/editor-plugin-quick-insert 29.0.4 → 30.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/quickInsertPlugin.js +10 -5
  3. package/dist/cjs/ui/QuickInsertRecommendedSlot.js +11 -8
  4. package/dist/cjs/ui/RegistryElementBrowser/RegistryElementBrowser.js +31 -7
  5. package/dist/cjs/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +13 -7
  6. package/dist/cjs/ui/RegistryElementBrowser/model.js +31 -18
  7. package/dist/cjs/ui/getQuickInsertComponents.js +28 -16
  8. package/dist/cjs/ui/getRecommendedComponents.js +2 -2
  9. package/dist/cjs/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  10. package/dist/cjs/ui/registered-menu/QuickInsertEmptyState.js +61 -0
  11. package/dist/cjs/ui/registered-menu/QuickInsertMenuRoot.js +220 -0
  12. package/dist/cjs/ui/registered-menu/QuickInsertMenuSection.js +23 -0
  13. package/dist/cjs/ui/registered-menu/QuickInsertSearchResultsSection.js +19 -0
  14. package/dist/cjs/ui/registered-menu/RegisteredQuickInsertMenuItem.js +42 -0
  15. package/dist/cjs/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  16. package/dist/cjs/ui/registered-menu/ToolbarQuickInsertMenu.js +128 -0
  17. package/dist/cjs/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  18. package/dist/cjs/ui/registered-menu/TypeAheadQuickInsertMenu.js +90 -0
  19. package/dist/cjs/ui/registered-menu/assets/no-results.js +36 -0
  20. package/dist/cjs/ui/registered-menu/get-quick-insert-menu-model.js +254 -0
  21. package/dist/cjs/ui/registered-menu/getQuickInsertMenuItemId.js +9 -0
  22. package/dist/cjs/ui/registered-menu/selectQuickInsertCategoryItems.js +27 -0
  23. package/dist/cjs/ui/registered-menu/useQuickInsertSearchAnalytics.js +100 -0
  24. package/dist/es2019/quickInsertPlugin.js +10 -5
  25. package/dist/es2019/ui/QuickInsertRecommendedSlot.js +10 -5
  26. package/dist/es2019/ui/RegistryElementBrowser/RegistryElementBrowser.js +19 -2
  27. package/dist/es2019/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +12 -7
  28. package/dist/es2019/ui/RegistryElementBrowser/model.js +27 -16
  29. package/dist/es2019/ui/getQuickInsertComponents.js +24 -10
  30. package/dist/es2019/ui/getRecommendedComponents.js +2 -2
  31. package/dist/es2019/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  32. package/dist/es2019/ui/registered-menu/QuickInsertEmptyState.js +47 -0
  33. package/dist/es2019/ui/registered-menu/QuickInsertMenuRoot.js +191 -0
  34. package/dist/es2019/ui/registered-menu/QuickInsertMenuSection.js +15 -0
  35. package/dist/es2019/ui/registered-menu/QuickInsertSearchResultsSection.js +14 -0
  36. package/dist/es2019/ui/registered-menu/RegisteredQuickInsertMenuItem.js +34 -0
  37. package/dist/es2019/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  38. package/dist/es2019/ui/registered-menu/ToolbarQuickInsertMenu.js +116 -0
  39. package/dist/es2019/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  40. package/dist/es2019/ui/registered-menu/TypeAheadQuickInsertMenu.js +78 -0
  41. package/dist/es2019/ui/registered-menu/assets/no-results.js +30 -0
  42. package/dist/es2019/ui/registered-menu/get-quick-insert-menu-model.js +191 -0
  43. package/dist/es2019/ui/registered-menu/getQuickInsertMenuItemId.js +1 -0
  44. package/dist/es2019/ui/registered-menu/selectQuickInsertCategoryItems.js +19 -0
  45. package/dist/es2019/ui/registered-menu/useQuickInsertSearchAnalytics.js +91 -0
  46. package/dist/esm/quickInsertPlugin.js +10 -5
  47. package/dist/esm/ui/QuickInsertRecommendedSlot.js +11 -8
  48. package/dist/esm/ui/RegistryElementBrowser/RegistryElementBrowser.js +30 -6
  49. package/dist/esm/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +12 -7
  50. package/dist/esm/ui/RegistryElementBrowser/model.js +31 -18
  51. package/dist/esm/ui/getQuickInsertComponents.js +27 -15
  52. package/dist/esm/ui/getRecommendedComponents.js +2 -2
  53. package/dist/esm/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  54. package/dist/esm/ui/registered-menu/QuickInsertEmptyState.js +50 -0
  55. package/dist/esm/ui/registered-menu/QuickInsertMenuRoot.js +211 -0
  56. package/dist/esm/ui/registered-menu/QuickInsertMenuSection.js +16 -0
  57. package/dist/esm/ui/registered-menu/QuickInsertSearchResultsSection.js +12 -0
  58. package/dist/esm/ui/registered-menu/RegisteredQuickInsertMenuItem.js +34 -0
  59. package/dist/esm/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  60. package/dist/esm/ui/registered-menu/ToolbarQuickInsertMenu.js +120 -0
  61. package/dist/esm/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  62. package/dist/esm/ui/registered-menu/TypeAheadQuickInsertMenu.js +82 -0
  63. package/dist/esm/ui/registered-menu/assets/no-results.js +29 -0
  64. package/dist/esm/ui/registered-menu/get-quick-insert-menu-model.js +247 -0
  65. package/dist/esm/ui/registered-menu/getQuickInsertMenuItemId.js +3 -0
  66. package/dist/esm/ui/registered-menu/selectQuickInsertCategoryItems.js +21 -0
  67. package/dist/esm/ui/registered-menu/useQuickInsertSearchAnalytics.js +93 -0
  68. package/dist/types/quickInsertPluginType.d.ts +1 -1
  69. package/dist/types/ui/QuickInsertRecommendedSlot.d.ts +3 -3
  70. package/dist/types/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.d.ts +5 -2
  71. package/dist/types/ui/RegistryElementBrowser/model.d.ts +3 -2
  72. package/dist/types/ui/getQuickInsertComponents.d.ts +8 -2
  73. package/dist/types/ui/registered-menu/QuickInsertEmptyState.d.ts +7 -0
  74. package/dist/types/ui/registered-menu/QuickInsertMenuRoot.d.ts +11 -0
  75. package/dist/types/ui/registered-menu/QuickInsertMenuSection.d.ts +4 -0
  76. package/dist/types/ui/registered-menu/QuickInsertSearchResultsSection.d.ts +2 -0
  77. package/dist/types/ui/registered-menu/RegisteredQuickInsertMenuItem.d.ts +3 -0
  78. package/dist/types/ui/registered-menu/ToolbarQuickInsertMenu.d.ts +28 -0
  79. package/dist/types/ui/registered-menu/TypeAheadQuickInsertMenu.d.ts +27 -0
  80. package/dist/types/ui/registered-menu/assets/no-results.d.ts +7 -0
  81. package/dist/types/ui/registered-menu/get-quick-insert-menu-model.d.ts +19 -0
  82. package/dist/types/ui/registered-menu/getQuickInsertMenuItemId.d.ts +1 -0
  83. package/dist/types/ui/registered-menu/selectQuickInsertCategoryItems.d.ts +7 -0
  84. package/dist/types/ui/registered-menu/useQuickInsertSearchAnalytics.d.ts +12 -0
  85. package/package.json +15 -12
  86. package/registered-menu/model/package.json +10 -0
  87. package/registered-menu/search-analytics/package.json +10 -0
@@ -0,0 +1,120 @@
1
+ /* ToolbarQuickInsertMenu.tsx generated by @compiled/babel-plugin v3.0.2 */
2
+ import "./ToolbarQuickInsertMenu.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { useCallback } from 'react';
5
+ import { RegisteredMenuList } from '@atlaskit/editor-common/registered-menu/list';
6
+ import { Box } from '@atlaskit/primitives/compiled/box';
7
+ import { getQuickInsertMenuItemId } from './getQuickInsertMenuItemId';
8
+ import { QuickInsertEmptyState } from './QuickInsertEmptyState';
9
+ var MENU_FOOTER_HEIGHT = 45;
10
+ var LIST_WIDTH = 350;
11
+ var styles = {
12
+ content: "_1e0c1txw _2lx21bp4 _1tkeidpf",
13
+ scrollable: "_16jlkb7n _1tkeidpf _18m91wug",
14
+ footer: "_1o9zidpf",
15
+ externalControls: "_1i531l7x _15a5nqa1 _uwhke4h9 _1q51u2gc _85i5u2gc",
16
+ footerDivider: "_1i531l7x _15a5nqa1 _uwhke4h9 _1o9zidpf"
17
+ };
18
+ export var ToolbarQuickInsertMenu = function ToolbarQuickInsertMenu(_ref) {
19
+ var Item = _ref.Item,
20
+ model = _ref.model,
21
+ emptyStateHandler = _ref.emptyStateHandler,
22
+ listLabel = _ref.listLabel,
23
+ activePreviewItemKey = _ref.activePreviewItemKey,
24
+ itemCount = _ref.itemCount,
25
+ listId = _ref.listId,
26
+ maxHeight = _ref.maxHeight,
27
+ rows = _ref.rows,
28
+ onItemBlur = _ref.onItemBlur,
29
+ onItemFocus = _ref.onItemFocus,
30
+ onItemHover = _ref.onItemHover,
31
+ onItemLeave = _ref.onItemLeave,
32
+ onItemVisibilityChange = _ref.onItemVisibilityChange,
33
+ onRenderedItemsChange = _ref.onRenderedItemsChange,
34
+ query = _ref.query,
35
+ selectedItemIndex = _ref.selectedItemIndex;
36
+ var footerItemIndex = itemCount - 1;
37
+ var footerItemId = getQuickInsertMenuItemId(listId, footerItemIndex);
38
+ var isEmptySearch = query !== '' && model.sections.length === 0;
39
+ var hasNoSearchResults = model.sections.length === 0 && model.fallbackItems.length === 0;
40
+ var externalControls = isEmptySearch ? emptyStateHandler === null || emptyStateHandler === void 0 ? void 0 : emptyStateHandler({
41
+ mode: 'inline',
42
+ searchTerm: query,
43
+ showNoResultsMessage: false
44
+ }) : null;
45
+ var onFooterItemFocus = useCallback(function () {
46
+ return onItemFocus(footerItemIndex);
47
+ }, [footerItemIndex, onItemFocus]);
48
+ var onFooterItemHover = useCallback(function () {
49
+ return onItemHover(footerItemIndex);
50
+ }, [footerItemIndex, onItemHover]);
51
+ var listMaxHeight = Math.max(0, maxHeight - (model.footer ? MENU_FOOTER_HEIGHT : 0));
52
+ var contentStyle = {
53
+ maxHeight: maxHeight
54
+ };
55
+ var getItemId = useCallback(function (_ref2) {
56
+ var itemIndex = _ref2.itemIndex;
57
+ return getQuickInsertMenuItemId(listId, itemIndex);
58
+ }, [listId]);
59
+ var onScrollableContentScroll = useCallback(function (event) {
60
+ if (event.target === event.currentTarget && activePreviewItemKey) {
61
+ onItemVisibilityChange(activePreviewItemKey, false);
62
+ }
63
+ }, [activePreviewItemKey, onItemVisibilityChange]);
64
+ if (!model.root) {
65
+ return null;
66
+ }
67
+ return /*#__PURE__*/React.createElement(Box, {
68
+ xcss: styles.content,
69
+ style: contentStyle
70
+ }, /*#__PURE__*/React.createElement(Box, {
71
+ xcss: styles.scrollable,
72
+ onScroll: onScrollableContentScroll
73
+ }, /*#__PURE__*/React.createElement(Box, {
74
+ "aria-label": listLabel,
75
+ "aria-owns": model.footer ? footerItemId : undefined,
76
+ id: listId,
77
+ role: "listbox"
78
+ }, rows.length > 0 && /*#__PURE__*/React.createElement(RegisteredMenuList, {
79
+ rows: rows,
80
+ Item: Item,
81
+ width: LIST_WIDTH,
82
+ maxHeight: listMaxHeight,
83
+ getItemId: getItemId,
84
+ activeItemKey: activePreviewItemKey,
85
+ selectedItemIndex: selectedItemIndex,
86
+ scrollResetKey: query,
87
+ onItemHover: onItemHover,
88
+ onItemFocus: onItemFocus,
89
+ onItemBlur: onItemBlur,
90
+ onItemLeave: onItemLeave,
91
+ onItemVisibilityChange: onItemVisibilityChange,
92
+ onRenderedItemsChange: onRenderedItemsChange,
93
+ role: "group",
94
+ tabIndex: null,
95
+ omitAriaReadonly: true,
96
+ lastRowPadding: "space.100",
97
+ scrollTo: "top-on-reset"
98
+ })), query !== '' && hasNoSearchResults && /*#__PURE__*/React.createElement(QuickInsertEmptyState, {
99
+ mode: "inline"
100
+ }), externalControls && /*#__PURE__*/React.createElement(Box, {
101
+ testId: "registered-insert-menu-external-controls",
102
+ xcss: styles.externalControls
103
+ }, externalControls)), model.footer && /*#__PURE__*/React.createElement(Box, {
104
+ xcss: styles.footer
105
+ }, /*#__PURE__*/React.createElement(Box, {
106
+ testId: "registered-insert-menu-footer",
107
+ xcss: styles.footer
108
+ }, !isEmptySearch || !hasNoSearchResults || Boolean(externalControls) ? /*#__PURE__*/React.createElement(Box, {
109
+ "aria-hidden": "true",
110
+ xcss: styles.footerDivider
111
+ }) : null, /*#__PURE__*/React.createElement(Box, {
112
+ onFocus: onFooterItemFocus,
113
+ onMouseMove: onFooterItemHover
114
+ }, /*#__PURE__*/React.createElement(Item, {
115
+ id: footerItemId,
116
+ isSelected: selectedItemIndex === footerItemIndex,
117
+ isActive: false,
118
+ registration: model.footer
119
+ })))));
120
+ };
@@ -0,0 +1,3 @@
1
+ ._15a5nqa1{border-top-style:solid}
2
+ ._1i531l7x{border-top-color:var(--ds-border,#0b120e24)}
3
+ ._uwhke4h9{border-top-width:var(--ds-border-width,1px)}
@@ -0,0 +1,82 @@
1
+ /* TypeAheadQuickInsertMenu.tsx generated by @compiled/babel-plugin v3.0.2 */
2
+ import "./TypeAheadQuickInsertMenu.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { useCallback } from 'react';
5
+ import { RegisteredMenuList } from '@atlaskit/editor-common/registered-menu/list';
6
+ import { Box } from '@atlaskit/primitives/compiled/box';
7
+ import { getQuickInsertMenuItemId } from './getQuickInsertMenuItemId';
8
+ import { QuickInsertEmptyState } from './QuickInsertEmptyState';
9
+ var LIST_WIDTH = 320;
10
+ var MENU_FOOTER_HEIGHT = 45;
11
+ var MENU_FOOTER_HEIGHT_WITH_SCROLL_PADDING = 51;
12
+ var styles = {
13
+ footer: "_1i531l7x _15a5nqa1 _uwhke4h9"
14
+ };
15
+ export var TypeAheadQuickInsertMenu = function TypeAheadQuickInsertMenu(_ref) {
16
+ var Item = _ref.Item,
17
+ rows = _ref.rows,
18
+ activeItemKey = _ref.activeItemKey,
19
+ itemCount = _ref.itemCount,
20
+ listId = _ref.listId,
21
+ listLabel = _ref.listLabel,
22
+ maxHeight = _ref.maxHeight,
23
+ model = _ref.model,
24
+ onItemFocus = _ref.onItemFocus,
25
+ onItemBlur = _ref.onItemBlur,
26
+ onItemHover = _ref.onItemHover,
27
+ onItemLeave = _ref.onItemLeave,
28
+ onItemVisibilityChange = _ref.onItemVisibilityChange,
29
+ onRenderedItemsChange = _ref.onRenderedItemsChange,
30
+ _ref$query = _ref.query,
31
+ query = _ref$query === void 0 ? '' : _ref$query,
32
+ selectedItemIndex = _ref.selectedItemIndex,
33
+ _ref$hasScrollPadding = _ref.hasScrollPadding,
34
+ hasScrollPadding = _ref$hasScrollPadding === void 0 ? false : _ref$hasScrollPadding;
35
+ var footerItemIndex = itemCount - 1;
36
+ var onFooterItemHover = useCallback(function () {
37
+ return onItemHover(footerItemIndex);
38
+ }, [footerItemIndex, onItemHover]);
39
+ var getItemId = useCallback(function (_ref2) {
40
+ var itemIndex = _ref2.itemIndex;
41
+ return getQuickInsertMenuItemId(listId, itemIndex);
42
+ }, [listId]);
43
+ if (!model.root) {
44
+ return null;
45
+ }
46
+ var listMaxHeight = Math.max(0, maxHeight - (model.footer ? hasScrollPadding ? MENU_FOOTER_HEIGHT_WITH_SCROLL_PADDING : MENU_FOOTER_HEIGHT : 0));
47
+ var hasListboxContent = rows.length > 0 || model.footer !== undefined;
48
+ return /*#__PURE__*/React.createElement(Box, {
49
+ "aria-label": hasListboxContent ? listLabel : undefined,
50
+ id: listId,
51
+ role: hasListboxContent ? 'listbox' : undefined
52
+ }, rows.length > 0 ? /*#__PURE__*/React.createElement(RegisteredMenuList, {
53
+ rows: rows,
54
+ Item: Item,
55
+ width: LIST_WIDTH,
56
+ maxHeight: listMaxHeight,
57
+ getItemId: getItemId,
58
+ activeItemKey: activeItemKey,
59
+ selectedItemIndex: selectedItemIndex,
60
+ scrollResetKey: query,
61
+ hasScrollPadding: hasScrollPadding,
62
+ scrollTo: "top-on-reset",
63
+ onItemFocus: onItemFocus,
64
+ onItemBlur: onItemBlur,
65
+ onItemHover: onItemHover,
66
+ onItemLeave: onItemLeave,
67
+ onItemVisibilityChange: onItemVisibilityChange,
68
+ onRenderedItemsChange: onRenderedItemsChange
69
+ }) : query !== '' && /*#__PURE__*/React.createElement(QuickInsertEmptyState, {
70
+ mode: "inline",
71
+ spacing: "spacious"
72
+ }), model.footer && /*#__PURE__*/React.createElement(Box, {
73
+ onMouseMove: onFooterItemHover,
74
+ paddingBlockEnd: hasScrollPadding ? 'space.075' : undefined,
75
+ xcss: styles.footer
76
+ }, /*#__PURE__*/React.createElement(Item, {
77
+ id: getQuickInsertMenuItemId(listId, footerItemIndex),
78
+ isSelected: selectedItemIndex === footerItemIndex,
79
+ isActive: false,
80
+ registration: model.footer
81
+ })));
82
+ };
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ export default function NoResultsIllustration(_ref) {
3
+ var height = _ref.height,
4
+ width = _ref.width;
5
+ return /*#__PURE__*/React.createElement("svg", {
6
+ width: width,
7
+ height: height,
8
+ viewBox: "0 0 57 63",
9
+ fill: "none",
10
+ xmlns: "http://www.w3.org/2000/svg",
11
+ "aria-hidden": "true",
12
+ focusable: "false"
13
+ }, /*#__PURE__*/React.createElement("path", {
14
+ fill: "#dddee1",
15
+ d: "M23.5 49.223c-5.196 0-10.166-1.955-14.442-5.814a30 30 0 0 1-3.545-3.85 29.6 29.6 0 0 1-2.868-4.456c-4.56-8.775-3.179-18.124 3.79-25.647a32.6 32.6 0 0 1 3.942-3.593 32 32 0 0 1 4.287-2.81c9.017-4.89 18.424-3.869 25.803 2.8a30.3 30.3 0 0 1 3.59 3.897 29.7 29.7 0 0 1 2.837 4.396C51.5 22.96 50.12 32.324 43.106 39.83a31.5 31.5 0 0 1-3.797 3.442 33 33 0 0 1-4.468 2.912c-3.777 2.03-7.62 3.036-11.341 3.036zm2.478-44.539c-2.957 0-6.02.824-9.082 2.489a28 28 0 0 0-3.658 2.396 27.5 27.5 0 0 0-3.37 3.07C4.24 18.711 3.15 25.92 6.798 32.941a25 25 0 0 0 2.42 3.75 25 25 0 0 0 2.981 3.24c5.866 5.299 13.119 6.054 20.427 2.13a27.4 27.4 0 0 0 3.818-2.492 27.5 27.5 0 0 0 3.24-2.936c5.658-6.054 6.741-13.27 3.06-20.318a25 25 0 0 0-2.39-3.698 25.3 25.3 0 0 0-3.021-3.289c-3.418-3.086-7.288-4.645-11.348-4.645z"
16
+ }), /*#__PURE__*/React.createElement("path", {
17
+ fill: "#dddee1",
18
+ d: "M42.822 42.291c-1.21-1.685-2.509-1.675-3.777-.694-1.19.92-1.507 2.164-.24 3.801l1.45 1.873 4.017-3.107z"
19
+ }), /*#__PURE__*/React.createElement("path", {
20
+ fill: "#dddee1",
21
+ d: "m45.28 43.385-6.03 4.663 11.332 14.657 6.03-4.663z"
22
+ }), /*#__PURE__*/React.createElement("path", {
23
+ fill: "#b7b9be",
24
+ d: "m44.31 44.134-4.091 3.163 3.843 4.97 4.091-3.163z"
25
+ }), /*#__PURE__*/React.createElement("path", {
26
+ fill: "#dddee1",
27
+ d: "M26.834 30.328h-3.42v-.217c-.116-2.432 1.264-5.066 3.227-6.143l.037-.02q.08-.042.154-.093c1.071-.69 1.68-1.88 1.643-3.189-.037-1.298-.707-2.439-1.791-3.052a4.5 4.5 0 0 0-2.21-.592c-2.315 0-4.198 1.897-4.198 4.229h-3.42c0-4.23 3.417-7.672 7.618-7.672a7.9 7.9 0 0 1 3.884 1.033c2.14 1.211 3.462 3.437 3.534 5.955.073 2.53-1.125 4.84-3.203 6.18q-.211.139-.424.251c-.815.458-1.497 1.868-1.434 2.97zM24.795 32.303a3.4 3.4 0 0 1 1.096-.004c1.115.183 2.021.965 2.241 2.182l.002.01.002.009a3.4 3.4 0 0 1-.002 1.103v.004c-.216 1.23-1.136 2.009-2.247 2.19a3.417 3.417 0 0 1-1.085-.003c-1.117-.18-2.027-.961-2.249-2.179l-.002-.01-.001-.01a3.3 3.3 0 0 1 0-1.095l.002-.01.001-.01c.223-1.223 1.137-1.992 2.24-2.177z"
28
+ }));
29
+ }
@@ -0,0 +1,247 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
6
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
7
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8
+ import { ASK_ROVO_MENU_ITEM, MENU, SEARCH_RESULTS_SECTION } from '@atlaskit/editor-common/quick-insert/keys';
9
+ import { applyRegisteredItemRanks } from '@atlaskit/editor-common/registered-menu/item-rank';
10
+ import { isMenuFooterSectionKey } from '@atlaskit/editor-common/type-ahead-is-menu-footer-section-key';
11
+ import { isSectionOverflowItemKey } from '@atlaskit/editor-common/type-ahead-is-section-overflow-item-key';
12
+ import { getComponentIdentity, resolveSurface, willComponentRender } from '@atlaskit/editor-ui-control-model/surface-renderer';
13
+ import { QuickInsertSearchResultsSection } from './QuickInsertSearchResultsSection';
14
+ var SEARCH_TOP_MATCH_LIMIT = 5;
15
+ var SEARCH_RESULTS_HEADING = {
16
+ key: SEARCH_RESULTS_SECTION.key,
17
+ type: SEARCH_RESULTS_SECTION.type,
18
+ component: QuickInsertSearchResultsSection,
19
+ parents: [{
20
+ key: MENU.key,
21
+ type: MENU.type,
22
+ rank: 0
23
+ }]
24
+ };
25
+ var getParentRank = function getParentRank(component, parentKey) {
26
+ var _component$parents$fi, _component$parents;
27
+ return (_component$parents$fi = (_component$parents = component.parents) === null || _component$parents === void 0 || (_component$parents = _component$parents.find(function (parent) {
28
+ return parent.key === parentKey;
29
+ })) === null || _component$parents === void 0 ? void 0 : _component$parents.rank) !== null && _component$parents$fi !== void 0 ? _component$parents$fi : Number.MAX_SAFE_INTEGER;
30
+ };
31
+ var compareMatchedItems = function compareMatchedItems(a, b) {
32
+ return a.sectionRank - b.sectionRank || a.score - b.score || a.itemRank - b.itemRank || a.sourceIndex - b.sourceIndex || a.identity.localeCompare(b.identity);
33
+ };
34
+ var compareSearchResults = function compareSearchResults(a, b) {
35
+ return a.score - b.score || a.sectionRank - b.sectionRank || a.itemRank - b.itemRank || a.sourceIndex - b.sourceIndex || a.identity.localeCompare(b.identity);
36
+ };
37
+ var comparePrioritizedSearchResults = function comparePrioritizedSearchResults(a, b) {
38
+ var _b$priorityGroup, _a$priorityGroup;
39
+ return ((_b$priorityGroup = b.priorityGroup) !== null && _b$priorityGroup !== void 0 ? _b$priorityGroup : 0) - ((_a$priorityGroup = a.priorityGroup) !== null && _a$priorityGroup !== void 0 ? _a$priorityGroup : 0) || compareSearchResults(a, b);
40
+ };
41
+ var getSearchResults = function getSearchResults(matches) {
42
+ var topMatches = Array.from(matches).sort(compareSearchResults).slice(0, SEARCH_TOP_MATCH_LIMIT);
43
+ var topMatchIdentities = new Set(topMatches.map(function (_ref) {
44
+ var identity = _ref.identity;
45
+ return identity;
46
+ }));
47
+ var tailMatches = matches.filter(function (_ref2) {
48
+ var identity = _ref2.identity;
49
+ return !topMatchIdentities.has(identity);
50
+ });
51
+ return [].concat(_toConsumableArray(topMatches), _toConsumableArray(tailMatches)).map(function (_ref3) {
52
+ var item = _ref3.item;
53
+ return item;
54
+ });
55
+ };
56
+ var getRenderedMenuItems = function getRenderedMenuItems(section, childrenMap, surfaceContext) {
57
+ var _childrenMap$get;
58
+ return ((_childrenMap$get = childrenMap.get(getComponentIdentity(section))) !== null && _childrenMap$get !== void 0 ? _childrenMap$get : []).filter(function (child) {
59
+ return child.type === 'menu-item' && willComponentRender(child, childrenMap, surfaceContext);
60
+ });
61
+ };
62
+ var buildBrowseSections = function buildBrowseSections(_ref4) {
63
+ var childrenMap = _ref4.childrenMap,
64
+ contentSections = _ref4.contentSections,
65
+ selectCategoryItems = _ref4.selectCategoryItems,
66
+ surfaceContext = _ref4.surfaceContext;
67
+ var sections = [];
68
+ var _iterator = _createForOfIteratorHelper(contentSections),
69
+ _step;
70
+ try {
71
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
72
+ var section = _step.value;
73
+ var children = getRenderedMenuItems(section, childrenMap, surfaceContext);
74
+ var overflowItems = children.filter(function (child) {
75
+ return isSectionOverflowItemKey(child.key);
76
+ });
77
+ var viewMoreItem = overflowItems[overflowItems.length - 1];
78
+ var items = children.filter(function (child) {
79
+ return !isSectionOverflowItemKey(child.key);
80
+ });
81
+ if (items.length === 0) {
82
+ continue;
83
+ }
84
+ var selectedItems = viewMoreItem !== undefined && selectCategoryItems !== undefined ? selectCategoryItems(items) : items;
85
+ if (selectedItems.length < items.length && viewMoreItem !== undefined) {
86
+ sections.push([section].concat(_toConsumableArray(selectedItems), [viewMoreItem]));
87
+ } else {
88
+ sections.push([section].concat(_toConsumableArray(selectedItems)));
89
+ }
90
+ }
91
+ } catch (err) {
92
+ _iterator.e(err);
93
+ } finally {
94
+ _iterator.f();
95
+ }
96
+ return {
97
+ fallbackItems: [],
98
+ sections: sections
99
+ };
100
+ };
101
+ var buildSearchSections = function buildSearchSections(_ref5) {
102
+ var childrenMap = _ref5.childrenMap,
103
+ components = _ref5.components,
104
+ contentSections = _ref5.contentSections,
105
+ formatMessage = _ref5.formatMessage,
106
+ query = _ref5.query,
107
+ root = _ref5.root,
108
+ surfaceContext = _ref5.surfaceContext;
109
+ var matches = new Map();
110
+ var sourceIndexByComponent = new Map(components.map(function (component, index) {
111
+ return [component, index];
112
+ }));
113
+ var _iterator2 = _createForOfIteratorHelper(contentSections),
114
+ _step2;
115
+ try {
116
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
117
+ var section = _step2.value;
118
+ var _iterator3 = _createForOfIteratorHelper(getRenderedMenuItems(section, childrenMap, surfaceContext)),
119
+ _step3;
120
+ try {
121
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
122
+ var _item$match, _match$score, _sourceIndexByCompone;
123
+ var item = _step3.value;
124
+ if (isSectionOverflowItemKey(item.key)) {
125
+ continue;
126
+ }
127
+ var match = (_item$match = item.match) === null || _item$match === void 0 ? void 0 : _item$match.call(item, {
128
+ formatMessage: formatMessage,
129
+ itemKey: item.key,
130
+ query: query
131
+ });
132
+ if (item.match && match === null) {
133
+ continue;
134
+ }
135
+ var candidate = {
136
+ identity: "".concat(item.type, ":").concat(item.key),
137
+ item: item,
138
+ itemRank: getParentRank(item, section.key),
139
+ priorityGroup: (match === null || match === void 0 ? void 0 : match.priorityGroup) !== undefined && Number.isFinite(match.priorityGroup) ? match.priorityGroup : undefined,
140
+ score: Math.min(1, Math.max(0, (_match$score = match === null || match === void 0 ? void 0 : match.score) !== null && _match$score !== void 0 ? _match$score : 0)),
141
+ sourceIndex: (_sourceIndexByCompone = sourceIndexByComponent.get(item)) !== null && _sourceIndexByCompone !== void 0 ? _sourceIndexByCompone : Number.MAX_SAFE_INTEGER,
142
+ sectionRank: getParentRank(section, root.key)
143
+ };
144
+ var existing = matches.get(candidate.identity);
145
+ if (!existing || compareMatchedItems(candidate, existing) < 0) {
146
+ matches.set(candidate.identity, candidate);
147
+ }
148
+ }
149
+ } catch (err) {
150
+ _iterator3.e(err);
151
+ } finally {
152
+ _iterator3.f();
153
+ }
154
+ }
155
+ } catch (err) {
156
+ _iterator2.e(err);
157
+ } finally {
158
+ _iterator2.f();
159
+ }
160
+ var uniqueMatches = Array.from(matches.values()).sort(compareMatchedItems);
161
+ var prioritizedMatches = uniqueMatches.filter(function (_ref6) {
162
+ var priorityGroup = _ref6.priorityGroup;
163
+ return priorityGroup !== undefined;
164
+ });
165
+ var unprioritizedMatches = uniqueMatches.filter(function (_ref7) {
166
+ var priorityGroup = _ref7.priorityGroup;
167
+ return priorityGroup === undefined;
168
+ });
169
+ var orderedSearchResults = [].concat(_toConsumableArray(prioritizedMatches.sort(comparePrioritizedSearchResults).map(function (_ref8) {
170
+ var item = _ref8.item;
171
+ return item;
172
+ })), _toConsumableArray(getSearchResults(unprioritizedMatches)));
173
+ if (orderedSearchResults.length > 0) {
174
+ return {
175
+ fallbackItems: [],
176
+ sections: [[SEARCH_RESULTS_HEADING].concat(_toConsumableArray(orderedSearchResults))]
177
+ };
178
+ }
179
+ var fallbackItem = contentSections.flatMap(function (section) {
180
+ var _childrenMap$get2;
181
+ return (_childrenMap$get2 = childrenMap.get(getComponentIdentity(section))) !== null && _childrenMap$get2 !== void 0 ? _childrenMap$get2 : [];
182
+ }).find(function (component) {
183
+ return component.type === ASK_ROVO_MENU_ITEM.type && component.key === ASK_ROVO_MENU_ITEM.key && willComponentRender(component, childrenMap, surfaceContext);
184
+ });
185
+ return {
186
+ fallbackItems: fallbackItem ? [fallbackItem] : [],
187
+ sections: []
188
+ };
189
+ };
190
+
191
+ /**
192
+ * Builds the registered quick-insert menu model. An empty query browses every
193
+ * category; a non-empty query returns ranked matches. The footer is shared by both.
194
+ */
195
+ export var getQuickInsertMenuModel = function getQuickInsertMenuModel(_ref9) {
196
+ var components = _ref9.components,
197
+ formatMessage = _ref9.formatMessage,
198
+ getItemRank = _ref9.getItemRank,
199
+ query = _ref9.query,
200
+ rootComponent = _ref9.rootComponent,
201
+ selectCategoryItems = _ref9.selectCategoryItems,
202
+ surfaceContext = _ref9.surfaceContext;
203
+ var rankedComponents = applyRegisteredItemRanks(components, getItemRank);
204
+ var _resolveSurface = resolveSurface(rankedComponents, rootComponent),
205
+ childrenMap = _resolveSurface.childrenMap,
206
+ root = _resolveSurface.root,
207
+ _resolveSurface$topLe = _resolveSurface.topLevelChildren,
208
+ topLevelChildren = _resolveSurface$topLe === void 0 ? [] : _resolveSurface$topLe;
209
+ if (!root || !willComponentRender(root, childrenMap, surfaceContext)) {
210
+ return {
211
+ fallbackItems: [],
212
+ footer: undefined,
213
+ root: undefined,
214
+ sections: []
215
+ };
216
+ }
217
+ var renderedSections = topLevelChildren.filter(function (section) {
218
+ return section.type === 'menu-section' && willComponentRender(section, childrenMap, surfaceContext);
219
+ });
220
+ var footerSection = renderedSections.find(function (_ref0) {
221
+ var key = _ref0.key;
222
+ return isMenuFooterSectionKey(key);
223
+ });
224
+ var contentSections = renderedSections.filter(function (_ref1) {
225
+ var key = _ref1.key;
226
+ return !isMenuFooterSectionKey(key);
227
+ });
228
+ var content = query === '' ? buildBrowseSections({
229
+ childrenMap: childrenMap,
230
+ contentSections: contentSections,
231
+ selectCategoryItems: selectCategoryItems,
232
+ surfaceContext: surfaceContext
233
+ }) : buildSearchSections({
234
+ childrenMap: childrenMap,
235
+ components: rankedComponents,
236
+ contentSections: contentSections,
237
+ formatMessage: formatMessage,
238
+ query: query,
239
+ root: root,
240
+ surfaceContext: surfaceContext
241
+ });
242
+ var footer = footerSection ? getRenderedMenuItems(footerSection, childrenMap, surfaceContext)[0] : undefined;
243
+ return _objectSpread(_objectSpread({}, content), {}, {
244
+ footer: footer,
245
+ root: root
246
+ });
247
+ };
@@ -0,0 +1,3 @@
1
+ export var getQuickInsertMenuItemId = function getQuickInsertMenuItemId(listId, itemIndex) {
2
+ return "".concat(listId, "-").concat(itemIndex);
3
+ };
@@ -0,0 +1,21 @@
1
+ import { quickInsertProviderMenuItemKey } from '@atlaskit/editor-common/quick-insert/get-provider-menu-item-key';
2
+ var DEFAULT_ITEM_LIMIT = 30;
3
+ var ECOSYSTEM_ITEM_LIMIT = 10;
4
+ var isEcosystemQuickInsertItem = function isEcosystemQuickInsertItem(item) {
5
+ return quickInsertProviderMenuItemKey.isEcosystem(item.key);
6
+ };
7
+
8
+ /**
9
+ * Keeps the initial native and ecosystem results while ensuring ecosystem registrations
10
+ * remain discoverable beyond the default category item limit.
11
+ */
12
+ export var selectQuickInsertCategoryItems = function selectQuickInsertCategoryItems(items) {
13
+ var ecosystemItemCount = 0;
14
+ return items.filter(function (item, index) {
15
+ var isEcosystemItem = isEcosystemQuickInsertItem(item);
16
+ if (isEcosystemItem) {
17
+ ecosystemItemCount++;
18
+ }
19
+ return index < DEFAULT_ITEM_LIMIT || isEcosystemItem && ecosystemItemCount <= ECOSYSTEM_ITEM_LIMIT;
20
+ });
21
+ };
@@ -0,0 +1,93 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ import { useCallback, useEffect, useRef } from 'react';
5
+ import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics/types/enums';
6
+ var SEARCH_DEBOUNCE_MS = 1000;
7
+ export var useQuickInsertSearchAnalytics = function useQuickInsertSearchAnalytics(_ref) {
8
+ var query = _ref.query,
9
+ resultCount = _ref.resultCount,
10
+ surface = _ref.surface,
11
+ category = _ref.category,
12
+ _ref$isOpen = _ref.isOpen,
13
+ isOpen = _ref$isOpen === void 0 ? true : _ref$isOpen,
14
+ fireAnalyticsEvent = _ref.fireAnalyticsEvent;
15
+ var latestOptions = useRef({
16
+ query: query,
17
+ resultCount: resultCount,
18
+ surface: surface,
19
+ category: category,
20
+ fireAnalyticsEvent: fireAnalyticsEvent
21
+ });
22
+ latestOptions.current = {
23
+ query: query,
24
+ resultCount: resultCount,
25
+ surface: surface,
26
+ category: category,
27
+ fireAnalyticsEvent: fireAnalyticsEvent
28
+ };
29
+ var pendingSearch = useRef(null);
30
+ var effectVersion = useRef(0);
31
+ var flush = useCallback(function () {
32
+ var pending = pendingSearch.current;
33
+ if (!pending) {
34
+ return;
35
+ }
36
+ clearTimeout(pending.timer);
37
+ pendingSearch.current = null;
38
+ var current = latestOptions.current;
39
+ if (current.query.trim() !== pending.query || !current.fireAnalyticsEvent) {
40
+ return;
41
+ }
42
+ var attributes = _objectSpread(_objectSpread({}, current.surface === 'element-browser' && current.category !== undefined ? {
43
+ category: current.category
44
+ } : {}), {}, {
45
+ isEmpty: current.resultCount === 0,
46
+ queryLength: current.query.trim().length,
47
+ resultCount: current.resultCount,
48
+ surface: current.surface
49
+ });
50
+ var payload = {
51
+ action: ACTION.SEARCHED,
52
+ actionSubject: ACTION_SUBJECT.QUICK_INSERT,
53
+ eventType: EVENT_TYPE.TRACK,
54
+ attributes: attributes
55
+ };
56
+ current.fireAnalyticsEvent(payload);
57
+ }, []);
58
+ useEffect(function () {
59
+ var currentVersion = ++effectVersion.current;
60
+ if (!isOpen) {
61
+ flush();
62
+ return;
63
+ }
64
+ var trimmedQuery = query.trim();
65
+ if (!trimmedQuery) {
66
+ if (pendingSearch.current) {
67
+ clearTimeout(pendingSearch.current.timer);
68
+ pendingSearch.current = null;
69
+ }
70
+ return;
71
+ }
72
+ if (pendingSearch.current) {
73
+ clearTimeout(pendingSearch.current.timer);
74
+ }
75
+ var timer = setTimeout(flush, SEARCH_DEBOUNCE_MS);
76
+ pendingSearch.current = {
77
+ query: trimmedQuery,
78
+ timer: timer
79
+ };
80
+ return function () {
81
+ if (pendingSearch.current) {
82
+ clearTimeout(pendingSearch.current.timer);
83
+ }
84
+ Promise.resolve().then(function () {
85
+ // oxlint-disable-next-line react-hooks/exhaustive-deps -- The live effect version distinguishes dependency cleanup from a real unmount.
86
+ if (effectVersion.current === currentVersion) {
87
+ flush();
88
+ }
89
+ });
90
+ };
91
+ }, [query, surface, category, isOpen, flush]);
92
+ return flush;
93
+ };
@@ -1,7 +1,7 @@
1
1
  import type { INPUT_METHOD } from '@atlaskit/editor-common/analytics/types/enums';
2
2
  import type { QuickInsertItem } from '@atlaskit/editor-common/provider-factory/quick-insert-provider';
3
3
  import type { IsRecommendedItem } from '@atlaskit/editor-common/quick-insert/is-recommended-item';
4
- import type { RegisteredItemRankResolver } from '@atlaskit/editor-common/type-ahead/item-rank';
4
+ import type { RegisteredItemRankResolver } from '@atlaskit/editor-common/registered-menu/item-rank';
5
5
  import type { Command } from '@atlaskit/editor-common/types/command';
6
6
  import type { EditorCommand } from '@atlaskit/editor-common/types/editor-command';
7
7
  import type { NextEditorPlugin, OptionalPlugin } from '@atlaskit/editor-common/types/next-editor-plugin';
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import type { RegisterMenuItem, SurfaceContext } from '@atlaskit/editor-ui-control-model/types';
3
- type Props = Record<string, unknown> & {
2
+ import type { CommonComponentProps, RegisterMenuItem, SurfaceContext } from '@atlaskit/editor-ui-control-model/types';
3
+ type Props = CommonComponentProps & {
4
4
  getSnapshot: (surfaceContext?: SurfaceContext) => RegisterMenuItem[];
5
5
  index: number;
6
6
  };
7
- export declare const QuickInsertRecommendedSlot: ({ index, getSnapshot, ...props }: Props) => React.ReactNode;
7
+ export declare const QuickInsertRecommendedSlot: ({ children, parents, surfaceContext, index, getSnapshot, }: Props) => React.ReactNode;
8
8
  export {};
@@ -6,6 +6,7 @@ import React from 'react';
6
6
  import type { QuickInsertSelectionHandler } from '@atlaskit/editor-common/quick-insert/context';
7
7
  import type { EmptyStateHandler } from '@atlaskit/editor-common/types/empty-state-handler';
8
8
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
9
+ import type { SurfaceContext } from '@atlaskit/editor-ui-control-model/types';
9
10
  import type { RegistryElementBrowserItem } from './model';
10
11
  type Props = {
11
12
  editorView: EditorView;
@@ -20,13 +21,15 @@ type Props = {
20
21
  resultsId: string;
21
22
  section?: string;
22
23
  selectedKey?: string;
24
+ surfaceContext: SurfaceContext;
23
25
  };
24
- declare const RegistryElementBrowserItem: ({ editorView, isOffline, isSelected, item, onSelect, }: {
26
+ declare const RegistryElementBrowserItem: ({ editorView, isOffline, isSelected, item, onSelect, surfaceContext, }: {
25
27
  editorView: EditorView;
26
28
  isOffline: boolean;
27
29
  isSelected: boolean;
28
30
  item: RegistryElementBrowserItem;
29
31
  onSelect: (key: string, handler: QuickInsertSelectionHandler) => void;
32
+ surfaceContext: SurfaceContext;
30
33
  }) => React.JSX.Element | null;
31
- export declare const RegistryElementBrowserSearchResults: ({ editorView, emptyStateHandler, fallbackItems, isLoading, isOffline, items, query, resultsId, section, selectedKey, onKeyDown, onSelect, }: Props) => React.JSX.Element;
34
+ export declare const RegistryElementBrowserSearchResults: ({ editorView, emptyStateHandler, fallbackItems, isLoading, isOffline, items, query, resultsId, section, selectedKey, surfaceContext, onKeyDown, onSelect, }: Props) => React.JSX.Element;
32
35
  export {};