@atlaskit/editor-core 179.0.4 → 179.1.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 (108) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cjs/create-editor/ReactEditorView.js +1 -1
  3. package/dist/cjs/create-editor/create-plugins-list.js +6 -287
  4. package/dist/cjs/editor.js +5 -7
  5. package/dist/cjs/labs/next/presets/universal.js +313 -0
  6. package/dist/cjs/plugins/card/ui/EditLinkToolbar.js +24 -5
  7. package/dist/cjs/plugins/floating-toolbar/index.js +6 -0
  8. package/dist/cjs/plugins/floating-toolbar/pm-plugins/force-focus/index.js +72 -0
  9. package/dist/cjs/plugins/floating-toolbar/ui/Toolbar.js +12 -9
  10. package/dist/cjs/plugins/insert-block/ui/ToolbarInsertBlock/block-insert-element-browser.js +3 -1
  11. package/dist/cjs/plugins/insert-block/ui/ToolbarInsertBlock/index.js +3 -2
  12. package/dist/cjs/plugins/list/actions/outdent-list-items-selected.js +40 -1
  13. package/dist/cjs/plugins/list/commands/outdent-list.js +22 -9
  14. package/dist/cjs/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +30 -12
  15. package/dist/cjs/plugins/list/utils/analytics.js +18 -2
  16. package/dist/cjs/plugins/media/commands/linking.js +2 -2
  17. package/dist/cjs/plugins/media/pm-plugins/alt-text/index.js +1 -12
  18. package/dist/cjs/plugins/media/toolbar/alt-text.js +14 -3
  19. package/dist/cjs/plugins/media/toolbar/linking-toolbar-appearance.js +6 -6
  20. package/dist/cjs/plugins/media/toolbar/linking.js +7 -1
  21. package/dist/cjs/plugins/paste/handlers.js +7 -5
  22. package/dist/cjs/plugins/placeholder/index.js +1 -0
  23. package/dist/cjs/plugins/placeholder/styles.js +1 -1
  24. package/dist/cjs/plugins/toolbar-lists-indentation/ui/Toolbar.js +17 -0
  25. package/dist/cjs/plugins/type-ahead/ui/InputQuery.js +13 -13
  26. package/dist/cjs/utils/document.js +3 -2
  27. package/dist/cjs/utils/input-rules.js +3 -2
  28. package/dist/cjs/utils/lists.js +31 -0
  29. package/dist/cjs/utils/prepare-quick-insert-provider.js +22 -0
  30. package/dist/cjs/version-wrapper.js +1 -1
  31. package/dist/cjs/version.json +1 -1
  32. package/dist/es2019/create-editor/ReactEditorView.js +1 -1
  33. package/dist/es2019/create-editor/create-plugins-list.js +5 -293
  34. package/dist/es2019/editor.js +5 -7
  35. package/dist/es2019/labs/next/presets/universal.js +311 -0
  36. package/dist/es2019/plugins/card/ui/EditLinkToolbar.js +19 -2
  37. package/dist/es2019/plugins/floating-toolbar/index.js +4 -0
  38. package/dist/es2019/plugins/floating-toolbar/pm-plugins/force-focus/index.js +59 -0
  39. package/dist/es2019/plugins/floating-toolbar/ui/Toolbar.js +6 -3
  40. package/dist/es2019/plugins/insert-block/ui/ToolbarInsertBlock/block-insert-element-browser.js +3 -1
  41. package/dist/es2019/plugins/insert-block/ui/ToolbarInsertBlock/index.js +3 -2
  42. package/dist/es2019/plugins/list/actions/outdent-list-items-selected.js +41 -1
  43. package/dist/es2019/plugins/list/commands/outdent-list.js +16 -1
  44. package/dist/es2019/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +29 -11
  45. package/dist/es2019/plugins/list/utils/analytics.js +12 -0
  46. package/dist/es2019/plugins/media/commands/linking.js +2 -2
  47. package/dist/es2019/plugins/media/pm-plugins/alt-text/index.js +1 -12
  48. package/dist/es2019/plugins/media/toolbar/alt-text.js +14 -3
  49. package/dist/es2019/plugins/media/toolbar/linking-toolbar-appearance.js +6 -6
  50. package/dist/es2019/plugins/media/toolbar/linking.js +9 -1
  51. package/dist/es2019/plugins/paste/handlers.js +8 -6
  52. package/dist/es2019/plugins/placeholder/index.js +1 -0
  53. package/dist/es2019/plugins/placeholder/styles.js +7 -0
  54. package/dist/es2019/plugins/toolbar-lists-indentation/ui/Toolbar.js +17 -0
  55. package/dist/es2019/plugins/type-ahead/ui/InputQuery.js +13 -13
  56. package/dist/es2019/utils/document.js +3 -2
  57. package/dist/es2019/utils/input-rules.js +3 -2
  58. package/dist/es2019/utils/lists.js +26 -0
  59. package/dist/es2019/utils/prepare-quick-insert-provider.js +17 -0
  60. package/dist/es2019/version-wrapper.js +1 -1
  61. package/dist/es2019/version.json +1 -1
  62. package/dist/esm/create-editor/ReactEditorView.js +1 -1
  63. package/dist/esm/create-editor/create-plugins-list.js +6 -287
  64. package/dist/esm/editor.js +5 -7
  65. package/dist/esm/labs/next/presets/universal.js +306 -0
  66. package/dist/esm/plugins/card/ui/EditLinkToolbar.js +24 -5
  67. package/dist/esm/plugins/floating-toolbar/index.js +6 -0
  68. package/dist/esm/plugins/floating-toolbar/pm-plugins/force-focus/index.js +62 -0
  69. package/dist/esm/plugins/floating-toolbar/ui/Toolbar.js +12 -9
  70. package/dist/esm/plugins/insert-block/ui/ToolbarInsertBlock/block-insert-element-browser.js +3 -1
  71. package/dist/esm/plugins/insert-block/ui/ToolbarInsertBlock/index.js +3 -2
  72. package/dist/esm/plugins/list/actions/outdent-list-items-selected.js +40 -1
  73. package/dist/esm/plugins/list/commands/outdent-list.js +15 -2
  74. package/dist/esm/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +30 -12
  75. package/dist/esm/plugins/list/utils/analytics.js +12 -0
  76. package/dist/esm/plugins/media/commands/linking.js +2 -2
  77. package/dist/esm/plugins/media/pm-plugins/alt-text/index.js +1 -12
  78. package/dist/esm/plugins/media/toolbar/alt-text.js +14 -3
  79. package/dist/esm/plugins/media/toolbar/linking-toolbar-appearance.js +6 -6
  80. package/dist/esm/plugins/media/toolbar/linking.js +7 -1
  81. package/dist/esm/plugins/paste/handlers.js +8 -6
  82. package/dist/esm/plugins/placeholder/index.js +1 -0
  83. package/dist/esm/plugins/placeholder/styles.js +1 -1
  84. package/dist/esm/plugins/toolbar-lists-indentation/ui/Toolbar.js +17 -0
  85. package/dist/esm/plugins/type-ahead/ui/InputQuery.js +13 -13
  86. package/dist/esm/utils/document.js +3 -2
  87. package/dist/esm/utils/input-rules.js +3 -2
  88. package/dist/esm/utils/lists.js +24 -0
  89. package/dist/esm/utils/prepare-quick-insert-provider.js +17 -0
  90. package/dist/esm/version-wrapper.js +1 -1
  91. package/dist/esm/version.json +1 -1
  92. package/dist/types/create-editor/create-plugins-list.d.ts +5 -4
  93. package/dist/types/{plugins/feature-flags-context → create-editor}/feature-flags-from-props.d.ts +2 -2
  94. package/dist/types/labs/next/presets/universal.d.ts +30 -0
  95. package/dist/types/plugins/card/ui/EditLinkToolbar.d.ts +4 -0
  96. package/dist/types/plugins/expand/index.d.ts +4 -1
  97. package/dist/types/plugins/floating-toolbar/pm-plugins/force-focus/index.d.ts +18 -0
  98. package/dist/types/plugins/list/utils/analytics.d.ts +5 -2
  99. package/dist/types/plugins/media/commands/linking.d.ts +1 -1
  100. package/dist/types/types/editor-props.d.ts +96 -92
  101. package/dist/types/utils/input-rules.d.ts +2 -1
  102. package/dist/types/utils/lists.d.ts +2 -0
  103. package/dist/types/utils/prepare-quick-insert-provider.d.ts +16 -0
  104. package/package.json +14 -15
  105. package/report.api.md +89 -79
  106. /package/dist/cjs/{plugins/feature-flags-context → create-editor}/feature-flags-from-props.js +0 -0
  107. /package/dist/es2019/{plugins/feature-flags-context → create-editor}/feature-flags-from-props.js +0 -0
  108. /package/dist/esm/{plugins/feature-flags-context → create-editor}/feature-flags-from-props.js +0 -0
