@atlaskit/editor-core 150.0.3 → 151.0.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 (195) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/cjs/actions/index.js +5 -23
  3. package/dist/cjs/create-editor/ErrorBoundary.js +113 -79
  4. package/dist/cjs/create-editor/ReactEditorView.js +145 -31
  5. package/dist/cjs/create-editor/create-plugins-list.js +4 -2
  6. package/dist/cjs/editor.js +101 -40
  7. package/dist/cjs/labs/next/presets/cxhtml.js +2 -1
  8. package/dist/cjs/plugins/analytics/types/enums.js +3 -1
  9. package/dist/cjs/plugins/base/index.js +4 -3
  10. package/dist/cjs/plugins/base/pm-plugins/frozen-editor.js +66 -36
  11. package/dist/cjs/plugins/block-type/ui/ToolbarBlockType/styled.js +3 -1
  12. package/dist/cjs/plugins/card/index.js +13 -2
  13. package/dist/cjs/plugins/card/nodeviews/embedCard.js +1 -0
  14. package/dist/cjs/plugins/card/pm-plugins/main.js +7 -2
  15. package/dist/cjs/plugins/card/pm-plugins/util/resolve.js +10 -3
  16. package/dist/cjs/plugins/code-block/toolbar.js +1 -1
  17. package/dist/cjs/plugins/emoji/styles.js +1 -1
  18. package/dist/cjs/plugins/extension/pm-plugins/main.js +1 -4
  19. package/dist/cjs/plugins/extension/toolbar.js +28 -23
  20. package/dist/cjs/plugins/feature-flags-context/feature-flags-from-props.js +8 -3
  21. package/dist/cjs/plugins/find-replace/ui/Find.js +27 -7
  22. package/dist/cjs/plugins/hyperlink/pm-plugins/keymap.js +3 -3
  23. package/dist/cjs/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +7 -4
  24. package/dist/cjs/plugins/hyperlink/utils.js +6 -69
  25. package/dist/cjs/plugins/media/index.js +14 -3
  26. package/dist/cjs/plugins/media/nodeviews/mediaGroup.js +24 -10
  27. package/dist/cjs/plugins/media/nodeviews/mediaInline.js +179 -0
  28. package/dist/cjs/plugins/media/pm-plugins/main.js +18 -9
  29. package/dist/cjs/plugins/media/toolbar/index.js +49 -17
  30. package/dist/cjs/plugins/media/toolbar/utils.js +20 -2
  31. package/dist/cjs/plugins/media/utils/media-files.js +67 -1
  32. package/dist/cjs/plugins/panel/index.js +2 -3
  33. package/dist/cjs/plugins/panel/message.js +47 -0
  34. package/dist/cjs/plugins/panel/toolbar.js +64 -84
  35. package/dist/cjs/plugins/panel/utils.js +2 -2
  36. package/dist/cjs/plugins/paste/linkify-md-plugin.js +3 -3
  37. package/dist/cjs/plugins/status/styles.js +1 -1
  38. package/dist/cjs/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +18 -2
  39. package/dist/cjs/profiler/render-count.js +82 -0
  40. package/dist/cjs/ui/Appearance/Comment/Comment.js +6 -5
  41. package/dist/cjs/utils/react-hooks/use-component-renderer-tracking/index.js +55 -19
  42. package/dist/cjs/version-wrapper.js +1 -1
  43. package/dist/cjs/version.json +1 -1
  44. package/dist/es2019/actions/index.js +6 -28
  45. package/dist/es2019/create-editor/ErrorBoundary.js +73 -60
  46. package/dist/es2019/create-editor/ReactEditorView.js +130 -23
  47. package/dist/es2019/create-editor/create-plugins-list.js +4 -2
  48. package/dist/es2019/editor.js +74 -35
  49. package/dist/es2019/labs/next/presets/cxhtml.js +2 -1
  50. package/dist/es2019/plugins/analytics/types/enums.js +3 -1
  51. package/dist/es2019/plugins/base/index.js +4 -3
  52. package/dist/es2019/plugins/base/pm-plugins/frozen-editor.js +63 -35
  53. package/dist/es2019/plugins/block-type/ui/ToolbarBlockType/styled.js +2 -1
  54. package/dist/es2019/plugins/card/index.js +7 -2
  55. package/dist/es2019/plugins/card/nodeviews/embedCard.js +1 -0
  56. package/dist/es2019/plugins/card/pm-plugins/main.js +9 -2
  57. package/dist/es2019/plugins/card/pm-plugins/util/resolve.js +12 -5
  58. package/dist/es2019/plugins/code-block/toolbar.js +1 -1
  59. package/dist/es2019/plugins/emoji/styles.js +2 -0
  60. package/dist/es2019/plugins/extension/pm-plugins/main.js +1 -4
  61. package/dist/es2019/plugins/extension/toolbar.js +30 -25
  62. package/dist/es2019/plugins/feature-flags-context/feature-flags-from-props.js +8 -4
  63. package/dist/es2019/plugins/find-replace/ui/Find.js +27 -6
  64. package/dist/es2019/plugins/hyperlink/pm-plugins/keymap.js +1 -1
  65. package/dist/es2019/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +7 -4
  66. package/dist/es2019/plugins/hyperlink/utils.js +3 -59
  67. package/dist/es2019/plugins/media/index.js +13 -4
  68. package/dist/es2019/plugins/media/nodeviews/mediaGroup.js +16 -7
  69. package/dist/es2019/plugins/media/nodeviews/mediaInline.js +88 -0
  70. package/dist/es2019/plugins/media/pm-plugins/main.js +20 -11
  71. package/dist/es2019/plugins/media/toolbar/index.js +44 -15
  72. package/dist/es2019/plugins/media/toolbar/utils.js +16 -0
  73. package/dist/es2019/plugins/media/utils/media-files.js +68 -2
  74. package/dist/es2019/plugins/panel/index.js +3 -4
  75. package/dist/es2019/plugins/panel/message.js +38 -0
  76. package/dist/es2019/plugins/panel/toolbar.js +52 -71
  77. package/dist/es2019/plugins/panel/utils.js +2 -2
  78. package/dist/es2019/plugins/paste/linkify-md-plugin.js +2 -2
  79. package/dist/es2019/plugins/status/styles.js +2 -0
  80. package/dist/es2019/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +18 -2
  81. package/dist/es2019/profiler/render-count.js +60 -0
  82. package/dist/es2019/ui/Appearance/Comment/Comment.js +4 -2
  83. package/dist/es2019/utils/react-hooks/use-component-renderer-tracking/index.js +51 -18
  84. package/dist/es2019/version-wrapper.js +1 -1
  85. package/dist/es2019/version.json +1 -1
  86. package/dist/esm/actions/index.js +6 -24
  87. package/dist/esm/create-editor/ErrorBoundary.js +113 -78
  88. package/dist/esm/create-editor/ReactEditorView.js +146 -31
  89. package/dist/esm/create-editor/create-plugins-list.js +4 -2
  90. package/dist/esm/editor.js +100 -40
  91. package/dist/esm/labs/next/presets/cxhtml.js +2 -1
  92. package/dist/esm/plugins/analytics/types/enums.js +3 -1
  93. package/dist/esm/plugins/base/index.js +4 -3
  94. package/dist/esm/plugins/base/pm-plugins/frozen-editor.js +64 -36
  95. package/dist/esm/plugins/block-type/ui/ToolbarBlockType/styled.js +3 -1
  96. package/dist/esm/plugins/card/index.js +13 -2
  97. package/dist/esm/plugins/card/nodeviews/embedCard.js +1 -0
  98. package/dist/esm/plugins/card/pm-plugins/main.js +7 -2
  99. package/dist/esm/plugins/card/pm-plugins/util/resolve.js +12 -5
  100. package/dist/esm/plugins/code-block/toolbar.js +1 -1
  101. package/dist/esm/plugins/emoji/styles.js +1 -1
  102. package/dist/esm/plugins/extension/pm-plugins/main.js +1 -4
  103. package/dist/esm/plugins/extension/toolbar.js +28 -23
  104. package/dist/esm/plugins/feature-flags-context/feature-flags-from-props.js +8 -4
  105. package/dist/esm/plugins/find-replace/ui/Find.js +27 -7
  106. package/dist/esm/plugins/hyperlink/pm-plugins/keymap.js +1 -1
  107. package/dist/esm/plugins/hyperlink/ui/HyperlinkAddToolbar/HyperlinkAddToolbar.js +7 -4
  108. package/dist/esm/plugins/hyperlink/utils.js +3 -59
  109. package/dist/esm/plugins/media/index.js +14 -4
  110. package/dist/esm/plugins/media/nodeviews/mediaGroup.js +24 -10
  111. package/dist/esm/plugins/media/nodeviews/mediaInline.js +147 -0
  112. package/dist/esm/plugins/media/pm-plugins/main.js +19 -11
  113. package/dist/esm/plugins/media/toolbar/index.js +47 -19
  114. package/dist/esm/plugins/media/toolbar/utils.js +15 -1
  115. package/dist/esm/plugins/media/utils/media-files.js +60 -2
  116. package/dist/esm/plugins/panel/index.js +3 -4
  117. package/dist/esm/plugins/panel/message.js +38 -0
  118. package/dist/esm/plugins/panel/toolbar.js +57 -77
  119. package/dist/esm/plugins/panel/utils.js +2 -2
  120. package/dist/esm/plugins/paste/linkify-md-plugin.js +2 -2
  121. package/dist/esm/plugins/status/styles.js +1 -1
  122. package/dist/esm/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +18 -2
  123. package/dist/esm/profiler/render-count.js +57 -0
  124. package/dist/esm/ui/Appearance/Comment/Comment.js +6 -5
  125. package/dist/esm/utils/react-hooks/use-component-renderer-tracking/index.js +53 -20
  126. package/dist/esm/version-wrapper.js +1 -1
  127. package/dist/esm/version.json +1 -1
  128. package/dist/types/create-editor/ErrorBoundary.d.ts +6 -6
  129. package/dist/types/create-editor/ReactEditorView.d.ts +15 -3
  130. package/dist/types/editor.d.ts +2 -0
  131. package/dist/types/plugins/analytics/index.d.ts +1 -1
  132. package/dist/types/plugins/analytics/types/enums.d.ts +4 -2
  133. package/dist/types/plugins/analytics/types/events.d.ts +7 -2
  134. package/dist/types/plugins/analytics/types/general-events.d.ts +4 -1
  135. package/dist/types/plugins/analytics/types/index.d.ts +1 -1
  136. package/dist/types/plugins/analytics/types/insert-events.d.ts +6 -1
  137. package/dist/types/plugins/analytics/types/link-tool-bar-events.d.ts +1 -0
  138. package/dist/types/plugins/base/index.d.ts +1 -0
  139. package/dist/types/plugins/base/pm-plugins/frozen-editor.d.ts +3 -2
  140. package/dist/types/plugins/card/pm-plugins/main.d.ts +2 -3
  141. package/dist/types/plugins/card/pm-plugins/util/resolve.d.ts +2 -1
  142. package/dist/types/plugins/card/types.d.ts +6 -0
  143. package/dist/types/plugins/extension/types.d.ts +0 -2
  144. package/dist/types/plugins/feature-flags-context/get-enabled-feature-flag-keys.d.ts +1 -1
  145. package/dist/types/plugins/floating-toolbar/types.d.ts +1 -1
  146. package/dist/types/plugins/floating-toolbar/ui/Select.d.ts +1 -1
  147. package/dist/types/plugins/hyperlink/utils.d.ts +0 -21
  148. package/dist/types/plugins/media/nodeviews/mediaInline.d.ts +27 -0
  149. package/dist/types/plugins/media/pm-plugins/main.d.ts +2 -2
  150. package/dist/types/plugins/media/toolbar/utils.d.ts +2 -0
  151. package/dist/types/plugins/media/utils/media-files.d.ts +8 -0
  152. package/dist/types/plugins/panel/message.d.ts +37 -0
  153. package/dist/types/plugins/panel/toolbar.d.ts +4 -37
  154. package/dist/types/plugins/panel/types.d.ts +1 -0
  155. package/dist/types/profiler/render-count.d.ts +14 -0
  156. package/dist/types/types/feature-flags.d.ts +8 -0
  157. package/dist/types/ui/LinkSearch/types.d.ts +1 -0
  158. package/dist/types/utils/react-hooks/use-component-renderer-tracking/index.d.ts +17 -1
  159. package/package.json +19 -16
  160. package/dist/cjs/plugins/caption/nodeviews/index.test.js +0 -135
  161. package/dist/cjs/plugins/caption/pm-plugins/keymap.test.js +0 -203
  162. package/dist/cjs/plugins/caption/pm-plugins/main.test.js +0 -141
  163. package/dist/cjs/plugins/code-block/language-list.test.js +0 -74
  164. package/dist/cjs/plugins/extension/ui/SaveIndicator/SaveIndicator.test.js +0 -101
  165. package/dist/cjs/plugins/floating-toolbar/ui/EmojiPickerButton.test.js +0 -98
  166. package/dist/cjs/plugins/media/commands/captions.test.js +0 -149
  167. package/dist/cjs/plugins/media/commands/linking.test.js +0 -296
  168. package/dist/cjs/plugins/media/ui/CaptionPlaceholder/index.test.js +0 -50
  169. package/dist/cjs/plugins/panel/toolbar.test.js +0 -250
  170. package/dist/cjs/ui/ColorPickerButton/index.test.js +0 -123
  171. package/dist/cjs/ui/PortalProvider/index.test.js +0 -139
  172. package/dist/es2019/plugins/caption/nodeviews/index.test.js +0 -122
  173. package/dist/es2019/plugins/caption/pm-plugins/keymap.test.js +0 -193
  174. package/dist/es2019/plugins/caption/pm-plugins/main.test.js +0 -132
  175. package/dist/es2019/plugins/code-block/language-list.test.js +0 -69
  176. package/dist/es2019/plugins/extension/ui/SaveIndicator/SaveIndicator.test.js +0 -83
  177. package/dist/es2019/plugins/floating-toolbar/ui/EmojiPickerButton.test.js +0 -85
  178. package/dist/es2019/plugins/media/commands/captions.test.js +0 -126
  179. package/dist/es2019/plugins/media/commands/linking.test.js +0 -208
  180. package/dist/es2019/plugins/media/ui/CaptionPlaceholder/index.test.js +0 -41
  181. package/dist/es2019/plugins/panel/toolbar.test.js +0 -200
  182. package/dist/es2019/ui/ColorPickerButton/index.test.js +0 -88
  183. package/dist/es2019/ui/PortalProvider/index.test.js +0 -115
  184. package/dist/esm/plugins/caption/nodeviews/index.test.js +0 -125
  185. package/dist/esm/plugins/caption/pm-plugins/keymap.test.js +0 -195
  186. package/dist/esm/plugins/caption/pm-plugins/main.test.js +0 -124
  187. package/dist/esm/plugins/code-block/language-list.test.js +0 -71
  188. package/dist/esm/plugins/extension/ui/SaveIndicator/SaveIndicator.test.js +0 -92
  189. package/dist/esm/plugins/floating-toolbar/ui/EmojiPickerButton.test.js +0 -85
  190. package/dist/esm/plugins/media/commands/captions.test.js +0 -135
  191. package/dist/esm/plugins/media/commands/linking.test.js +0 -268
  192. package/dist/esm/plugins/media/ui/CaptionPlaceholder/index.test.js +0 -41
  193. package/dist/esm/plugins/panel/toolbar.test.js +0 -230
  194. package/dist/esm/ui/ColorPickerButton/index.test.js +0 -107
  195. package/dist/esm/ui/PortalProvider/index.test.js +0 -129
