@atlaskit/editor-plugin-insert-block 1.12.0 → 1.14.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.
Files changed (30) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cjs/plugin.js +36 -5
  3. package/dist/cjs/ui/ElementBrowser/InsertMenu.js +47 -13
  4. package/dist/cjs/ui/ElementRail/index.js +186 -2
  5. package/dist/cjs/ui/ElementRail/useInsertMenuRailItems.js +63 -0
  6. package/dist/cjs/ui/templateOptions.js +128 -57
  7. package/dist/cjs/ui/templates.js +1130 -0
  8. package/dist/es2019/plugin.js +36 -5
  9. package/dist/es2019/ui/ElementBrowser/InsertMenu.js +61 -26
  10. package/dist/es2019/ui/ElementRail/index.js +189 -1
  11. package/dist/es2019/ui/ElementRail/useInsertMenuRailItems.js +54 -0
  12. package/dist/es2019/ui/templateOptions.js +78 -11
  13. package/dist/es2019/ui/templates.js +1118 -0
  14. package/dist/esm/plugin.js +36 -5
  15. package/dist/esm/ui/ElementBrowser/InsertMenu.js +47 -13
  16. package/dist/esm/ui/ElementRail/index.js +185 -2
  17. package/dist/esm/ui/ElementRail/useInsertMenuRailItems.js +56 -0
  18. package/dist/esm/ui/templateOptions.js +128 -57
  19. package/dist/esm/ui/templates.js +1124 -0
  20. package/dist/types/ui/ElementRail/index.d.ts +7 -4
  21. package/dist/types/ui/ElementRail/useInsertMenuRailItems.d.ts +4 -0
  22. package/dist/types/ui/ToolbarInsertBlock/create-items.d.ts +1 -1
  23. package/dist/types/ui/templateOptions.d.ts +3 -1
  24. package/dist/types/ui/templates.d.ts +522 -0
  25. package/dist/types-ts4.5/ui/ElementRail/index.d.ts +7 -4
  26. package/dist/types-ts4.5/ui/ElementRail/useInsertMenuRailItems.d.ts +4 -0
  27. package/dist/types-ts4.5/ui/ToolbarInsertBlock/create-items.d.ts +1 -1
  28. package/dist/types-ts4.5/ui/templateOptions.d.ts +3 -1
  29. package/dist/types-ts4.5/ui/templates.d.ts +522 -0
  30. package/package.json +14 -6
@@ -4,9 +4,11 @@ import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
4
4
  import { contentAllowedInCodeBlock, shouldSplitSelectedNodeOnNodeInsertion } from '@atlaskit/editor-common/insert';
5
5
  import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
6
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
7
+ import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
7
8
  import { ToolbarSize } from '@atlaskit/editor-common/types';
8
9
  import { getWrappingOptions } from '@atlaskit/editor-common/utils';
9
10
  import { BLOCK_QUOTE, CODE_BLOCK, PANEL } from '@atlaskit/editor-plugin-block-type/consts';
11
+ import { fg } from '@atlaskit/platform-feature-flags';
10
12
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
11
13
  import SwitchIcon from './assets/switch';
12
14
  import { elementBrowserPmKey, elementBrowserPmPlugin } from './pm-plugins/elementBrowser';