@@ -11,10 +11,13 @@ import { messages } from '../../list/messages';
11
11
  import { messages as indentationMessages } from '../../indentation/messages';
12
12
  import { buttonGroupStyle, separatorStyles } from '../../../ui/styles';
13
13
  import { getAriaKeyshortcuts } from '@atlaskit/editor-common/keymaps';
14
+ import { useEffect, useRef } from 'react';
14
15
  export function Toolbar(props) {
15
16
  const {
16
17
  formatMessage
17
18
  } = useIntl();
19
+ const indentButtonRef = useRef(null);
20
+ const outdentButtonRef = useRef(null);
18
21
  const {
19
22
  disabled,
20
23
  isReducedSpacing,
@@ -31,10 +34,22 @@ export function Toolbar(props) {
31
34
  const labelOrderedList = formatMessage(messages.orderedList);
32
35
  const indentMessage = formatMessage(indentationMessages.indent);
33
36
  const outdentMessage = formatMessage(indentationMessages.outdent);
37
+ const isIndentButtonFocused = document.activeElement === indentButtonRef.current;
38
+ const isOutdentButtonFocused = document.activeElement === outdentButtonRef.current;
34
39
  const handleOnItemActivated = buttonName => event => onItemActivated({
35
40
  editorView: props.editorView,
36
41
  buttonName
37
42
  });
43
+ useEffect(() => {
44
+ if (isIndentButtonFocused && indentDisabled && outdentButtonRef.current) {
45
+ outdentButtonRef.current.focus();
46
+ }
47
+ }, [indentButtonRef, indentDisabled, isIndentButtonFocused]);
48
+ useEffect(() => {
49
+ if (isOutdentButtonFocused && outdentDisabled && indentButtonRef.current) {
50
+ indentButtonRef.current.focus();
51
+ }
52
+ }, [outdentButtonRef, outdentDisabled, isOutdentButtonFocused]);
38
53
  return jsx("span", {
39
54
  css: buttonGroupStyle
40
55
  }, jsx(ToolbarButton, {
@@ -74,6 +89,7 @@ export function Toolbar(props) {
74
89
  }), showIndentationButtons && jsx(ToolbarButton, {
75
90
  buttonId: TOOLBAR_BUTTON.OUTDENT,
76
91
  testId: TOOLBAR_BUTTON.OUTDENT,
92
+ ref: outdentButtonRef,
77
93
  spacing: isReducedSpacing ? 'none' : 'default',
78
94
  onClick: handleOnItemActivated('outdent'),
79
95
  iconBefore: jsx(OutdentIcon, {
@@ -89,6 +105,7 @@ export function Toolbar(props) {
89
105
  }), showIndentationButtons && jsx(ToolbarButton, {
90
106
  buttonId: TOOLBAR_BUTTON.INDENT,
91
107
  testId: TOOLBAR_BUTTON.INDENT,
108
+ ref: indentButtonRef,
92
109
  spacing: isReducedSpacing ? 'none' : 'default',
93
110
  onClick: handleOnItemActivated('indent'),
94
111
  iconBefore: jsx(IndentIcon, {
@@ -184,20 +184,20 @@ export const InputQuery = /*#__PURE__*/React.memo(({
184
184
  return false;
185
185
  }, [onQueryFocus]);
186
186
  const queryStyle = css({
187
- outline: 'none',
188
- position: 'absolute',
189
- fontFamily: 'inherit',
190
- fontSize: 'inherit',
191
- fontWeight: 'inherit',
192
- letterSpacing: 'inherit',
193
- padding: 0,
194
- height: '100%',
195
- width: '100%',
196
- top: 0,
197
- left: 0,
198
- background: 'transparent',
199
- border: 'none',
200
187
  '&&': {
188
+ outline: 'none',
189
+ position: 'absolute',
190
+ fontFamily: 'inherit',
191
+ fontSize: 'inherit',
192
+ fontWeight: 'inherit',
193
+ letterSpacing: 'inherit',
194
+ padding: 0,
195
+ height: '100%',
196
+ width: '100%',
197
+ top: 0,
198
+ left: 0,
199
+ background: 'transparent',
200
+ border: 'none',
201
201
  color: `${`var(--ds-link, ${colors.B400})`}`
202
202
  }
203
203
  });
@@ -28,7 +28,8 @@ export function hasVisibleContent(node) {
28
28
  }
29
29
  for (let index = 0; index < node.childCount; index++) {
30
30
  const child = node.child(index);
31
- if (hasVisibleContent(child)) {
31
+ const invisibleNodeTypes = ['paragraph', 'text', 'hardBreak'];
32
+ if (!invisibleNodeTypes.includes(child.type.name) || hasVisibleContent(child)) {
32
33
  return true;
33
34
  }
34
35
  }
@@ -269,7 +270,7 @@ export function processRawValue(schema, value, providerFactory, sanitizePrivateC
269
270
  action: ACTION.DOCUMENT_PROCESSING_ERROR,
270
271
  actionSubject: ACTION_SUBJECT.EDITOR,
271
272
  eventType: EVENT_TYPE.OPERATIONAL,
272
- attributes: {
273
+ nonPrivacySafeAttributes: {
273
274
  errorStack: e instanceof Error ? e.stack : String(e)
274
275
  }
275
276
  });
@@ -3,6 +3,7 @@ import { canJoin, findWrapping } from 'prosemirror-transform';
3
3
  import { GapCursorSelection } from '@atlaskit/editor-common/selection';
4
4
  import { createInputRulePlugin } from '@atlaskit/prosemirror-input-rules';
5
5
  import { addAnalytics } from '../plugins/analytics';
6
+ import { JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST } from '@atlaskit/editor-common/analytics';
6
7
  import { closeHistory } from 'prosemirror-history';
7
8
  import { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';
8
9
  import { getFeatureFlags } from '../plugins/feature-flags-context';
@@ -121,13 +122,13 @@ export const createWrappingJoinRule = ({
121
122
  if (node) {
122
123
  const nodeEnd = node.pos + node.node.nodeSize;
123
124
  const after = tr.doc.resolve(nodeEnd).nodeAfter;
124
- if (after && after.type === nodeType && canJoin(tr.doc, nodeEnd) && (!joinPredicate || joinPredicate(match, after))) {
125
+ if (after && after.type === nodeType && canJoin(tr.doc, nodeEnd) && (!joinPredicate || joinPredicate(match, after, JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST.JOINED_TO_LIST_BELOW))) {
125
126
  tr.join(nodeEnd);
126
127
  }
127
128
  }
128
129
  }
129
130
  const before = tr.doc.resolve(fixedStart - 1).nodeBefore;
130
- if (before && before.type === nodeType && canJoin(tr.doc, fixedStart - 1) && (!joinPredicate || joinPredicate(match, before))) {
131
+ if (before && before.type === nodeType && canJoin(tr.doc, fixedStart - 1) && (!joinPredicate || joinPredicate(match, before, JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST.JOINED_TO_LIST_ABOVE))) {
131
132
  tr.join(fixedStart - 1);
132
133
  }
133
134
  return tr;
@@ -0,0 +1,26 @@
1
+ import { findRootParentListNode } from '../plugins/list/utils/find';
2
+ export const doesSelectionWhichStartsOrEndsInListContainEntireList = selection => {
3
+ const {
4
+ $from,
5
+ $to,
6
+ from,
7
+ to
8
+ } = selection;
9
+ const selectionParentListItemNodeResolvedPos = findRootParentListNode($from) || findRootParentListNode($to);
10
+ const selectionParentListNode = selectionParentListItemNodeResolvedPos === null || selectionParentListItemNodeResolvedPos === void 0 ? void 0 : selectionParentListItemNodeResolvedPos.parent;
11
+ if (!selectionParentListItemNodeResolvedPos || !selectionParentListNode) {
12
+ return false;
13
+ }
14
+ const startOfEntireList = $from.pos < $to.pos ? selectionParentListItemNodeResolvedPos.pos + $from.depth - 1 : selectionParentListItemNodeResolvedPos.pos + $to.depth - 1;
15
+ const endOfEntireList = $from.pos < $to.pos ? selectionParentListItemNodeResolvedPos.pos + selectionParentListNode.nodeSize - $to.depth - 1 : selectionParentListItemNodeResolvedPos.pos + selectionParentListNode.nodeSize - $from.depth - 1;
16
+ if (!startOfEntireList || !endOfEntireList) {
17
+ return false;
18
+ }
19
+ if (from < to) {
20
+ return startOfEntireList >= $from.pos && endOfEntireList <= $to.pos;
21
+ } else if (from > to) {
22
+ return startOfEntireList >= $to.pos && endOfEntireList <= $from.pos;
23
+ } else {
24
+ return false;
25
+ }
26
+ };
@@ -0,0 +1,17 @@
1
+ import { extensionProviderToQuickInsertProvider, combineQuickInsertProviders } from './extensions';
2
+
3
+ /**
4
+ *
5
+ * Used to combine the quickInsert provider and extension provider (if available)
6
+ * Or return a provider that is available (quickInsertProvider preferred)
7
+ * @param editorActions
8
+ * @param extensionProvider
9
+ * @param quickInsert
10
+ * @param createAnalyticsEvent
11
+ * @returns Quick insert provider if available
12
+ */
13
+ export default function prepareQuickInsertProvider(editorActions, extensionProvider, quickInsert, createAnalyticsEvent) {
14
+ const quickInsertProvider = quickInsert && typeof quickInsert !== 'boolean' && quickInsert.provider;
15
+ const extensionQuickInsertProvider = extensionProvider && extensionProviderToQuickInsertProvider(extensionProvider, editorActions, createAnalyticsEvent);
16
+ return quickInsertProvider && extensionQuickInsertProvider ? combineQuickInsertProviders([quickInsertProvider, extensionQuickInsertProvider]) : quickInsertProvider || extensionQuickInsertProvider;
17
+ }
@@ -1,5 +1,5 @@
1
1
  export const name = "@atlaskit/editor-core";
2
- export const version = "179.0.4";
2
+ export const version = "179.1.1";
3
3
  export const nextMajorVersion = () => {
4
4
  return [Number(version.split('.')[0]) + 1, 0, 0].join('.');
5
5
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-core",
3
- "version": "179.0.4",
3
+ "version": "179.1.1",
4
4
  "sideEffects": false
5
5
  }
@@ -26,7 +26,7 @@ import { RenderTracking } from '../utils/performance/components/RenderTracking';
26
26
  import { findChangedNodesFromTransaction, validateNodes, validNode } from '../utils/nodes';
27
27
  import createPluginList from './create-plugins-list';
28
28
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE, fireAnalyticsEvent, FULL_WIDTH_MODE, getAnalyticsEventsFromTransaction, PLATFORMS } from '../plugins/analytics';
29
- import { createFeatureFlagsFromProps } from '../plugins/feature-flags-context/feature-flags-from-props';
29
+ import { createFeatureFlagsFromProps } from './feature-flags-from-props';
30
30
  import { getEnabledFeatureFlagKeys } from '../plugins/feature-flags-context/get-enabled-feature-flag-keys';
31
31
  import { createErrorReporter, createPMPlugins, processPluginsList } from './create-editor';
32
32
  import { getDocStructure } from '../utils/document-logger';
@@ -1,15 +1,10 @@
1
- import _typeof from "@babel/runtime/helpers/typeof";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
2
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
3
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
- import { breakoutPlugin, collabEditPlugin, dataConsumerMarkPlugin, datePlugin, emojiPlugin, extensionPlugin, fragmentMarkPlugin, helpDialogPlugin, imageUploadPlugin, insertBlockPlugin, jiraIssuePlugin, layoutPlugin, listPlugin, toolbarListsIndentationPlugin, macroPlugin, maxContentSizePlugin, mediaPlugin, mentionsPlugin, panelPlugin, placeholderTextPlugin, rulePlugin, saveOnEnterPlugin, tasksAndDecisionsPlugin, textColorPlugin, cardPlugin, gridPlugin, statusPlugin, alignmentPlugin, indentationPlugin, analyticsPlugin, customAutoformatPlugin, feedbackDialogPlugin, historyPlugin, expandPlugin, isExpandInsertionEnabled, scrollIntoViewPlugin, mobileDimensionsPlugin, findReplacePlugin, contextPanelPlugin, mobileSelectionPlugin, annotationPlugin, captionPlugin, avatarGroupPlugin, viewUpdateSubscriptionPlugin, beforePrimaryToolbarPlugin, codeBidiWarningPlugin, copyButtonPlugin } from '../plugins';
6
- import { tablesPlugin } from '@atlaskit/editor-plugin-table';
7
- import { isFullPage as fullPageCheck } from '../utils/is-full-page';
4
+ import createUniversalPreset from '../labs/next/presets/universal';
8
5
  import { GUTTER_SIZE_MOBILE_IN_PX } from '../plugins/base/pm-plugins/scroll-gutter';
9
- import { createFeatureFlagsFromProps } from '../plugins/feature-flags-context/feature-flags-from-props';
10
- import { getMediaFeatureFlag } from '@atlaskit/media-common';
11
- import { createDefaultPreset } from '../labs/next/presets/default';
12
- import { shouldForceTracking } from '@atlaskit/editor-common/utils';
6
+ import { isFullPage as fullPageCheck } from '../utils/is-full-page';
7
+ import { createFeatureFlagsFromProps } from './feature-flags-from-props';
13
8
  var isCodeBlockAllowed = function isCodeBlockAllowed(options) {
14
9
  var exclude = options && options.allowBlockType && options.allowBlockType.exclude ? options.allowBlockType.exclude : [];
15
10
  return exclude.indexOf('codeBlock') === -1;
@@ -44,7 +39,7 @@ export function getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEve
44
39
  var isMobile = appearance === 'mobile';
45
40
  var inputTracking = (_props$performanceTra = props.performanceTracking) === null || _props$performanceTra === void 0 ? void 0 : _props$performanceTra.inputTracking;
46
41
  var cardOptions = ((_props$linking = props.linking) === null || _props$linking === void 0 ? void 0 : _props$linking.smartLinks) || props.smartLinks || props.UNSAFE_cards;
47
- return {
42
+ return _objectSpread(_objectSpread({}, props), {}, {
48
43
  createAnalyticsEvent: createAnalyticsEvent,
49
44
  typeAhead: {
50
45
  createAnalyticsEvent: createAnalyticsEvent,
@@ -97,7 +92,7 @@ export function getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEve
97
92
  appearance: props.appearance,
98
93
  allowCompositionInputOverride: isMobile
99
94
  })
100
- };
95
+ });
101
96
  }
102
97
 
103
98
  /**
@@ -107,283 +102,7 @@ export function getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEve
107
102
  * their placement in the editor toolbar
108
103
  */
109
104
  export default function createPluginsList(props, prevProps, createAnalyticsEvent, insertNodeAPI, editorAnalyticsAPI, editorSelectionAPI, getEditorContainerWidth) {
110
- var _props$linking3;
111
- var appearance = props.appearance;
112
- var isMobile = appearance === 'mobile';
113
- var isComment = appearance === 'comment';
114
- var isFullPage = fullPageCheck(appearance);
115
- var preset = createDefaultPreset(getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEvent));
116
- var featureFlags = createFeatureFlagsFromProps(props);
117
- var getEditorFeatureFlags = function getEditorFeatureFlags() {
118
- return featureFlags;
119
- };
120
- if (props.allowAnalyticsGASV3) {
121
- var performanceTracking = props.performanceTracking;
122
- preset.add([analyticsPlugin, {
123
- createAnalyticsEvent: createAnalyticsEvent,
124
- performanceTracking: performanceTracking
125
- }]);
126
- }
127
- if (props.allowBreakout && isFullPage) {
128
- preset.add([breakoutPlugin, {
129
- allowBreakoutButton: props.appearance === 'full-page'
130
- }]);
131
- }
132
- if (props.allowTextAlignment) {
133
- preset.add(alignmentPlugin);
134
- }
135
- preset.add(dataConsumerMarkPlugin);
136
- if (props.allowTextColor) {
137
- preset.add([textColorPlugin, props.allowTextColor]);
138
- }
139
-
140
- // Needs to be after allowTextColor as order of buttons in toolbar depends on it
141
- preset.add([listPlugin, {
142
- restartNumberedLists: featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.restartNumberedLists,
143
- restartNumberedListsToolbar: featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.restartNumberedListsToolbar,
144
- listNumberContinuity: featureFlags === null || featureFlags === void 0 ? void 0 : featureFlags.listNumberContinuity
145
- }]);
146
- if (props.allowRule) {
147
- preset.add(rulePlugin);
148
- }
149
- if (props.allowExpand) {
150
- preset.add([expandPlugin, {
151
- allowInsertion: isExpandInsertionEnabled(props),
152
- useLongPressSelection: false,
153
- appearance: props.appearance
154
- }]);
155
- }
156
- if (props.media) {
157
- preset.add([gridPlugin, {
158
- shouldCalcBreakoutGridLines: isFullPage
159
- }]);
160
- var alignLeftOnInsert = typeof props.media.alignLeftOnInsert !== 'undefined' ? props.media.alignLeftOnInsert : isComment;
161
- var showMediaLayoutOptions = typeof props.media.allowAdvancedToolBarOptions !== 'undefined' ? props.media.allowAdvancedToolBarOptions : isFullPage || isComment;
162
- preset.add([mediaPlugin, _objectSpread(_objectSpread({}, props.media), {}, {
163
- allowLazyLoading: !isMobile,
164
- allowBreakoutSnapPoints: isFullPage,
165
- allowAdvancedToolBarOptions: showMediaLayoutOptions,
166
- allowDropzoneDropLine: isFullPage,
167
- allowMediaSingleEditable: !isMobile,
168
- allowRemoteDimensionsFetch: !isMobile,
169
- editorSelectionAPI: editorSelectionAPI,
170
- // This is a wild one. I didnt quite understand what the code was doing
171
- // so a bit of guess for now.
172
- allowMarkingUploadsAsIncomplete: isMobile,
173
- fullWidthEnabled: props.appearance === 'full-width',
174
- uploadErrorHandler: props.uploadErrorHandler,
175
- waitForMediaUpload: props.waitForMediaUpload,
176
- isCopyPasteEnabled: !isMobile,
177
- alignLeftOnInsert: alignLeftOnInsert
178
- })]);
179
-
180
- // EDM-799: inside caption plugin we do the feature flag in enabling the plugin
181
- if (getMediaFeatureFlag('captions', props.media.featureFlags)) {
182
- preset.add(captionPlugin);
183
- }
184
- }
185
- if (props.mentionProvider) {
186
- var _props$mention$insert, _props$mention, _props$mention2;
187
- preset.add([mentionsPlugin, {
188
- createAnalyticsEvent: createAnalyticsEvent,
189
- sanitizePrivateContent: props.sanitizePrivateContent,
190
- insertDisplayName: (_props$mention$insert = (_props$mention = props.mention) === null || _props$mention === void 0 ? void 0 : _props$mention.insertDisplayName) !== null && _props$mention$insert !== void 0 ? _props$mention$insert : props.mentionInsertDisplayName,
191
- allowZeroWidthSpaceAfter: !isMobile,
192
- HighlightComponent: (_props$mention2 = props.mention) === null || _props$mention2 === void 0 ? void 0 : _props$mention2.HighlightComponent
193
- }]);
194
- }
195
- if (props.emojiProvider) {
196
- preset.add([emojiPlugin, {
197
- createAnalyticsEvent: createAnalyticsEvent
198
- }]);
199
- }
200
- if (props.allowTables) {
201
- var tableOptions = !props.allowTables || typeof props.allowTables === 'boolean' ? {} : props.allowTables;
202
- preset.add([tablesPlugin, {
203
- tableOptions: tableOptions,
204
- breakoutEnabled: props.appearance === 'full-page',
205
- allowContextualMenu: !isMobile,
206
- fullWidthEnabled: props.appearance === 'full-width',
207
- wasFullWidthEnabled: prevProps && prevProps.appearance === 'full-width',
208
- editorAnalyticsAPI: editorAnalyticsAPI,
209
- editorSelectionAPI: editorSelectionAPI,
210
- getEditorFeatureFlags: getEditorFeatureFlags
211
- }]);
212
- }
213
- if (props.allowTasksAndDecisions || props.taskDecisionProvider) {
214
- preset.add([tasksAndDecisionsPlugin, {
215
- allowNestedTasks: props.allowNestedTasks,
216
- consumeTabs: isFullPage,
217
- useLongPressSelection: false
218
- }]);
219
- }
220
- if (props.feedbackInfo) {
221
- preset.add([feedbackDialogPlugin, props.feedbackInfo]);
222
- }
223
- if (props.allowHelpDialog) {
224
- preset.add([helpDialogPlugin, !!props.legacyImageUploadProvider]);
225
- }
226
- if (props.saveOnEnter && props.onSave) {
227
- preset.add([saveOnEnterPlugin, props.onSave]);
228
- }
229
- if (props.legacyImageUploadProvider) {
230
- preset.add(imageUploadPlugin);
231
- if (!props.media) {
232
- preset.add([mediaPlugin, {
233
- allowMediaSingle: {
234
- disableLayout: true
235
- },
236
- allowMediaGroup: false,
237
- isCopyPasteEnabled: true,
238
- editorSelectionAPI: editorSelectionAPI
239
- }]);
240
- }
241
- }
242
- if (props.collabEdit || props.collabEditProvider) {
243
- var _collabEditOptions$EX;
244
- var collabEditOptions = {
245
- sanitizePrivateContent: props.sanitizePrivateContent,
246
- createAnalyticsEvent: createAnalyticsEvent
247
- };
248
- if (props.collabEdit) {
249
- collabEditOptions = _objectSpread(_objectSpread({}, props.collabEdit), collabEditOptions);
250
- }
251
- preset.add([collabEditPlugin, _objectSpread(_objectSpread({}, collabEditOptions), {}, {
252
- EXPERIMENTAL_allowInternalErrorAnalytics: (_collabEditOptions$EX = collabEditOptions.EXPERIMENTAL_allowInternalErrorAnalytics) !== null && _collabEditOptions$EX !== void 0 ? _collabEditOptions$EX : shouldForceTracking()
253
- })]);
254
- }
255
- if (props.maxContentSize) {
256
- preset.add([maxContentSizePlugin, props.maxContentSize]);
257
- }
258
- if (props.allowJiraIssue) {
259
- preset.add(jiraIssuePlugin);
260
- }
261
- if (props.allowPanel) {
262
- preset.add([panelPlugin, {
263
- useLongPressSelection: false,
264
- allowCustomPanel: props.allowPanel.allowCustomPanel,
265
- allowCustomPanelEdit: props.allowPanel.allowCustomPanelEdit
266
- }]);
267
- }
268
- if (props.allowExtension) {
269
- var extensionConfig = _typeof(props.allowExtension) === 'object' ? props.allowExtension : {};
270
- preset.add([extensionPlugin, {
271
- breakoutEnabled: props.appearance === 'full-page' && extensionConfig.allowBreakout !== false,
272
- allowAutoSave: extensionConfig.allowAutoSave,
273
- extensionHandlers: props.extensionHandlers,
274
- useLongPressSelection: false,
275
- appearance: appearance
276
- }]);
277
- }
278
- if (props.macroProvider) {
279
- preset.add(macroPlugin);
280
- }
281
-
282
- // See default list for when adding annotations with a provider
283
- if (!props.annotationProviders && props.allowConfluenceInlineComment) {
284
- preset.add([annotationPlugin, undefined]);
285
- }
286
- if (props.allowDate) {
287
- preset.add(datePlugin);
288
- }
289
- if (props.allowTemplatePlaceholders) {
290
- var options = props.allowTemplatePlaceholders !== true ? props.allowTemplatePlaceholders : {};
291
- preset.add([placeholderTextPlugin, options]);
292
- }
293
- if (props.allowLayouts) {
294
- preset.add([layoutPlugin, _objectSpread(_objectSpread({}, typeof props.allowLayouts === 'boolean' ? {} : props.allowLayouts), {}, {
295
- useLongPressSelection: false,
296
- UNSAFE_allowSingleColumnLayout: props.allowLayouts.UNSAFE_allowSingleColumnLayout
297
- })]);
298
- }
299
- if ((_props$linking3 = props.linking) !== null && _props$linking3 !== void 0 && _props$linking3.smartLinks || props.smartLinks || props.UNSAFE_cards) {
300
- var _props$linking4, _props$linking5;
301
- var fullWidthMode = props.appearance === 'full-width';
302
- preset.add([cardPlugin, _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, props.UNSAFE_cards), props.smartLinks), (_props$linking4 = props.linking) === null || _props$linking4 === void 0 ? void 0 : _props$linking4.smartLinks), {}, {
303
- platform: isMobile ? 'mobile' : 'web',
304
- fullWidthMode: fullWidthMode,
305
- createAnalyticsEvent: createAnalyticsEvent,
306
- linkPicker: (_props$linking5 = props.linking) === null || _props$linking5 === void 0 ? void 0 : _props$linking5.linkPicker
307
- })]);
308
- }
309
- if (props.autoformattingProvider) {
310
- preset.add(customAutoformatPlugin);
311
- }
312
- var statusMenuDisabled = true;
313
- if (props.allowStatus) {
314
- statusMenuDisabled = _typeof(props.allowStatus) === 'object' ? props.allowStatus.menuDisabled : false;
315
- preset.add([statusPlugin, {
316
- menuDisabled: statusMenuDisabled,
317
- allowZeroWidthSpaceAfter: !isMobile
318
- }]);
319
- }
320
- if (props.allowIndentation) {
321
- preset.add(indentationPlugin);
322
- }
323
- if (isFullPage) {
324
- preset.add(contextPanelPlugin);
325
- }
326
- if (props.autoScrollIntoView !== false) {
327
- preset.add(scrollIntoViewPlugin);
328
- }
329
- if (isMobile || props.allowUndoRedoButtons) {
330
- preset.add(historyPlugin);
331
- }
332
- if (isMobile) {
333
- preset.add(mobileDimensionsPlugin);
334
- preset.add(mobileSelectionPlugin);
335
- }
336
-
337
- // UI only plugins
338
- preset.add([toolbarListsIndentationPlugin, {
339
- showIndentationButtons: !!featureFlags.indentationButtonsInTheToolbar,
340
- allowHeadingAndParagraphIndentation: !!props.allowIndentation
341
- }]);
342
- preset.add([insertBlockPlugin, {
343
- allowTables: !!props.allowTables,
344
- allowExpand: isExpandInsertionEnabled(props),
345
- insertMenuItems: props.insertMenuItems,
346
- horizontalRuleEnabled: props.allowRule,
347
- nativeStatusSupported: !statusMenuDisabled,
348
- showElementBrowserLink: props.elementBrowser && props.elementBrowser.showModal || false,
349
- replacePlusMenuWithElementBrowser: props.elementBrowser && props.elementBrowser.replacePlusMenu || false,
350
- insertNodeAPI: insertNodeAPI
351
- }]);
352
- var hasBeforePrimaryToolbar = function hasBeforePrimaryToolbar(components) {
353
- if (components && 'before' in components) {
354
- return !!components.before;
355
- }
356
- return false;
357
- };
358
- if (hasBeforePrimaryToolbar(props.primaryToolbarComponents) && !featureFlags.twoLineEditorToolbar) {
359
- preset.add([beforePrimaryToolbarPlugin, {
360
- beforePrimaryToolbarComponents: props.primaryToolbarComponents.before
361
- }]);
362
- }
363
- if (featureFlags.showAvatarGroupAsPlugin === true && !featureFlags.twoLineEditorToolbar) {
364
- preset.add([avatarGroupPlugin, {
365
- collabEdit: props.collabEdit,
366
- takeFullWidth: !hasBeforePrimaryToolbar(props.primaryToolbarComponents)
367
- }]);
368
- }
369
- if (props.allowFindReplace) {
370
- preset.add([findReplacePlugin, {
371
- takeFullWidth: !!featureFlags.showAvatarGroupAsPlugin === false && !hasBeforePrimaryToolbar(props.primaryToolbarComponents),
372
- twoLineEditorToolbar: !!featureFlags.twoLineEditorToolbar
373
- }]);
374
- }
375
- if (props.allowFragmentMark) {
376
- preset.add(fragmentMarkPlugin);
377
- }
378
- if (featureFlags.enableViewUpdateSubscription) {
379
- preset.add(viewUpdateSubscriptionPlugin);
380
- }
381
- preset.add([codeBidiWarningPlugin, {
382
- appearance: props.appearance
383
- }]);
384
- if (featureFlags.floatingToolbarCopyButton) {
385
- preset.add(copyButtonPlugin);
386
- }
105
+ var preset = createUniversalPreset(props.appearance, getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEvent), createFeatureFlagsFromProps(props), prevProps === null || prevProps === void 0 ? void 0 : prevProps.appearance, createAnalyticsEvent, insertNodeAPI, editorAnalyticsAPI, editorSelectionAPI, getEditorContainerWidth);
387
106
  var excludes = new Set();
388
107
  if (!isCodeBlockAllowed({
389
108
  allowBlockType: props.allowBlockType
@@ -35,10 +35,10 @@ import { PortalProviderWithThemeProviders, PortalRenderer } from './ui/PortalPro
35
35
  import { nextMajorVersion } from './version-wrapper';
36
36
  import { ContextAdapter } from './nodeviews/context-adapter';
37
37
  import measurements from './utils/performance/measure-enum';
38
- import { combineQuickInsertProviders, extensionProviderToQuickInsertProvider } from './utils/extensions';
38
+ import prepareQuickInsertProvider from './utils/prepare-quick-insert-provider';
39
39
  import { fireAnalyticsEvent, EVENT_TYPE, ACTION_SUBJECT, ACTION } from './plugins/analytics';
40
40
  import ErrorBoundary from './create-editor/ErrorBoundary';
41
- import { createFeatureFlagsFromProps } from './plugins/feature-flags-context/feature-flags-from-props';
41
+ import { createFeatureFlagsFromProps } from './create-editor/feature-flags-from-props';
42
42
  import { RenderTracking } from './utils/performance/components/RenderTracking';
43
43
  var fullHeight = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n height: 100%;\n"])));
44
44
  var Editor = /*#__PURE__*/function (_React$Component) {
@@ -59,9 +59,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
59
59
  return combineExtensionProviders(extensionProviders);
60
60
  }));
61
61
  _defineProperty(_assertThisInitialized(_this), "prepareQuickInsertProvider", function (extensionProvider, quickInsert) {
62
- var quickInsertProvider = quickInsert && typeof quickInsert !== 'boolean' && quickInsert.provider;
63
- var extensionQuickInsertProvider = extensionProvider && extensionProviderToQuickInsertProvider(extensionProvider, _this.editorActions, _this.createAnalyticsEvent);
64
- return quickInsertProvider && extensionQuickInsertProvider ? combineQuickInsertProviders([quickInsertProvider, extensionQuickInsertProvider]) : quickInsertProvider || extensionQuickInsertProvider;
62
+ return prepareQuickInsertProvider(_this.editorActions, extensionProvider, quickInsert, _this.createAnalyticsEvent);
65
63
  });
66
64
  _defineProperty(_assertThisInitialized(_this), "handleSave", function (view) {
67
65
  if (!_this.props.onSave) {
@@ -121,10 +119,10 @@ var Editor = /*#__PURE__*/function (_React$Component) {
121
119
  }, (_props$performanceTra5 = props.performanceTracking) === null || _props$performanceTra5 === void 0 ? void 0 : (_props$performanceTra6 = _props$performanceTra5.ttiTracking) === null || _props$performanceTra6 === void 0 ? void 0 : _props$performanceTra6.ttiIdleThreshold, (_props$performanceTra7 = props.performanceTracking) === null || _props$performanceTra7 === void 0 ? void 0 : (_props$performanceTra8 = _props$performanceTra7.ttiTracking) === null || _props$performanceTra8 === void 0 ? void 0 : _props$performanceTra8.ttiCancelTimeout);
122
120
  }
123
121
  var _extensionProvider = _this.prepareExtensionProvider(props.extensionProviders);
124
- var _quickInsertProvider = _this.prepareQuickInsertProvider(_extensionProvider, props.quickInsert);
122
+ var quickInsertProvider = _this.prepareQuickInsertProvider(_extensionProvider, props.quickInsert);
125
123
  _this.state = {
126
124
  extensionProvider: _extensionProvider,
127
- quickInsertProvider: _quickInsertProvider
125
+ quickInsertProvider: quickInsertProvider
128
126
  };
129
127
  return _this;
130
128
  }