@@ -41,30 +41,35 @@ const isLayoutSupported = (state, selectedExtNode) => {
41
41
  return !!((selectedExtNode.node.type === bodiedExtension || selectedExtNode.node.type === extension && !hasParentNodeOfType([bodiedExtension, table, expand].filter(Boolean))(selection)) && !hasParentNodeOfType([layoutSection])(selection));
42
42
  };
43
43
 
44
- const breakoutOptions = (state, formatMessage, extensionState, breakoutEnabled) => {
45
- const nodeWithPos = getSelectedExtension(state, true);
46
- const {
47
- layout
48
- } = extensionState;
49
- return nodeWithPos && breakoutEnabled && isLayoutSupported(state, nodeWithPos) ? [{
50
- type: 'button',
51
- icon: CenterIcon,
52
- onClick: updateExtensionLayout('default'),
53
- selected: layout === 'default',
54
- title: formatMessage(commonMessages.layoutFixedWidth)
55
- }, {
56
- type: 'button',
57
- icon: WideIcon,
58
- onClick: updateExtensionLayout('wide'),
59
- selected: layout === 'wide',
60
- title: formatMessage(commonMessages.layoutWide)
61
- }, {
62
- type: 'button',
63
- icon: FullWidthIcon,
64
- onClick: updateExtensionLayout('full-width'),
65
- selected: layout === 'full-width',
66
- title: formatMessage(commonMessages.layoutFullWidth)
67
- }] : [];
44
+ const breakoutOptions = (state, formatMessage, breakoutEnabled) => {
45
+ const nodeWithPos = getSelectedExtension(state, true); // we should only return breakout options when breakouts are enabled and the node supports them
46
+
47
+ if (nodeWithPos && breakoutEnabled && isLayoutSupported(state, nodeWithPos)) {
48
+ const {
49
+ layout
50
+ } = nodeWithPos.node.attrs;
51
+ return [{
52
+ type: 'button',
53
+ icon: CenterIcon,
54
+ onClick: updateExtensionLayout('default'),
55
+ selected: layout === 'default',
56
+ title: formatMessage(commonMessages.layoutFixedWidth)
57
+ }, {
58
+ type: 'button',
59
+ icon: WideIcon,
60
+ onClick: updateExtensionLayout('wide'),
61
+ selected: layout === 'wide',
62
+ title: formatMessage(commonMessages.layoutWide)
63
+ }, {
64
+ type: 'button',
65
+ icon: FullWidthIcon,
66
+ onClick: updateExtensionLayout('full-width'),
67
+ selected: layout === 'full-width',
68
+ title: formatMessage(commonMessages.layoutFullWidth)
69
+ }];
70
+ }
71
+
72
+ return [];
68
73
  };
69
74
 
70
75
  const editButton = (formatMessage, extensionState) => {
@@ -99,7 +104,7 @@ export const getToolbarConfig = (breakoutEnabled = true) => (state, intl) => {
99
104
  if (extensionState && !extensionState.showContextPanel && extensionState.element) {
100
105
  const nodeType = [state.schema.nodes.extension, state.schema.nodes.inlineExtension, state.schema.nodes.bodiedExtension];
101
106
  const editButtonArray = editButton(formatMessage, extensionState);
102
- const breakoutButtonArray = breakoutOptions(state, formatMessage, extensionState, breakoutEnabled);
107
+ const breakoutButtonArray = breakoutOptions(state, formatMessage, breakoutEnabled);
103
108
  return {
104
109
  title: 'Extension floating controls',
105
110
  getDomRef: () => extensionState.element.parentElement || undefined,
@@ -1,13 +1,15 @@
1
1
  import { normalizeFeatureFlags } from '@atlaskit/editor-common/normalize-feature-flags';
2
-
2
+ import { browser } from '@atlaskit/editor-common';
3
3
  /**
4
4
  * Transforms EditorProps to an FeatureFlags object,
5
5
  * which is used by both current and archv3 editors.
6
6
  */
7
+
7
8
  export function createFeatureFlagsFromProps(props) {
8
- var _props$allowTextColor, _props$performanceTra, _props$performanceTra2, _props$featureFlags, _props$featureFlags2, _props$featureFlags3, _props$allowTables, _props$featureFlags4, _props$featureFlags5, _props$allowTables2, _props$featureFlags6, _props$featureFlags7, _props$allowTables3, _props$featureFlags8, _props$featureFlags9, _props$allowTables4, _props$featureFlags10, _props$featureFlags11, _props$allowTables5, _props$allowExtension, _props$featureFlags12, _props$featureFlags13, _props$featureFlags14, _props$featureFlags15, _props$featureFlags16, _props$featureFlags17, _props$featureFlags18, _props$featureFlags19, _props$featureFlags20, _props$featureFlags21, _props$featureFlags22, _props$featureFlags23, _props$featureFlags24, _props$featureFlags25;
9
+ var _props$allowTextColor, _props$performanceTra, _props$performanceTra2, _props$featureFlags, _props$featureFlags2, _props$featureFlags3, _props$allowTables, _props$featureFlags4, _props$featureFlags5, _props$allowTables2, _props$featureFlags6, _props$featureFlags7, _props$allowTables3, _props$featureFlags8, _props$featureFlags9, _props$allowTables4, _props$featureFlags10, _props$featureFlags11, _props$allowTables5, _props$allowExtension, _props$featureFlags12, _props$featureFlags13, _props$featureFlags14, _props$featureFlags15, _props$featureFlags16, _props$featureFlags17, _props$featureFlags18, _props$featureFlags19, _props$featureFlags20, _props$featureFlags21, _props$featureFlags22, _props$featureFlags23, _props$featureFlags24, _props$featureFlags25, _props$featureFlags26, _props$featureFlags27;
9
10
 
10
- return { ...normalizeFeatureFlags(props.featureFlags),
11
+ const normalizedFeatureFlags = normalizeFeatureFlags(props.featureFlags);
12
+ return { ...normalizedFeatureFlags,
11
13
  newInsertionBehaviour: props.allowNewInsertionBehaviour,
12
14
  interactiveExpand: typeof props.allowExpand === 'boolean' ? props.allowExpand : Boolean(props.allowExpand && props.allowExpand.allowInteractiveExpand !== false),
13
15
  placeholderBracketHint: !!props.placeholderBracketHint,
@@ -32,6 +34,8 @@ export function createFeatureFlagsFromProps(props) {
32
34
  errorBoundaryDocStructure: Boolean(typeof ((_props$featureFlags18 = props.featureFlags) === null || _props$featureFlags18 === void 0 ? void 0 : _props$featureFlags18.useErrorBoundaryDocStructure) === 'boolean' ? !!((_props$featureFlags19 = props.featureFlags) !== null && _props$featureFlags19 !== void 0 && _props$featureFlags19.useErrorBoundaryDocStructure) : false),
33
35
  synchronyErrorDocStructure: Boolean(typeof ((_props$featureFlags20 = props.featureFlags) === null || _props$featureFlags20 === void 0 ? void 0 : _props$featureFlags20.synchronyErrorDocStructure) === 'boolean' ? !!((_props$featureFlags21 = props.featureFlags) !== null && _props$featureFlags21 !== void 0 && _props$featureFlags21.synchronyErrorDocStructure) : false),
34
36
  enableViewUpdateSubscription: Boolean(typeof ((_props$featureFlags22 = props.featureFlags) === null || _props$featureFlags22 === void 0 ? void 0 : _props$featureFlags22.enableViewUpdateSubscription) === 'boolean' ? !!((_props$featureFlags23 = props.featureFlags) !== null && _props$featureFlags23 !== void 0 && _props$featureFlags23.enableViewUpdateSubscription) : false),
35
- collabAvatarScroll: Boolean(typeof ((_props$featureFlags24 = props.featureFlags) === null || _props$featureFlags24 === void 0 ? void 0 : _props$featureFlags24.collabAvatarScroll) === 'boolean' ? !!((_props$featureFlags25 = props.featureFlags) !== null && _props$featureFlags25 !== void 0 && _props$featureFlags25.collabAvatarScroll) : false)
37
+ collabAvatarScroll: Boolean(typeof ((_props$featureFlags24 = props.featureFlags) === null || _props$featureFlags24 === void 0 ? void 0 : _props$featureFlags24.collabAvatarScroll) === 'boolean' ? !!((_props$featureFlags25 = props.featureFlags) !== null && _props$featureFlags25 !== void 0 && _props$featureFlags25.collabAvatarScroll) : false),
38
+ ufo: Boolean(typeof ((_props$featureFlags26 = props.featureFlags) === null || _props$featureFlags26 === void 0 ? void 0 : _props$featureFlags26.ufo) === 'boolean' ? !!((_props$featureFlags27 = props.featureFlags) !== null && _props$featureFlags27 !== void 0 && _props$featureFlags27.ufo) : false),
39
+ codeBlockSyntaxHighlighting: Boolean(typeof normalizedFeatureFlags.codeBlockSyntaxHighlighting === 'boolean' ? !!normalizedFeatureFlags.codeBlockSyntaxHighlighting && !browser.safari : false)
36
40
  };
37
41
  }
@@ -71,12 +71,17 @@ class Find extends React.Component {
71
71
  }
72
72
  });
73
73
 
74
- _defineProperty(this, "handleFindChange", event => this.skipWhileComposing(() => {
74
+ _defineProperty(this, "handleFindChange", event => {
75
75
  this.updateFindValue(event.target.value);
76
- }));
76
+ });
77
77
 
78
78
  _defineProperty(this, "updateFindValue", value => {
79
- this.props.onFind(value);
79
+ this.setState({
80
+ localFindText: value
81
+ });
82
+ this.skipWhileComposing(() => {
83
+ this.props.onFind(value);
84
+ });
80
85
  });
81
86
 
82
87
  _defineProperty(this, "handleFindKeyDown", event => this.skipWhileComposing(() => {
@@ -153,7 +158,13 @@ class Find extends React.Component {
153
158
  });
154
159
  this.closeIcon = /*#__PURE__*/React.createElement(EditorCloseIcon, {
155
160
  label: this.closeFindReplaceDialog
156
- });
161
+ }); // We locally manage the value of the input inside this component in order to support compositions.
162
+ // This requires some additional work inside componentDidUpdate to ensure we support changes that
163
+ // occur to this value which do not originate from this component.
164
+
165
+ this.state = {
166
+ localFindText: this.props.findText || ''
167
+ };
157
168
  }
158
169
 
159
170
  componentDidMount() {
@@ -162,7 +173,17 @@ class Find extends React.Component {
162
173
  }
163
174
 
164
175
  componentDidUpdate() {
165
- this.focusFindTextfield();
176
+ this.focusFindTextfield(); // If the external prop findText changes and we aren't in a composition we should update to the
177
+ // use the external prop value.
178
+ //
179
+ // An example of where this may happen is when a find occurs through the user selecting some text
180
+ // and pressing Mod-f.
181
+
182
+ if (!this.isComposing && this.props.findText !== this.state.localFindText) {
183
+ this.setState({
184
+ localFindText: this.props.findText || ''
185
+ });
186
+ }
166
187
  }
167
188
 
168
189
  render() {
@@ -183,7 +204,7 @@ class Find extends React.Component {
183
204
  name: "find",
184
205
  appearance: "none",
185
206
  placeholder: this.find,
186
- value: findText,
207
+ value: this.state.localFindText,
187
208
  ref: this.findTextfieldRef,
188
209
  autoComplete: "off",
189
210
  onChange: this.handleFindChange,
@@ -1,6 +1,6 @@
1
1
  import { keymap } from 'prosemirror-keymap';
2
+ import { getLinkMatch } from '@atlaskit/adf-schema';
2
3
  import * as keymaps from '../../../keymaps';
3
- import { getLinkMatch } from '../utils';
4
4
  import { stateKey } from '../pm-plugins/main';
5
5
  import { showLinkToolbar, hideLinkToolbar } from '../commands';
6
6
  import { queueCards } from '../../card/pm-plugins/actions';
@@ -83,7 +83,8 @@ const mapActivityProviderResultToLinkSearchItemData = ({
83
83
  container,
84
84
  iconUrl,
85
85
  url,
86
- lastViewedDate: viewedTimestamp ? new Date(viewedTimestamp) : undefined
86
+ lastViewedDate: viewedTimestamp ? new Date(viewedTimestamp) : undefined,
87
+ prefetch: true
87
88
  });
88
89
 
89
90
  const mapSearchProviderResultToLinkSearchItemData = ({
@@ -99,7 +100,8 @@ const mapSearchProviderResultToLinkSearchItemData = ({
99
100
  name: title,
100
101
  url,
101
102
  lastUpdatedDate: updatedTimestamp ? new Date(updatedTimestamp) : undefined,
102
- icon: contentType && mapContentTypeToIcon[contentType] || defaultIcon
103
+ icon: contentType && mapContentTypeToIcon[contentType] || defaultIcon,
104
+ prefetch: false
103
105
  });
104
106
 
105
107
  export class HyperlinkLinkAddToolbar extends PureComponent {
@@ -344,7 +346,7 @@ export class HyperlinkLinkAddToolbar extends PureComponent {
344
346
  }
345
347
 
346
348
  if (interaction === 'click' || this.isUrlPopulatedWithSelectedItem()) {
347
- var _pluginState$searchSe3;
349
+ var _pluginState$searchSe3, _selectedItem$prefetc;
348
350
 
349
351
  /**
350
352
  * When it's a mouse click even or the selectedItem.url matches displayUrl, we think
@@ -361,7 +363,8 @@ export class HyperlinkLinkAddToolbar extends PureComponent {
361
363
  trigger: interaction,
362
364
  resultCount: items.length,
363
365
  selectedResultId: selectedItem.objectId,
364
- selectedRelativePosition: selectedIndex
366
+ selectedRelativePosition: selectedIndex,
367
+ prefetch: (_selectedItem$prefetc = selectedItem.prefetch) !== null && _selectedItem$prefetc !== void 0 ? _selectedItem$prefetc : false
365
368
  },
366
369
  eventType: EVENT_TYPE.UI
367
370
  });
@@ -1,26 +1,5 @@
1
- import LinkifyIt from 'linkify-it';
2
1
  import { mapSlice } from '../../utils/slice';
3
- import { isSafeUrl } from '@atlaskit/adf-schema';
4
- export const LINK_REGEXP = /(https?|ftp):\/\/[^\s]+/;
5
- const linkify = LinkifyIt();
6
- linkify.add('sourcetree:', 'http:');
7
- const tlds = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');
8
- const tlds2Char = 'a[cdefgilmnoqrtuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrtuvwxyz]|n[acefgilopruz]|om|p[aefghkmnrtw]|qa|r[eosuw]|s[abcdegijklmnrtuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';
9
- tlds.push(tlds2Char);
10
- linkify.tlds(tlds, false);
11
- export function getLinkMatch(str) {
12
- if (!str) {
13
- return null;
14
- }
15
-
16
- let match = linkifyMatch(str);
17
-
18
- if (!match.length) {
19
- match = linkify.match(str);
20
- }
21
-
22
- return match && match[0];
23
- }
2
+ import { isSafeUrl, linkify, normalizeUrl as normaliseLinkHref } from '@atlaskit/adf-schema';
24
3
  /**
25
4
  * Instance of class LinkMatcher are used in autoformatting in place of Regex.
26
5
  * Hence it has been made similar to regex with an exec method.
@@ -81,8 +60,7 @@ export function normalizeUrl(url) {
81
60
  return url;
82
61
  }
83
62
 
84
- const match = getLinkMatch(url);
85
- return match && match.url || '';
63
+ return normaliseLinkHref(url);
86
64
  }
87
65
  export function linkifyContent(schema) {
88
66
  return slice => mapSlice(slice, (node, parent) => {
@@ -148,38 +126,4 @@ function findLinkMatches(text) {
148
126
  }
149
127
 
150
128
  return matches;
151
- }
152
-
153
- export const linkifyMatch = text => {
154
- const matches = [];
155
-
156
- if (!LINK_REGEXP.test(text)) {
157
- return matches;
158
- }
159
-
160
- let startpos = 0;
161
- let substr;
162
-
163
- while (substr = text.substr(startpos)) {
164
- const link = (substr.match(LINK_REGEXP) || [''])[0];
165
-
166
- if (link) {
167
- const index = substr.search(LINK_REGEXP);
168
- const start = index >= 0 ? index + startpos : index;
169
- const end = start + link.length;
170
- matches.push({
171
- index: start,
172
- lastIndex: end,
173
- raw: link,
174
- url: link,
175
- text: link,
176
- schema: ''
177
- });
178
- startpos += end;
179
- } else {
180
- break;
181
- }
182
- }
183
-
184
- return matches;
185
- };
129
+ }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { media, mediaGroup, mediaSingle, mediaSingleWithCaption } from '@atlaskit/adf-schema';
2
+ import { media, mediaGroup, mediaSingle, mediaSingleWithCaption, mediaInline } from '@atlaskit/adf-schema';
3
3
  import { stateKey as pluginKey, createPlugin } from './pm-plugins/main';
4
4
  import { getMediaFeatureFlag } from '@atlaskit/media-common';
5
5
  import { createPlugin as createMediaEditorPlugin } from './pm-plugins/media-editor';
@@ -21,6 +21,7 @@ import MediaEditor from './ui/MediaEditor';
21
21
  import { MediaPickerComponents } from './ui/MediaPicker';
22
22
  import { messages } from '../insert-block/ui/ToolbarInsertBlock/messages';
23
23
  import { ReactMediaNode } from './nodeviews/mediaNodeView';
24
+ import { ReactMediaInlineNode } from './nodeviews/mediaInline';
24
25
  export { insertMediaSingleNode } from './utils/media-single';
25
26
 
26
27
  const mediaPlugin = options => ({
@@ -30,6 +31,7 @@ const mediaPlugin = options => ({
30
31
  const {
31
32
  allowMediaGroup = true,
32
33
  allowMediaSingle = false,
34
+ allowMediaInline = false,
33
35
  featureFlags
34
36
  } = options || {};
35
37
  const captions = getMediaFeatureFlag('captions', featureFlags);
@@ -43,6 +45,9 @@ const mediaPlugin = options => ({
43
45
  }, {
44
46
  name: 'media',
45
47
  node: media
48
+ }, {
49
+ name: 'mediaInline',
50
+ node: mediaInline
46
51
  }].filter(node => {
47
52
  if (node.name === 'mediaGroup') {
48
53
  return allowMediaGroup;
@@ -52,6 +57,10 @@ const mediaPlugin = options => ({
52
57
  return allowMediaSingle;
53
58
  }
54
59
 
60
+ if (node.name === 'mediaInline') {
61
+ return allowMediaInline;
62
+ }
63
+
55
64
  return true;
56
65
  });
57
66
  },
@@ -73,7 +82,8 @@ const mediaPlugin = options => ({
73
82
  nodeViews: {
74
83
  mediaGroup: ReactMediaGroupNode(portalProviderAPI, eventDispatcher, providerFactory, options),
75
84
  mediaSingle: ReactMediaSingleNode(portalProviderAPI, eventDispatcher, providerFactory, dispatchAnalyticsEvent, options),
76
- media: ReactMediaNode(portalProviderAPI, eventDispatcher, providerFactory, options)
85
+ media: ReactMediaNode(portalProviderAPI, eventDispatcher, providerFactory, options),
86
+ mediaInline: ReactMediaInlineNode(portalProviderAPI, eventDispatcher, providerFactory)
77
87
  },
78
88
  errorReporter,
79
89
  uploadErrorHandler: options && options.uploadErrorHandler,
@@ -197,8 +207,7 @@ const mediaPlugin = options => ({
197
207
  action(insert, state) {
198
208
  const pluginState = pluginKey.getState(state);
199
209
  pluginState.showMediaPicker();
200
- const tr = insert('');
201
- return addAnalytics(state, tr, {
210
+ return addAnalytics(state, insert(''), {
202
211
  action: ACTION.OPENED,
203
212
  actionSubject: ACTION_SUBJECT.PICKER,
204
213
  actionSubjectId: ACTION_SUBJECT_ID.PICKER_CLOUD,
@@ -111,6 +111,21 @@ export default class MediaGroup extends React.Component {
111
111
  // We declared this to get a fresh position every time
112
112
  const getNodePos = () => {
113
113
  return getPos() + idx + 1;
114
+ }; // Media Inline creates a floating toolbar with the same options, excludes these options if enabled
115
+
116
+
117
+ const mediaInlineOptions = (allowMediaInline = false) => {
118
+ if (!allowMediaInline) {
119
+ return {
120
+ shouldEnableDownloadButton: mediaOptions.enableDownloadButton,
121
+ actions: [{
122
+ handler: disabled ? () => {} : this.mediaPluginState.handleMediaNodeRemoval.bind(null, undefined, getNodePos),
123
+ icon: /*#__PURE__*/React.createElement(EditorCloseIcon, {
124
+ label: "delete"
125
+ })
126
+ }]
127
+ };
128
+ }
114
129
  };
115
130
 
116
131
  return {
@@ -120,13 +135,7 @@ export default class MediaGroup extends React.Component {
120
135
  onClick: () => {
121
136
  setNodeSelection(this.props.view, getNodePos());
122
137
  },
123
- shouldEnableDownloadButton: mediaOptions.enableDownloadButton,
124
- actions: [{
125
- handler: disabled ? () => {} : this.mediaPluginState.handleMediaNodeRemoval.bind(null, undefined, getNodePos),
126
- icon: /*#__PURE__*/React.createElement(EditorCloseIcon, {
127
- label: "delete"
128
- })
129
- }]
138
+ ...mediaInlineOptions(mediaOptions.allowMediaInline)
130
139
  };
131
140
  });
132
141
  return /*#__PURE__*/React.createElement(Filmstrip, {
@@ -0,0 +1,88 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { ReactNodeView } from '../../../nodeviews/';
3
+ import { MediaInlineCard } from '@atlaskit/media-card';
4
+ import { WithProviders } from '@atlaskit/editor-common';
5
+ export const MediaInline = props => {
6
+ const [viewMediaClientConfig, setViewMediaClientConfig] = useState({});
7
+ useEffect(() => {
8
+ updateViewMediaClientConfig(props);
9
+ }, [props]);
10
+
11
+ const updateViewMediaClientConfig = async props => {
12
+ const mediaProvider = await props.mediaProvider;
13
+
14
+ if (mediaProvider) {
15
+ const viewMediaClientConfig = mediaProvider.viewMediaClientConfig;
16
+ setViewMediaClientConfig(viewMediaClientConfig);
17
+ }
18
+ };
19
+
20
+ const {
21
+ id,
22
+ collection
23
+ } = props.node.attrs;
24
+ const identifier = {
25
+ id,
26
+ mediaItemType: 'file',
27
+ collectionName: collection
28
+ };
29
+ return /*#__PURE__*/React.createElement(MediaInlineCard, {
30
+ identifier: identifier,
31
+ mediaClientConfig: viewMediaClientConfig
32
+ });
33
+ };
34
+ export class MediaInlineNodeView extends ReactNodeView {
35
+ createDomRef() {
36
+ const domRef = document.createElement('span');
37
+ domRef.contentEditable = 'false';
38
+ return domRef;
39
+ }
40
+
41
+ getContentDOM() {
42
+ const dom = document.createElement('span');
43
+ return {
44
+ dom
45
+ };
46
+ }
47
+
48
+ ignoreMutation() {
49
+ return true;
50
+ }
51
+
52
+ viewShouldUpdate(nextNode) {
53
+ if (this.node.attrs !== nextNode.attrs) {
54
+ return true;
55
+ }
56
+
57
+ return false;
58
+ }
59
+
60
+ render(props) {
61
+ const {
62
+ providerFactory
63
+ } = props;
64
+ return /*#__PURE__*/React.createElement(WithProviders, {
65
+ providers: ['mediaProvider'],
66
+ providerFactory: providerFactory,
67
+ renderNode: ({
68
+ mediaProvider
69
+ }) => {
70
+ if (!mediaProvider) {
71
+ return null;
72
+ }
73
+
74
+ return /*#__PURE__*/React.createElement(MediaInline, {
75
+ identifier: this.node.attrs.id,
76
+ mediaProvider: mediaProvider,
77
+ node: this.node
78
+ });
79
+ }
80
+ });
81
+ }
82
+
83
+ }
84
+ export const ReactMediaInlineNode = (portalProviderAPI, eventDispatcher, providerFactory) => (node, view, getPos) => {
85
+ return new MediaInlineNodeView(node, view, getPos, portalProviderAPI, eventDispatcher, {
86
+ providerFactory
87
+ }).init();
88
+ };
@@ -9,14 +9,15 @@ import assert from 'assert';
9
9
  import { findDomRefAtPos, isNodeSelection } from 'prosemirror-utils';
10
10
  import { insertMediaSingleNode, isMediaSingle } from '../utils/media-single';
11
11
  import DropPlaceholder from '../ui/Media/DropPlaceholder';
12
- import { insertMediaGroupNode } from '../utils/media-files';
13
- import { removeMediaNode, splitMediaGroup } from '../utils/media-common';
12
+ import { insertMediaGroupNode, insertMediaInlineNode, canInsertMediaInline } from '../utils/media-files';
13
+ import { isInsidePotentialEmptyParagraph, removeMediaNode, splitMediaGroup } from '../utils/media-common';
14
14
  import * as helpers from '../commands/helpers';
15
15
  import { updateMediaNodeAttrs } from '../commands/helpers';
16
16
  import { stateKey } from './plugin-key';
17
17
  import PickerFacade from '../picker-facade';
18
18
  import { INPUT_METHOD } from '../../analytics/types';
19
19
  import { isImage } from '../utils/is-image';
20
+ import { isInEmptyLine } from '../../../utils/document';
20
21
  export { stateKey } from './plugin-key';
21
22
 
22
23
  const createDropPlaceholder = allowDropLine => {
@@ -60,7 +61,7 @@ export class MediaPluginStateImplementation {
60
61
 
61
62
  _defineProperty(this, "removeOnCloseListener", () => {});
62
63
 
63
- _defineProperty(this, "onPopupToogleCallback", () => {});
64
+ _defineProperty(this, "onPopupToggleCallback", () => {});
64
65
 
65
66
  _defineProperty(this, "pickers", []);
66
67
 
@@ -151,12 +152,13 @@ export class MediaPluginStateImplementation {
151
152
  var _this$mediaOptions;
152
153
 
153
154
  const {
155
+ mediaInline,
154
156
  mediaSingle,
155
157
  media
156
158
  } = this.view.state.schema.nodes;
157
159
 
158
160
  if ((_this$mediaOptions = this.mediaOptions) !== null && _this$mediaOptions !== void 0 && _this$mediaOptions.allowMediaInline) {
159
- return type === mediaSingle || type === media;
161
+ return type === mediaSingle || type === media || type === mediaInline;
160
162
  }
161
163
 
162
164
  return type === mediaSingle;
@@ -165,6 +167,11 @@ export class MediaPluginStateImplementation {
165
167
  _defineProperty(this, "hasUserAuthProvider", () => !!this.uploadMediaClientConfig && !!this.uploadMediaClientConfig.userAuthProvider);
166
168
 
167
169
  _defineProperty(this, "insertFile", (mediaState, onMediaStateChanged, pickerType) => {
170
+ var _this$mediaOptions2;
171
+
172
+ const {
173
+ state
174
+ } = this.view;
168
175
  const mediaStateWithContext = { ...mediaState,
169
176
  contextId: this.contextIdentifierProvider ? this.contextIdentifierProvider.objectId : undefined
170
177
  };
@@ -185,8 +192,10 @@ export class MediaPluginStateImplementation {
185
192
  });
186
193
  }
187
194
 
188
- if (isMediaSingle(this.view.state.schema, mediaStateWithContext.fileMimeType)) {
195
+ if (isMediaSingle(state.schema, mediaStateWithContext.fileMimeType)) {
189
196
  insertMediaSingleNode(this.view, mediaStateWithContext, this.getInputMethod(pickerType), collection, this.mediaOptions && this.mediaOptions.alignLeftOnInsert);
197
+ } else if ((_this$mediaOptions2 = this.mediaOptions) !== null && _this$mediaOptions2 !== void 0 && _this$mediaOptions2.allowMediaInline && !isInEmptyLine(state) && !isInsidePotentialEmptyParagraph(state) && canInsertMediaInline(state)) {
198
+ insertMediaInlineNode(this.view, mediaStateWithContext, collection, this.getInputMethod(pickerType));
190
199
  } else {
191
200
  insertMediaGroupNode(this.view, [mediaStateWithContext], collection, this.getInputMethod(pickerType));
192
201
  } // do events when media state changes
@@ -234,7 +243,7 @@ export class MediaPluginStateImplementation {
234
243
  _defineProperty(this, "splitMediaGroup", () => splitMediaGroup(this.view));
235
244
 
236
245
  _defineProperty(this, "onPopupPickerClose", () => {
237
- this.onPopupToogleCallback(false);
246
+ this.onPopupToggleCallback(false);
238
247
  });
239
248
 
240
249
  _defineProperty(this, "shouldUseMediaPickerPopup", () => {
@@ -255,15 +264,15 @@ export class MediaPluginStateImplementation {
255
264
  }
256
265
 
257
266
  this.popupPicker.show();
258
- this.onPopupToogleCallback(true);
267
+ this.onPopupToggleCallback(true);
259
268
  });
260
269
 
261
270
  _defineProperty(this, "setBrowseFn", browseFn => {
262
271
  this.openMediaPickerBrowser = browseFn;
263
272
  });
264
273
 
265
- _defineProperty(this, "onPopupToggle", onPopupToogleCallback => {
266
- this.onPopupToogleCallback = onPopupToogleCallback;
274
+ _defineProperty(this, "onPopupToggle", onPopupToggleCallback => {
275
+ this.onPopupToggleCallback = onPopupToggleCallback;
267
276
  });
268
277
 
269
278
  _defineProperty(this, "waitForPendingTasks", (timeout, lastTask) => {
@@ -482,7 +491,7 @@ export class MediaPluginStateImplementation {
482
491
  }
483
492
 
484
493
  getDomElement(domAtPos) {
485
- var _this$mediaOptions2;
494
+ var _this$mediaOptions3;
486
495
 
487
496
  const {
488
497
  selection
@@ -496,7 +505,7 @@ export class MediaPluginStateImplementation {
496
505
  return;
497
506
  }
498
507
 
499
- const position = (_this$mediaOptions2 = this.mediaOptions) !== null && _this$mediaOptions2 !== void 0 && _this$mediaOptions2.allowMediaInline ? selection.from + 1 : selection.from;
508
+ const position = (_this$mediaOptions3 = this.mediaOptions) !== null && _this$mediaOptions3 !== void 0 && _this$mediaOptions3.allowMediaInline ? selection.from + 1 : selection.from;
500
509
  const node = findDomRefAtPos(position, domAtPos);
501
510
 
502
511
  if (node) {