@@ -55,6 +57,9 @@ export var insertBlockPlugin = function insertBlockPlugin(_ref) {
55
57
  var toggleDropdownMenuOptionsRef = {
56
58
  current: null
57
59
  };
60
+ var editorViewRef = {
61
+ current: null
62
+ };
58
63
  var registerToggleDropdownMenuOptions = function registerToggleDropdownMenuOptions(cb) {
59
64
  toggleDropdownMenuOptionsRef.current = cb;
60
65
  return function () {
@@ -122,6 +127,17 @@ export var insertBlockPlugin = function insertBlockPlugin(_ref) {
122
127
  plugin: function plugin() {
123
128
  return elementBrowserPmPlugin();
124
129
  }
130
+ }, {
131
+ name: 'elementBrowserEditorViewRef',
132
+ plugin: function plugin() {
133
+ return new SafePlugin({
134
+ view: function view(editorView) {
135
+ // Workaround - need reference to editorView for contextPanel component
136
+ editorViewRef.current = editorView;
137
+ return {};
138
+ }
139
+ });
140
+ }
125
141
  }];
126
142
  },
127
143
  pluginsOptions: {
@@ -187,10 +203,13 @@ export var insertBlockPlugin = function insertBlockPlugin(_ref) {
187
203
  // If we decide to ship the feature, we will consider a separate plugin if needed.
188
204
  // Experiment one-pager: https://hello.atlassian.net/wiki/spaces/ETM/pages/3983684902/Experiment+Drive+element+usage+via+element+templates
189
205
  quickInsert: function quickInsert() {
190
- if (editorExperiment('element-level-templates', true, {
206
+ var _options$UNSAFE_edito;
207
+ if (
208
+ // @ts-ignore
209
+ ['full-page', 'full-width'].includes((_options$UNSAFE_edito = options.UNSAFE_editorAppearance) !== null && _options$UNSAFE_edito !== void 0 ? _options$UNSAFE_edito : '') && editorExperiment('element-level-templates', true, {
191
210
  exposure: true
192
211
  })) {
193
- return templateOptions;
212
+ return templateOptions(api);
194
213
  }
195
214
  return [];
196
215
  }
@@ -209,8 +228,10 @@ export var insertBlockPlugin = function insertBlockPlugin(_ref) {
209
228
  // api.getSharedState() will have an outdated reference to editorState on first mount of this component
210
229
  // so instead just rely on plugin key as we don't need to be reactive to changes here
211
230
  var pluginState = elementBrowserPmKey.getState(state);
212
- if (pluginState !== null && pluginState !== void 0 && pluginState.menuBrowserOpen) {
231
+ if (pluginState !== null && pluginState !== void 0 && pluginState.menuBrowserOpen && editorViewRef.current) {
213
232
  return /*#__PURE__*/React.createElement(InsertMenuRail, {
233
+ editorView: editorViewRef.current,
234
+ options: options,
214
235
  api: api
215
236
  });
216
237
  }
@@ -246,6 +267,16 @@ function ToolbarInsertBlockWithInjectionApi(_ref3) {
246
267
  mediaState = _useSharedPluginState.mediaState,
247
268
  typeAheadState = _useSharedPluginState.typeAheadState,
248
269
  placeholderTextState = _useSharedPluginState.placeholderTextState;
270
+ var getEmojiProvider = function getEmojiProvider() {
271
+ if (fg('platform_editor_get_emoji_provider_from_config')) {
272
+ if (emojiState !== null && emojiState !== void 0 && emojiState.emojiProvider) {
273
+ return Promise.resolve(emojiState === null || emojiState === void 0 ? void 0 : emojiState.emojiProvider);
274
+ }
275
+ } else {
276
+ return providers.emojiProvider;
277
+ }
278
+ };
279
+ var emojiProvider = getEmojiProvider();
249
280
  return /*#__PURE__*/React.createElement(ToolbarInsertBlock, {
250
281
  pluginInjectionApi: pluginInjectionApi,
251
282
  buttons: buttons,
@@ -272,8 +303,8 @@ function ToolbarInsertBlockWithInjectionApi(_ref3) {
272
303
  availableWrapperBlockTypes: blockTypeState && blockTypeState.availableWrapperBlockTypes,
273
304
  linkSupported: !!hyperlinkState,
274
305
  linkDisabled: !hyperlinkState || !hyperlinkState.canInsertLink || !!hyperlinkState.activeLinkMark,
275
- emojiDisabled: !emojiState || !providers.emojiProvider,
276
- emojiProvider: providers.emojiProvider,
306
+ emojiDisabled: !emojiState || !emojiProvider,
307
+ emojiProvider: emojiProvider,
277
308
  nativeStatusSupported: options.nativeStatusSupported,
278
309
  horizontalRuleEnabled: options.horizontalRuleEnabled,
279
310
  onInsertBlockType: handleInsertBlockType(pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$c = pluginInjectionApi.codeBlock) === null || _pluginInjectionApi$c === void 0 ? void 0 : _pluginInjectionApi$c.actions.insertCodeBlock, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$p = pluginInjectionApi.panel) === null || _pluginInjectionApi$p === void 0 ? void 0 : _pluginInjectionApi$p.actions.insertPanel, pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$b = pluginInjectionApi.blockType) === null || _pluginInjectionApi$b === void 0 ? void 0 : _pluginInjectionApi$b.actions.insertBlockQuote),
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
5
  var _excluded = ["children"];
5
6
  /**
@@ -19,8 +20,9 @@ import { withReactEditorViewOuterListeners as withOuterListeners } from '@atlask
19
20
  // eslint-disable-next-line @atlassian/tangerine/import/entry-points
20
21
  import { borderRadius } from '@atlaskit/theme';
21
22
  import { N0, N30A, N60A } from '@atlaskit/theme/colors';
23
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
22
24
  var InsertMenu = function InsertMenu(_ref) {
23
- var _pluginInjectionApi$q6, _pluginInjectionApi$q7;
25
+ var _pluginInjectionApi$q7, _pluginInjectionApi$q8;
24
26
  var editorView = _ref.editorView,
25
27
  dropdownItems = _ref.dropdownItems,
26
28
  showElementBrowserLink = _ref.showElementBrowserLink,
@@ -58,12 +60,19 @@ var InsertMenu = function InsertMenu(_ref) {
58
60
  var quickInsertDropdownItems = dropdownItems.map(transform);
59
61
  var viewMoreItem = showElementBrowserLink ? quickInsertDropdownItems.pop() : undefined;
60
62
  var onInsertItem = useCallback(function (item) {
61
- var _pluginInjectionApi$q;
62
63
  toggleVisiblity();
63
64
  if (!editorView.hasFocus()) {
64
65
  editorView.focus();
65
66
  }
66
- pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q === void 0 || _pluginInjectionApi$q.actions.insertItem(item, INPUT_METHOD.TOOLBAR)(editorView.state, editorView.dispatch);
67
+ if (editorExperiment('insert-menu-in-right-rail', true)) {
68
+ var _pluginInjectionApi$q;
69
+ pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q === void 0 || _pluginInjectionApi$q.actions.insertItem(item,
70
+ // @ts-expect-error
71
+ INPUT_METHOD.INSERT_MENU_RIGHT_RAIL)(editorView.state, editorView.dispatch);
72
+ } else {
73
+ var _pluginInjectionApi$q2;
74
+ pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q2 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q2 === void 0 || _pluginInjectionApi$q2.actions.insertItem(item, INPUT_METHOD.TOOLBAR)(editorView.state, editorView.dispatch);
75
+ }
67
76
  }, [editorView, toggleVisiblity, pluginInjectionApi]);
68
77
  var getItems = useCallback(function (query, category) {
69
78
  var result;
@@ -74,23 +83,35 @@ var InsertMenu = function InsertMenu(_ref) {
74
83
  * @see above transform function for more details.
75
84
  */
76
85
  if (query) {
77
- var _pluginInjectionApi$q2, _pluginInjectionApi$q3;
78
- result = (_pluginInjectionApi$q2 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q3 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q3 === void 0 ? void 0 : _pluginInjectionApi$q3.actions.getSuggestions({
86
+ var _pluginInjectionApi$q3, _pluginInjectionApi$q4;
87
+ result = (_pluginInjectionApi$q3 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q4 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q4 === void 0 ? void 0 : _pluginInjectionApi$q4.actions.getSuggestions({
79
88
  query: query,
80
89
  category: category
81
- })) !== null && _pluginInjectionApi$q2 !== void 0 ? _pluginInjectionApi$q2 : [];
90
+ })) !== null && _pluginInjectionApi$q3 !== void 0 ? _pluginInjectionApi$q3 : [];
82
91
  } else {
83
- var _pluginInjectionApi$q4, _pluginInjectionApi$q5;
84
- var featuredQuickInsertSuggestions = (_pluginInjectionApi$q4 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q5 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q5 === void 0 ? void 0 : _pluginInjectionApi$q5.actions.getSuggestions({
92
+ var _pluginInjectionApi$q5, _pluginInjectionApi$q6;
93
+ var featuredQuickInsertSuggestions = (_pluginInjectionApi$q5 = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q6 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q6 === void 0 ? void 0 : _pluginInjectionApi$q6.actions.getSuggestions({
85
94
  category: category,
86
- featuredItems: true
87
- })) !== null && _pluginInjectionApi$q4 !== void 0 ? _pluginInjectionApi$q4 : [];
88
- result = quickInsertDropdownItems.concat(featuredQuickInsertSuggestions);
95
+ featuredItems: true,
96
+ // @ts-ignore
97
+ templateItems: editorExperiment('element-level-templates', true)
98
+ })) !== null && _pluginInjectionApi$q5 !== void 0 ? _pluginInjectionApi$q5 : [];
99
+ if (editorExperiment('element-level-templates', true)) {
100
+ // Make sure template options appear as top 5 items
101
+ featuredQuickInsertSuggestions.sort(function (a, b) {
102
+ var _b$priority, _a$priority;
103
+ return ((_b$priority = b.priority) !== null && _b$priority !== void 0 ? _b$priority : 0) - ((_a$priority = a.priority) !== null && _a$priority !== void 0 ? _a$priority : 0);
104
+ });
105
+ var templateItems = featuredQuickInsertSuggestions.splice(0, 5);
106
+ result = [].concat(_toConsumableArray(templateItems), _toConsumableArray(quickInsertDropdownItems), _toConsumableArray(featuredQuickInsertSuggestions));
107
+ } else {
108
+ result = quickInsertDropdownItems.concat(featuredQuickInsertSuggestions);
109
+ }
89
110
  }
90
111
  setItemCount(result.length);
91
112
  return result;
92
- }, [pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q6 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q6 === void 0 ? void 0 : _pluginInjectionApi$q6.actions, quickInsertDropdownItems]);
93
- var emptyStateHandler = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q7 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q7 === void 0 || (_pluginInjectionApi$q7 = _pluginInjectionApi$q7.sharedState.currentState()) === null || _pluginInjectionApi$q7 === void 0 ? void 0 : _pluginInjectionApi$q7.emptyStateHandler;
113
+ }, [pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q7 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q7 === void 0 ? void 0 : _pluginInjectionApi$q7.actions, quickInsertDropdownItems]);
114
+ var emptyStateHandler = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$q8 = pluginInjectionApi.quickInsert) === null || _pluginInjectionApi$q8 === void 0 || (_pluginInjectionApi$q8 = _pluginInjectionApi$q8.sharedState.currentState()) === null || _pluginInjectionApi$q8 === void 0 ? void 0 : _pluginInjectionApi$q8.emptyStateHandler;
94
115
  return (
95
116
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage
96
117
  jsx("div", {
@@ -139,6 +160,19 @@ var getInsertMenuHeight = function getInsertMenuHeight(_ref3) {
139
160
  return 560; // For showing 6 Elements.
140
161
  };
141
162
  var insertMenuWrapper = function insertMenuWrapper(itemCount) {
163
+ if (editorExperiment('insert-menu-in-right-rail', true)) {
164
+ return css({
165
+ display: 'flex',
166
+ flexDirection: 'column',
167
+ width: '310px',
168
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
169
+ height: 'calc(100% - 32px)',
170
+ margin: "0 -10px",
171
+ backgroundColor: "".concat("var(--ds-surface-overlay, ".concat(N0, ")")),
172
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values, @atlaskit/ui-styling-standard/no-unsafe-values -- Ignored via go/DSP-18766
173
+ borderRadius: "".concat(borderRadius(), "px")
174
+ });
175
+ }
142
176
  return css({
143
177
  display: 'flex',
144
178
  flexDirection: 'column',
@@ -1,9 +1,192 @@
1
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
1
2
  import React from 'react';
3
+ import { useIntl } from 'react-intl-next';
4
+ import { IconButton } from '@atlaskit/button/new';
5
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
6
+ import { toolbarInsertBlockMessages } from '@atlaskit/editor-common/messages';
7
+ import Heading from '@atlaskit/heading';
8
+ import CrossIcon from '@atlaskit/icon/glyph/cross';
9
+ import { Box, xcss } from '@atlaskit/primitives';
10
+ import { toggleInsertMenuRightRail } from '../../pm-plugins/commands';
11
+ import InsertMenu from '../ElementBrowser/InsertMenu';
12
+ import { useInsertMenuRailItems } from './useInsertMenuRailItems';
13
+ var panelWrapper = xcss({
14
+ height: '100%'
15
+ });
16
+ var panelContentHeader = xcss({
17
+ height: '32px',
18
+ display: 'flex',
19
+ justifyContent: 'space-between',
20
+ alignItems: 'center'
21
+ });
22
+
2
23
  /**
3
24
  * For insert menu in right rail experiment
4
25
  * - Clean up ticket ED-24801
5
26
  */
6
27
  export var InsertMenuRail = function InsertMenuRail(_ref) {
7
- var api = _ref.api;
8
- return /*#__PURE__*/React.createElement("div", null);
28
+ var editorView = _ref.editorView,
29
+ options = _ref.options,
30
+ api = _ref.api;
31
+ var dropdownItems = useInsertMenuRailItems(editorView, options, api);
32
+ var _useIntl = useIntl(),
33
+ formatMessage = _useIntl.formatMessage;
34
+ var onInsert = function onInsert(_ref2) {
35
+ var _api$core, _api$hyperlink, _api$imageUpload, _api$media, _api$mention, _api$emoji, _api$codeBlock, _api$blockType, _api$panel, _api$taskDecision, _api$taskDecision2, _api$rule, _api$core2, _api$quickInsert, _api$core3, _api$date, _api$placeholderText, _api$layout, _api$core4, _api$status;
36
+ var item = _ref2.item;
37
+ var state = editorView.state,
38
+ dispatch = editorView.dispatch;
39
+ var inputMethod = INPUT_METHOD.INSERT_MENU_RIGHT_RAIL;
40
+ if (!api) {
41
+ return;
42
+ }
43
+ if (!editorView.hasFocus()) {
44
+ editorView.focus();
45
+ }
46
+
47
+ // Below is duplicated from ToolbarInsertBlock/index.tsx - this function is only called
48
+ // for BlockMenuItem items, which are rendered in the insert menu when no search has been performed.
49
+ // When a search is performed, the list will be filled by QuickInsertItems, which handle their own insertion.
50
+ switch (item.value.name) {
51
+ case 'link':
52
+ // @ts-expect-error
53
+ (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$hyperlink = api.hyperlink) === null || _api$hyperlink === void 0 ? void 0 : _api$hyperlink.commands.showLinkToolbar(inputMethod));
54
+ break;
55
+ case 'table':
56
+ // workaround to solve race condition where cursor is not placed correctly inside table
57
+ queueMicrotask(function () {
58
+ var _api$table, _api$table$actions$in, _api$table$actions;
59
+ // @ts-expect-error
60
+ (_api$table = api.table) === null || _api$table === void 0 || (_api$table$actions$in = (_api$table$actions = _api$table.actions).insertTable) === null || _api$table$actions$in === void 0 || _api$table$actions$in.call(_api$table$actions, {
61
+ action: ACTION.INSERTED,
62
+ actionSubject: ACTION_SUBJECT.DOCUMENT,
63
+ actionSubjectId: ACTION_SUBJECT_ID.TABLE,
64
+ attributes: {
65
+ inputMethod: inputMethod
66
+ },
67
+ eventType: EVENT_TYPE.TRACK
68
+ })(state, dispatch);
69
+ });
70
+ break;
71
+ case 'image upload':
72
+ (_api$imageUpload = api.imageUpload) === null || _api$imageUpload === void 0 || _api$imageUpload.actions.startUpload()(state, dispatch);
73
+ break;
74
+ case 'media':
75
+ var mediaState = (_api$media = api.media) === null || _api$media === void 0 ? void 0 : _api$media.sharedState.currentState();
76
+ if (mediaState) {
77
+ var _api$analytics;
78
+ mediaState.showMediaPicker();
79
+ // @ts-expect-error
80
+ (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.attachAnalyticsEvent({
81
+ action: ACTION.OPENED,
82
+ actionSubject: ACTION_SUBJECT.PICKER,
83
+ actionSubjectId: ACTION_SUBJECT_ID.PICKER_CLOUD,
84
+ attributes: {
85
+ inputMethod: inputMethod
86
+ },
87
+ eventType: EVENT_TYPE.UI
88
+ });
89
+ }
90
+ break;
91
+ case 'mention':
92
+ var pluginState = (_api$mention = api.mention) === null || _api$mention === void 0 ? void 0 : _api$mention.sharedState.currentState();
93
+ if (pluginState && pluginState.canInsertMention) {
94
+ var _api$mention2;
95
+ // @ts-expect-error
96
+ (_api$mention2 = api.mention) === null || _api$mention2 === void 0 || (_api$mention2 = _api$mention2.actions) === null || _api$mention2 === void 0 || _api$mention2.openTypeAhead(inputMethod);
97
+ }
98
+ break;
99
+ case 'emoji':
100
+ // @ts-expect-error
101
+ (_api$emoji = api.emoji) === null || _api$emoji === void 0 || _api$emoji.actions.openTypeAhead(inputMethod);
102
+ break;
103
+ case 'codeblock':
104
+ (_api$codeBlock = api.codeBlock) === null || _api$codeBlock === void 0 || _api$codeBlock.actions.insertCodeBlock(inputMethod);
105
+ break;
106
+ case 'blockquote':
107
+ // @ts-expect-error
108
+ (_api$blockType = api.blockType) === null || _api$blockType === void 0 || _api$blockType.actions.insertBlockQuote(inputMethod);
109
+ break;
110
+ case 'panel':
111
+ (_api$panel = api.panel) === null || _api$panel === void 0 || _api$panel.actions.insertPanel(inputMethod);
112
+ break;
113
+ case 'action':
114
+ // @ts-expect-error
115
+ (_api$taskDecision = api.taskDecision) === null || _api$taskDecision === void 0 || _api$taskDecision.actions.insertTaskDecision('taskList', inputMethod)(state, dispatch);
116
+ break;
117
+ case 'decision':
118
+ // @ts-expect-error
119
+ (_api$taskDecision2 = api.taskDecision) === null || _api$taskDecision2 === void 0 || _api$taskDecision2.actions.insertTaskDecision('decisionList', inputMethod)(state, dispatch);
120
+ break;
121
+ case 'horizontalrule':
122
+ // @ts-expect-error
123
+ (_api$rule = api.rule) === null || _api$rule === void 0 || _api$rule.actions.insertHorizontalRule(inputMethod)(state, dispatch);
124
+ break;
125
+ case 'macro':
126
+ (_api$core2 = api.core) === null || _api$core2 === void 0 || _api$core2.actions.execute((_api$quickInsert = api.quickInsert) === null || _api$quickInsert === void 0 ? void 0 : _api$quickInsert.commands.openElementBrowserModal);
127
+ break;
128
+ case 'date':
129
+ (_api$core3 = api.core) === null || _api$core3 === void 0 || _api$core3.actions.execute((_api$date = api.date) === null || _api$date === void 0 || (_api$date = _api$date.commands) === null || _api$date === void 0 ? void 0 : _api$date.insertDate({
130
+ // @ts-expect-error
131
+ inputMethod: inputMethod
132
+ }));
133
+ break;
134
+ case 'placeholder text':
135
+ (_api$placeholderText = api.placeholderText) === null || _api$placeholderText === void 0 || _api$placeholderText.actions.showPlaceholderFloatingToolbar(editorView.state, editorView.dispatch);
136
+ break;
137
+ case 'layout':
138
+ // @ts-expect-error
139
+ (_api$layout = api.layout) === null || _api$layout === void 0 || _api$layout.actions.insertLayoutColumns(inputMethod)(editorView.state, editorView.dispatch);
140
+ break;
141
+ case 'status':
142
+ // @ts-expect-error
143
+ (_api$core4 = api.core) === null || _api$core4 === void 0 || _api$core4.actions.execute((_api$status = api.status) === null || _api$status === void 0 || (_api$status = _api$status.commands) === null || _api$status === void 0 ? void 0 : _api$status.insertStatus(inputMethod));
144
+ break;
145
+
146
+ // https://product-fabric.atlassian.net/browse/ED-8053
147
+ // @ts-ignore: OK to fallthrough to default
148
+ case 'expand':
149
+ if (options.allowExpand) {
150
+ var _api$expand;
151
+ (_api$expand = api.expand) === null || _api$expand === void 0 || _api$expand.actions.insertExpand(state, dispatch);
152
+ break;
153
+ }
154
+
155
+ // eslint-disable-next-line no-fallthrough
156
+ default:
157
+ // leaving this blank for now
158
+ }
159
+ };
160
+ return /*#__PURE__*/React.createElement(Box, {
161
+ xcss: panelWrapper
162
+ }, /*#__PURE__*/React.createElement(Box, {
163
+ xcss: panelContentHeader
164
+ }, /*#__PURE__*/React.createElement(Heading, {
165
+ size: "small",
166
+ as: "h2"
167
+ }, formatMessage(toolbarInsertBlockMessages.insertRightRailTitle)), /*#__PURE__*/React.createElement(IconButton, {
168
+ appearance: "subtle",
169
+ testId: "right-rail-insert-menu-close-button",
170
+ label: formatMessage(toolbarInsertBlockMessages.closeInsertRightRail),
171
+ icon: CrossIcon,
172
+ onClick: function onClick() {
173
+ if (!api) {
174
+ return;
175
+ }
176
+ api.core.actions.execute(function (_ref3) {
177
+ var _api$contextPanel;
178
+ var tr = _ref3.tr;
179
+ toggleInsertMenuRightRail(tr);
180
+ (_api$contextPanel = api.contextPanel) === null || _api$contextPanel === void 0 || _api$contextPanel.actions.applyChange(tr);
181
+ return tr;
182
+ });
183
+ }
184
+ })), /*#__PURE__*/React.createElement(InsertMenu, {
185
+ editorView: editorView,
186
+ dropdownItems: dropdownItems,
187
+ onInsert: onInsert,
188
+ toggleVisiblity: function toggleVisiblity() {},
189
+ showElementBrowserLink: true,
190
+ pluginInjectionApi: api
191
+ }));
9
192
  };
@@ -0,0 +1,56 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useMemo } from 'react';
3
+ import { useIntl } from 'react-intl-next';
4
+ import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
5
+ import { createItems } from '../ToolbarInsertBlock/create-items';
6
+ export var useInsertMenuRailItems = function useInsertMenuRailItems(editorView, options, api) {
7
+ var _useIntl = useIntl(),
8
+ formatMessage = _useIntl.formatMessage;
9
+ var _useSharedPluginState = useSharedPluginState(api, ['hyperlink', 'date', 'imageUpload', 'mention', 'emoji', 'blockType', 'media', 'typeAhead', 'placeholderText']),
10
+ dateState = _useSharedPluginState.dateState,
11
+ hyperlinkState = _useSharedPluginState.hyperlinkState,
12
+ imageUploadState = _useSharedPluginState.imageUploadState,
13
+ mentionState = _useSharedPluginState.mentionState,
14
+ emojiState = _useSharedPluginState.emojiState,
15
+ blockTypeState = _useSharedPluginState.blockTypeState,
16
+ mediaState = _useSharedPluginState.mediaState,
17
+ typeAheadState = _useSharedPluginState.typeAheadState,
18
+ placeholderTextState = _useSharedPluginState.placeholderTextState;
19
+ var _useMemo = useMemo(function () {
20
+ var _ref;
21
+ return createItems({
22
+ isTypeAheadAllowed: Boolean(typeAheadState === null || typeAheadState === void 0 ? void 0 : typeAheadState.isAllowed),
23
+ tableSupported: !!editorView.state.schema.nodes.table,
24
+ tableSelectorSupported: options.tableSelectorSupported && !!editorView.state.schema.nodes.table,
25
+ mediaUploadsEnabled: (_ref = mediaState && mediaState.allowsUploads) !== null && _ref !== void 0 ? _ref : undefined,
26
+ mediaSupported: !!mediaState,
27
+ imageUploadSupported: !!(api !== null && api !== void 0 && api.imageUpload),
28
+ imageUploadEnabled: imageUploadState === null || imageUploadState === void 0 ? void 0 : imageUploadState.enabled,
29
+ mentionsSupported: !!(mentionState && mentionState.mentionProvider),
30
+ mentionsDisabled: !!(mentionState && !mentionState.canInsertMention),
31
+ actionSupported: !!editorView.state.schema.nodes.taskItem,
32
+ decisionSupported: !!editorView.state.schema.nodes.decisionItem,
33
+ linkSupported: !!hyperlinkState,
34
+ linkDisabled: !hyperlinkState || !hyperlinkState.canInsertLink || !!hyperlinkState.activeLinkMark,
35
+ emojiDisabled: !emojiState || !emojiState.emojiProvider,
36
+ nativeStatusSupported: options.nativeStatusSupported,
37
+ dateEnabled: !!dateState,
38
+ placeholderTextEnabled: placeholderTextState && placeholderTextState.allowInserting,
39
+ horizontalRuleEnabled: options.horizontalRuleEnabled,
40
+ layoutSectionEnabled: Boolean(api === null || api === void 0 ? void 0 : api.layout),
41
+ expandEnabled: !!options.allowExpand,
42
+ showElementBrowserLink: options.showElementBrowserLink,
43
+ emojiProvider: emojiState === null || emojiState === void 0 ? void 0 : emojiState.emojiProvider,
44
+ availableWrapperBlockTypes: blockTypeState && blockTypeState.availableWrapperBlockTypes,
45
+ insertMenuItems: options.insertMenuItems,
46
+ schema: editorView.state.schema,
47
+ numberOfButtons: 10,
48
+ formatMessage: formatMessage,
49
+ isNewMenuEnabled: true
50
+ });
51
+ }, [api === null || api === void 0 ? void 0 : api.imageUpload, api === null || api === void 0 ? void 0 : api.layout, blockTypeState, dateState, editorView.state.schema, emojiState, formatMessage, hyperlinkState, imageUploadState === null || imageUploadState === void 0 ? void 0 : imageUploadState.enabled, mediaState, mentionState, options.allowExpand, options.horizontalRuleEnabled, options.insertMenuItems, options.nativeStatusSupported, options.showElementBrowserLink, options.tableSelectorSupported, placeholderTextState, typeAheadState === null || typeAheadState === void 0 ? void 0 : typeAheadState.isAllowed]),
52
+ _useMemo2 = _slicedToArray(_useMemo, 2),
53
+ _ = _useMemo2[0],
54
+ dropdownItems = _useMemo2[1];
55
+ return dropdownItems;
56
+ };
@@ -1,63 +1,134 @@
1
1
  import React from 'react';
2
+ import { ACTION, ACTION_SUBJECT, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
3
+ import { Fragment } from '@atlaskit/editor-prosemirror/model';
2
4
  import ActionListIcon from '../assets/action-list';
3
5
  import ApprovalsTrackerIcon from '../assets/approvals-tracker';
4
6
  import DecisionMatrixIcon from '../assets/decision-matrix';
5
7
  import DiscussionNotesIcon from '../assets/discussion-notes';
6
8
  import InstructionsOutlineIcon from '../assets/instructions-outline';
7
- export var templateOptions = [{
8
- title: 'Discussion notes',
9
- description: 'Record discussion points and action items',
10
- keywords: ['decisions', 'summary', 'meeting', 'chat', 'debrief', 'track', 'keep track', 'tasks', 'outstanding items', 'owners'],
11
- // Place templates right after AI item
12
- priority: 99,
13
- icon: function icon() {
14
- return /*#__PURE__*/React.createElement(DiscussionNotesIcon, null);
15
- },
16
- action: function action() {
17
- return false;
18
- }
19
- }, {
20
- title: 'Approvals tracker',
21
- description: 'Track reviewer approvals and dates',
22
- keywords: ['reviews', 'requests', 'rejected requests', 'review dates', 'timeline', 'checklist', 'sme timeline', 'sme requests', 'sme check', 'table'],
23
- priority: 99,
24
- icon: function icon() {
25
- return /*#__PURE__*/React.createElement(ApprovalsTrackerIcon, null);
26
- },
27
- action: function action() {
28
- return false;
29
- }
30
- }, {
31
- title: 'Decision matrix',
32
- description: 'Compare options and make recommendations',
33
- keywords: ['pros', 'cons', 'recommended', 'rationale', 'evaluation', 'options', 'choice', 'table'],
34
- priority: 99,
35
- icon: function icon() {
36
- return /*#__PURE__*/React.createElement(DecisionMatrixIcon, null);
37
- },
38
- action: function action() {
39
- return false;
40
- }
41
- }, {
42
- title: 'List of actions',
43
- description: 'Track tasks, assignees and deadlines',
44
- keywords: ['checklist', 'check', 'items', 'shopping list', 'jtbd', 'jobs to be done', 'due date', 'progress', 'task', 'tasks', 'prioritization', 'timeline', 'approvals', 'reviewers', 'review date'],
45
- priority: 99,
46
- icon: function icon() {
47
- return /*#__PURE__*/React.createElement(ActionListIcon, null);
48
- },
49
- action: function action() {
50
- return false;
51
- }
52
- }, {
53
- title: 'Instructions outline',
54
- description: 'Detailed steps for any process',
55
- keywords: ['steps', 'manual', 'tasks', 'jobs to be done', 'jtbd', 'how-to', 'guide', 'journey', 'checklist', 'tutorial', 'map', 'brochure', 'columns', 'layout', 'help'],
56
- priority: 99,
57
- icon: function icon() {
58
- return /*#__PURE__*/React.createElement(InstructionsOutlineIcon, null);
59
- },
60
- action: function action() {
61
- return false;
62
- }
63
- }];
9
+ import { actionList, approvalsTracker, decisionMatrix, discussionNotes, instructionsOutline } from './templates';
10
+ var getTemplateInsertionPayload = function getTemplateInsertionPayload(templateType, source) {
11
+ return {
12
+ action: ACTION.INSERTED,
13
+ actionSubject: ACTION_SUBJECT.DOCUMENT,
14
+ actionSubjectId: 'elementTemplate',
15
+ attributes: {
16
+ inputMethod: source !== null && source !== void 0 ? source : INPUT_METHOD.QUICK_INSERT,
17
+ templateType: templateType
18
+ },
19
+ eventType: EVENT_TYPE.TRACK
20
+ };
21
+ };
22
+ var getTableWidth = function getTableWidth(api) {
23
+ var _api$table;
24
+ return api !== null && api !== void 0 && (_api$table = api.table) !== null && _api$table !== void 0 && (_api$table = _api$table.sharedState.currentState()) !== null && _api$table !== void 0 && _api$table.isFullWidthModeEnabled ? 1800 : 760;
25
+ };
26
+ export var templateOptions = function templateOptions(api) {
27
+ return [{
28
+ title: 'Discussion notes',
29
+ // @ts-ignore
30
+ id: 'discussionNotes',
31
+ description: 'Record discussion points and action items',
32
+ keywords: ['decisions', 'summary', 'meeting', 'chat', 'debrief', 'track', 'keep track', 'tasks', 'outstanding items', 'owners'],
33
+ // Place templates right after AI item
34
+ priority: 99,
35
+ icon: function icon() {
36
+ return /*#__PURE__*/React.createElement(DiscussionNotesIcon, null);
37
+ },
38
+ action: function action(insert, state, source) {
39
+ var _api$analytics;
40
+ var tr = insert(Fragment.fromJSON(state.schema, discussionNotes(getTableWidth(api))), {
41
+ // @ts-ignore
42
+ isTemplate: true
43
+ });
44
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.attachAnalyticsEvent(
45
+ // @ts-ignore
46
+ getTemplateInsertionPayload('discussionNotes', source))(tr);
47
+ return tr;
48
+ }
49
+ }, {
50
+ title: 'Approvals tracker',
51
+ // @ts-ignore
52
+ id: 'approvalsTracker',
53
+ description: 'Track reviewer approvals and dates',
54
+ keywords: ['reviews', 'requests', 'rejected requests', 'review dates', 'timeline', 'checklist', 'sme timeline', 'sme requests', 'sme check', 'table'],
55
+ priority: 99,
56
+ icon: function icon() {
57
+ return /*#__PURE__*/React.createElement(ApprovalsTrackerIcon, null);
58
+ },
59
+ action: function action(insert, state, source) {
60
+ var _api$analytics2;
61
+ var tr = insert(Fragment.fromJSON(state.schema, approvalsTracker(getTableWidth(api))), {
62
+ // @ts-ignore
63
+ isTemplate: true
64
+ });
65
+ api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || _api$analytics2.actions.attachAnalyticsEvent(
66
+ // @ts-ignore
67
+ getTemplateInsertionPayload('approvalsTracker', source))(tr);
68
+ return tr;
69
+ }
70
+ }, {
71
+ title: 'Decision matrix',
72
+ // @ts-ignore
73
+ id: 'decisionMatrix',
74
+ description: 'Compare options and make recommendations',
75
+ keywords: ['pros', 'cons', 'recommended', 'rationale', 'evaluation', 'options', 'choice', 'table'],
76
+ priority: 99,
77
+ icon: function icon() {
78
+ return /*#__PURE__*/React.createElement(DecisionMatrixIcon, null);
79
+ },
80
+ action: function action(insert, state, source) {
81
+ var _api$analytics3;
82
+ var tr = insert(Fragment.fromJSON(state.schema, decisionMatrix(getTableWidth(api))), {
83
+ // @ts-ignore
84
+ isTemplate: true
85
+ });
86
+ api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 || _api$analytics3.actions.attachAnalyticsEvent(
87
+ // @ts-ignore
88
+ getTemplateInsertionPayload('decisionMatrix', source))(tr);
89
+ return tr;
90
+ }
91
+ }, {
92
+ title: 'List of actions',
93
+ // @ts-ignore
94
+ id: 'actionList',
95
+ description: 'Track tasks, assignees and deadlines',
96
+ keywords: ['checklist', 'check', 'items', 'shopping list', 'jtbd', 'jobs to be done', 'due date', 'progress', 'task', 'tasks', 'prioritization', 'timeline', 'approvals', 'reviewers', 'review date'],
97
+ priority: 99,
98
+ icon: function icon() {
99
+ return /*#__PURE__*/React.createElement(ActionListIcon, null);
100
+ },
101
+ action: function action(insert, state, source) {
102
+ var _api$analytics4;
103
+ // @ts-ignore
104
+ var tr = insert(Fragment.fromJSON(state.schema, actionList), {
105
+ isTemplate: true
106
+ });
107
+ api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 || _api$analytics4.actions.attachAnalyticsEvent(
108
+ // @ts-ignore
109
+ getTemplateInsertionPayload('actionList', source))(tr);
110
+ return tr;
111
+ }
112
+ }, {
113
+ title: 'Instructions outline',
114
+ // @ts-ignore
115
+ id: 'instructionsOutline',
116
+ description: 'Detailed steps for any process',
117
+ keywords: ['steps', 'manual', 'tasks', 'jobs to be done', 'jtbd', 'how-to', 'guide', 'journey', 'checklist', 'tutorial', 'map', 'brochure', 'columns', 'layout', 'help'],
118
+ priority: 99,
119
+ icon: function icon() {
120
+ return /*#__PURE__*/React.createElement(InstructionsOutlineIcon, null);
121
+ },
122
+ action: function action(insert, state, source) {
123
+ var _api$analytics5;
124
+ // @ts-ignore
125
+ var tr = insert(Fragment.fromJSON(state.schema, instructionsOutline), {
126
+ isTemplate: true
127
+ });
128
+ api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 || _api$analytics5.actions.attachAnalyticsEvent(
129
+ // @ts-ignore
130
+ getTemplateInsertionPayload('instructionsOutline', source))(tr);
131
+ return tr;
132
+ }
133
+ }];
134
+ };