@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
@@ -38,6 +38,8 @@ var _reactIntl = require("react-intl");
38
38
 
39
39
  var _editorCommon = require("@atlaskit/editor-common");
40
40
 
41
+ var _ufo = require("@atlaskit/editor-common/ufo");
42
+
41
43
  var _eventDispatcher = require("../event-dispatcher");
42
44
 
43
45
  var _utils = require("../utils");
@@ -148,7 +150,12 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
148
150
 
149
151
  return _analytics.FULL_WIDTH_MODE.FIXED_WIDTH;
150
152
  });
151
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "reconfigureState", function (props) {
153
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "resetEditorState", function (_ref) {
154
+ var _this$props$editorPro, _this$props$editorPro2;
155
+
156
+ var doc = _ref.doc,
157
+ shouldScrollToBottom = _ref.shouldScrollToBottom;
158
+
152
159
  if (!_this.view) {
153
160
  return;
154
161
  } // We cannot currently guarentee when all the portals will have re-rendered during a reconfigure
@@ -156,9 +163,49 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
156
163
  // nodes that haven't been re-rendered to the document yet.
157
164
 
158
165
 
166
+ _this.blur();
167
+
168
+ _this.featureFlags = (0, _featureFlagsFromProps.createFeatureFlagsFromProps)(_this.props.editorProps);
169
+ _this.editorState = _this.createEditorState({
170
+ props: _this.props,
171
+ context: _this.context,
172
+ doc: doc,
173
+ resetting: true,
174
+ selectionAtStart: !shouldScrollToBottom
175
+ });
176
+
177
+ _this.view.updateState(_this.editorState);
178
+
179
+ (_this$props$editorPro = (_this$props$editorPro2 = _this.props.editorProps).onChange) === null || _this$props$editorPro === void 0 ? void 0 : _this$props$editorPro.call(_this$props$editorPro2, _this.view, {
180
+ source: 'local'
181
+ });
182
+ });
183
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "blur", function () {
184
+ if (!_this.view) {
185
+ return;
186
+ }
187
+
159
188
  if (_this.view.dom instanceof HTMLElement && _this.view.hasFocus()) {
160
189
  _this.view.dom.blur();
190
+ } // The selectionToDOM method uses the document selection to determine currently selected node
191
+ // We need to mimic blurring this as it seems doing the above is not enough.
192
+
193
+
194
+ var sel = _this.view.root.getSelection();
195
+
196
+ if (sel) {
197
+ sel.removeAllRanges();
161
198
  }
199
+ });
200
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "reconfigureState", function (props) {
201
+ if (!_this.view) {
202
+ return;
203
+ } // We cannot currently guarentee when all the portals will have re-rendered during a reconfigure
204
+ // so we blur here to stop ProseMirror from trying to apply selection to detached nodes or
205
+ // nodes that haven't been re-rendered to the document yet.
206
+
207
+
208
+ _this.blur();
162
209
 
163
210
  _this.config = (0, _createEditor.processPluginsList)(_this.getPlugins(props.editorProps, _this.props.editorProps, _this.props.createAnalyticsEvent));
164
211
  var state = _this.editorState;
@@ -197,7 +244,7 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
197
244
  (0, _analytics.fireAnalyticsEvent)(_this.props.createAnalyticsEvent)(payload);
198
245
  });
199
246
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createEditorState", function (options) {
200
- if (_this.view) {
247
+ if (_this.view && !options.resetting) {
201
248
  /**
202
249
  * There's presently a number of issues with changing the schema of a
203
250
  * editor inflight. A significant issue is that we lose the ability
@@ -212,9 +259,7 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
212
259
 
213
260
  _this.config = (0, _createEditor.processPluginsList)(_this.getPlugins(options.props.editorProps, undefined, options.props.createAnalyticsEvent));
214
261
  var schema = (0, _createSchema.createSchema)(_this.config);
215
- var _options$props$editor = options.props.editorProps,
216
- contentTransformerProvider = _options$props$editor.contentTransformerProvider,
217
- defaultValue = _options$props$editor.defaultValue;
262
+ var contentTransformerProvider = options.props.editorProps.contentTransformerProvider;
218
263
  var plugins = (0, _createEditor.createPMPlugins)({
219
264
  schema: schema,
220
265
  dispatch: _this.dispatch,
@@ -234,15 +279,14 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
234
279
  _this.contentTransformer = contentTransformerProvider ? contentTransformerProvider(schema) : undefined;
235
280
  var doc;
236
281
 
237
- if (options.replaceDoc) {
238
- doc = (0, _utils.processRawValue)(schema, defaultValue, options.props.providerFactory, options.props.editorProps.sanitizePrivateContent, _this.contentTransformer, _this.dispatchAnalyticsEvent);
282
+ if (options.doc) {
283
+ doc = (0, _utils.processRawValue)(schema, options.doc, options.props.providerFactory, options.props.editorProps.sanitizePrivateContent, _this.contentTransformer, _this.dispatchAnalyticsEvent);
239
284
  }
240
285
 
241
286
  var selection;
242
287
 
243
288
  if (doc) {
244
- // ED-4759: Don't set selection at end for full-page editor - should be at start.
245
- selection = (0, _isFullPage.isFullPage)(options.props.editorProps.appearance) ? _prosemirrorState.Selection.atStart(doc) : _prosemirrorState.Selection.atEnd(doc);
289
+ selection = options.selectionAtStart ? _prosemirrorState.Selection.atStart(doc) : _prosemirrorState.Selection.atEnd(doc);
246
290
  } // Workaround for ED-3507: When media node is the last element, scrollIntoView throws an error
247
291
 
248
292
 
@@ -254,11 +298,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
254
298
  selection: patchedSelection
255
299
  });
256
300
  });
257
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEditorViewStateUpdated", function (_ref) {
258
- var originalTransaction = _ref.originalTransaction,
259
- transactions = _ref.transactions,
260
- oldEditorState = _ref.oldEditorState,
261
- newEditorState = _ref.newEditorState;
301
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEditorViewStateUpdated", function (_ref2) {
302
+ var originalTransaction = _ref2.originalTransaction,
303
+ transactions = _ref2.transactions,
304
+ oldEditorState = _ref2.oldEditorState,
305
+ newEditorState = _ref2.newEditorState;
262
306
  var trackinEnabled = _this.transactionTracking.enabled;
263
307
 
264
308
  _this.config.onEditorViewStateUpdatedCallbacks.forEach(function (entry) {
@@ -303,6 +347,13 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
303
347
  stopMeasure = _this$transactionTrac.stopMeasure;
304
348
 
305
349
  startMeasure(_trackTransactions.EVENT_NAME_DISPATCH_TRANSACTION);
350
+
351
+ if (_this.transactionTracker.shouldTrackTransaction(_this.transactionTracking)) {
352
+ var _this$experienceStore;
353
+
354
+ (_this$experienceStore = _this.experienceStore) === null || _this$experienceStore === void 0 ? void 0 : _this$experienceStore.start(_ufo.EditorExperience.interaction);
355
+ }
356
+
306
357
  var nodes = (0, _nodes.findChangedNodesFromTransaction)(transaction);
307
358
  var changedNodesValid = (0, _nodes.validateNodes)(nodes);
308
359
 
@@ -315,7 +366,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
315
366
  editorState = _this$view$state$appl.state,
316
367
  transactions = _this$view$state$appl.transactions;
317
368
 
318
- stopMeasure(_trackTransactions.EVENT_NAME_STATE_APPLY);
369
+ stopMeasure(_trackTransactions.EVENT_NAME_STATE_APPLY, function (duration, startTime) {
370
+ var _this$experienceStore2;
371
+
372
+ (_this$experienceStore2 = _this.experienceStore) === null || _this$experienceStore2 === void 0 ? void 0 : _this$experienceStore2.mark(_ufo.EditorExperience.interaction, 'stateApply', startTime + duration);
373
+ });
319
374
 
320
375
  _this.trackValidTransactions();
321
376
 
@@ -327,7 +382,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
327
382
 
328
383
  _this.view.updateState(editorState);
329
384
 
330
- stopMeasure(_trackTransactions.EVENT_NAME_UPDATE_STATE);
385
+ stopMeasure(_trackTransactions.EVENT_NAME_UPDATE_STATE, function (duration, startTime) {
386
+ var _this$experienceStore3;
387
+
388
+ (_this$experienceStore3 = _this.experienceStore) === null || _this$experienceStore3 === void 0 ? void 0 : _this$experienceStore3.mark(_ufo.EditorExperience.interaction, 'viewUpdateState', startTime + duration);
389
+ });
331
390
  startMeasure(_trackTransactions.EVENT_NAME_VIEW_STATE_UPDATED);
332
391
 
333
392
  _this.onEditorViewStateUpdated({
@@ -337,7 +396,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
337
396
  newEditorState: editorState
338
397
  });
339
398
 
340
- stopMeasure(_trackTransactions.EVENT_NAME_VIEW_STATE_UPDATED);
399
+ stopMeasure(_trackTransactions.EVENT_NAME_VIEW_STATE_UPDATED, function (duration, startTime) {
400
+ var _this$experienceStore4;
401
+
402
+ (_this$experienceStore4 = _this.experienceStore) === null || _this$experienceStore4 === void 0 ? void 0 : _this$experienceStore4.mark(_ufo.EditorExperience.interaction, 'onEditorViewStateUpdated', startTime + duration);
403
+ });
341
404
 
342
405
  if (_this.props.editorProps.onChange && transaction.docChanged) {
343
406
  var source = transaction.getMeta('isRemote') ? 'remote' : 'local';
@@ -348,9 +411,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
348
411
  });
349
412
 
350
413
  stopMeasure(_trackTransactions.EVENT_NAME_ON_CHANGE, function (duration, startTime) {
351
- var _this$props$editorPro, _this$props$editorPro2;
414
+ var _this$experienceStore5, _this$props$editorPro3, _this$props$editorPro4;
415
+
416
+ (_this$experienceStore5 = _this.experienceStore) === null || _this$experienceStore5 === void 0 ? void 0 : _this$experienceStore5.mark(_ufo.EditorExperience.interaction, 'onChange', startTime + duration);
352
417
 
353
- if (((_this$props$editorPro = _this.props.editorProps.performanceTracking) === null || _this$props$editorPro === void 0 ? void 0 : (_this$props$editorPro2 = _this$props$editorPro.onChangeCallbackTracking) === null || _this$props$editorPro2 === void 0 ? void 0 : _this$props$editorPro2.enabled) !== true) {
418
+ if (((_this$props$editorPro3 = _this.props.editorProps.performanceTracking) === null || _this$props$editorPro3 === void 0 ? void 0 : (_this$props$editorPro4 = _this$props$editorPro3.onChangeCallbackTracking) === null || _this$props$editorPro4 === void 0 ? void 0 : _this$props$editorPro4.enabled) !== true) {
354
419
  return;
355
420
  }
356
421
 
@@ -367,7 +432,15 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
367
432
  }
368
433
 
369
434
  _this.editorState = editorState;
435
+ stopMeasure(_trackTransactions.EVENT_NAME_DISPATCH_TRANSACTION, function (duration, startTime) {
436
+ var _this$experienceStore6, _this$experienceStore7;
437
+
438
+ (_this$experienceStore6 = _this.experienceStore) === null || _this$experienceStore6 === void 0 ? void 0 : _this$experienceStore6.mark(_ufo.EditorExperience.interaction, 'dispatchTransaction', startTime + duration);
439
+ (_this$experienceStore7 = _this.experienceStore) === null || _this$experienceStore7 === void 0 ? void 0 : _this$experienceStore7.success(_ufo.EditorExperience.interaction);
440
+ });
370
441
  } else {
442
+ var _this$experienceStore8;
443
+
371
444
  var invalidNodes = nodes.filter(function (node) {
372
445
  return !(0, _nodes.validNode)(node);
373
446
  }).map(function (node) {
@@ -385,9 +458,12 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
385
458
  invalidNodes: invalidNodes
386
459
  }
387
460
  });
388
- }
389
461
 
390
- stopMeasure(_trackTransactions.EVENT_NAME_DISPATCH_TRANSACTION);
462
+ (_this$experienceStore8 = _this.experienceStore) === null || _this$experienceStore8 === void 0 ? void 0 : _this$experienceStore8.fail(_ufo.EditorExperience.interaction, {
463
+ reason: 'invalid transaction',
464
+ invalidNodes: invalidNodes.toString()
465
+ });
466
+ }
391
467
  });
392
468
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getDirectEditorProps", function (state) {
393
469
  return {
@@ -411,14 +487,17 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
411
487
  });
412
488
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createEditorView", function (node) {
413
489
  (0, _editorCommon.measureRender)(_measureEnum.default.PROSEMIRROR_RENDERED, function (duration, startTime) {
414
- var _this$props$editorPro3, _this$props$editorPro4, _proseMirrorRenderedT, _proseMirrorRenderedT2;
490
+ var _this$props$editorPro5, _this$props$editorPro6, _proseMirrorRenderedT, _proseMirrorRenderedT2;
415
491
 
416
- var proseMirrorRenderedTracking = (_this$props$editorPro3 = _this.props.editorProps) === null || _this$props$editorPro3 === void 0 ? void 0 : (_this$props$editorPro4 = _this$props$editorPro3.performanceTracking) === null || _this$props$editorPro4 === void 0 ? void 0 : _this$props$editorPro4.proseMirrorRenderedTracking;
492
+ var proseMirrorRenderedTracking = (_this$props$editorPro5 = _this.props.editorProps) === null || _this$props$editorPro5 === void 0 ? void 0 : (_this$props$editorPro6 = _this$props$editorPro5.performanceTracking) === null || _this$props$editorPro6 === void 0 ? void 0 : _this$props$editorPro6.proseMirrorRenderedTracking;
417
493
  var forceSeverityTracking = typeof proseMirrorRenderedTracking === 'undefined' && (0, _editorCommon.shouldForceTracking)();
418
494
  _this.proseMirrorRenderedSeverity = !!forceSeverityTracking || proseMirrorRenderedTracking !== null && proseMirrorRenderedTracking !== void 0 && proseMirrorRenderedTracking.trackSeverity ? (0, _editorCommon.getAnalyticsEventSeverity)(duration, (_proseMirrorRenderedT = proseMirrorRenderedTracking === null || proseMirrorRenderedTracking === void 0 ? void 0 : proseMirrorRenderedTracking.severityNormalThreshold) !== null && _proseMirrorRenderedT !== void 0 ? _proseMirrorRenderedT : _consts.PROSEMIRROR_RENDERED_NORMAL_SEVERITY_THRESHOLD, (_proseMirrorRenderedT2 = proseMirrorRenderedTracking === null || proseMirrorRenderedTracking === void 0 ? void 0 : proseMirrorRenderedTracking.severityDegradedThreshold) !== null && _proseMirrorRenderedT2 !== void 0 ? _proseMirrorRenderedT2 : _consts.PROSEMIRROR_RENDERED_DEGRADED_SEVERITY_THRESHOLD) : undefined;
419
495
 
420
496
  if (_this.view) {
421
- var _getContextIdentifier;
497
+ var _getContextIdentifier, _this$experienceStore9, _this$experienceStore10;
498
+
499
+ var nodes = (0, _document.getNodesCount)(_this.view.state.doc);
500
+ var ttfb = (0, _editorCommon.getResponseEndTime)();
422
501
 
423
502
  _this.dispatchAnalyticsEvent({
424
503
  action: _analytics.ACTION.PROSEMIRROR_RENDERED,
@@ -426,13 +505,19 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
426
505
  attributes: {
427
506
  duration: duration,
428
507
  startTime: startTime,
429
- nodes: (0, _document.getNodesCount)(_this.view.state.doc),
430
- ttfb: (0, _editorCommon.getResponseEndTime)(),
508
+ nodes: nodes,
509
+ ttfb: ttfb,
431
510
  severity: _this.proseMirrorRenderedSeverity,
432
511
  objectId: (_getContextIdentifier = (0, _contextIdentifier.getContextIdentifier)(_this.editorState)) === null || _getContextIdentifier === void 0 ? void 0 : _getContextIdentifier.objectId
433
512
  },
434
513
  eventType: _analytics.EVENT_TYPE.OPERATIONAL
435
514
  });
515
+
516
+ (_this$experienceStore9 = _this.experienceStore) === null || _this$experienceStore9 === void 0 ? void 0 : _this$experienceStore9.mark(_ufo.EditorExperience.loadEditor, _analytics.ACTION.PROSEMIRROR_RENDERED, startTime + duration);
517
+ (_this$experienceStore10 = _this.experienceStore) === null || _this$experienceStore10 === void 0 ? void 0 : _this$experienceStore10.addMetadata(_ufo.EditorExperience.loadEditor, {
518
+ nodes: nodes,
519
+ ttfb: ttfb
520
+ });
436
521
  }
437
522
  }); // Creates the editor-view from this.editorState. If an editor has been mounted
438
523
  // previously, this will contain the previous state of the editor.
@@ -454,8 +539,27 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
454
539
  transformer: _this.contentTransformer
455
540
  });
456
541
 
542
+ if (_this.featureFlags.ufo) {
543
+ _this.reliabilityInterval = window.setInterval(function () {
544
+ var reliabilityEvent = {
545
+ action: _analytics.ACTION.UFO_SESSION_COMPLETE,
546
+ actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
547
+ attributes: {
548
+ interval: _ufo.RELIABILITY_INTERVAL
549
+ },
550
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL
551
+ };
552
+
553
+ _this.dispatchAnalyticsEvent(reliabilityEvent);
554
+ }, _ufo.RELIABILITY_INTERVAL);
555
+ }
556
+
457
557
  if (_this.props.editorProps.shouldFocus && view.props.editable && view.props.editable(view.state)) {
458
558
  _this.focusTimeoutId = handleEditorFocus(view);
559
+ }
560
+
561
+ if (_this.featureFlags.ufo) {
562
+ _this.experienceStore = _ufo.ExperienceStore.getInstance(view);
459
563
  } // Force React to re-render so consumers get a reference to the editor view
460
564
 
461
565
 
@@ -520,10 +624,14 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
520
624
 
521
625
  _this.eventDispatcher.on(_editorCommon.analyticsEventKey, _this.handleAnalyticsEvent);
522
626
 
627
+ _this.eventDispatcher.on('resetEditorState', _this.resetEditorState);
628
+
523
629
  _this.editorState = _this.createEditorState({
524
630
  props: _props,
525
631
  context: context,
526
- replaceDoc: true
632
+ doc: _props.editorProps.defaultValue,
633
+ // ED-4759: Don't set selection at end for full-page editor - should be at start.
634
+ selectionAtStart: (0, _isFullPage.isFullPage)(_props.editorProps.appearance)
527
635
  });
528
636
 
529
637
  _this.dispatchAnalyticsEvent({
@@ -544,9 +652,9 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
544
652
  get: // ProseMirror is instantiated prior to the initial React render cycle,
545
653
  // so we allow transactions by default, to avoid discarding the initial one.
546
654
  function get() {
547
- var _this$props$editorPro5, _this$props$editorPro6;
655
+ var _this$props$editorPro7, _this$props$editorPro8;
548
656
 
549
- return (_this$props$editorPro5 = (_this$props$editorPro6 = this.props.editorProps.performanceTracking) === null || _this$props$editorPro6 === void 0 ? void 0 : _this$props$editorPro6.transactionTracking) !== null && _this$props$editorPro5 !== void 0 ? _this$props$editorPro5 : {
657
+ return (_this$props$editorPro7 = (_this$props$editorPro8 = this.props.editorProps.performanceTracking) === null || _this$props$editorPro8 === void 0 ? void 0 : _this$props$editorPro8.transactionTracking) !== null && _this$props$editorPro7 !== void 0 ? _this$props$editorPro7 : {
550
658
  enabled: false
551
659
  };
552
660
  }
@@ -639,6 +747,11 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
639
747
  this.canDispatchTransactions = false;
640
748
  this.eventDispatcher.destroy();
641
749
  clearTimeout(this.focusTimeoutId);
750
+
751
+ if (this.reliabilityInterval) {
752
+ clearInterval(this.reliabilityInterval);
753
+ }
754
+
642
755
  this.pluginPerformanceObserver.disconnect();
643
756
 
644
757
  if (this.view) {
@@ -655,6 +768,7 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
655
768
 
656
769
 
657
770
  this.eventDispatcher.off(_editorCommon.analyticsEventKey, this.handleAnalyticsEvent);
771
+ this.eventDispatcher.off('resetEditorState', this.resetEditorState);
658
772
  } // Helper to allow tests to inject plugins directly
659
773
 
660
774
  }, {
@@ -674,9 +788,9 @@ var ReactEditorView = /*#__PURE__*/function (_React$Component) {
674
788
  }, {
675
789
  key: "render",
676
790
  value: function render() {
677
- var _this$props$editorPro7, _this$props$editorPro8;
791
+ var _this$props$editorPro9, _this$props$editorPro10;
678
792
 
679
- var renderTracking = (_this$props$editorPro7 = this.props.editorProps.performanceTracking) === null || _this$props$editorPro7 === void 0 ? void 0 : (_this$props$editorPro8 = _this$props$editorPro7.renderTracking) === null || _this$props$editorPro8 === void 0 ? void 0 : _this$props$editorPro8.reactEditorView;
793
+ var renderTracking = (_this$props$editorPro9 = this.props.editorProps.performanceTracking) === null || _this$props$editorPro9 === void 0 ? void 0 : (_this$props$editorPro10 = _this$props$editorPro9.renderTracking) === null || _this$props$editorPro10 === void 0 ? void 0 : _this$props$editorPro10.reactEditorView;
680
794
  var renderTrackingEnabled = renderTracking === null || renderTracking === void 0 ? void 0 : renderTracking.enabled;
681
795
  var useShallow = renderTracking === null || renderTracking === void 0 ? void 0 : renderTracking.useShallow;
682
796
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderTrackingEnabled && /*#__PURE__*/_react.default.createElement(_useComponentRendererTracking.RenderTracking, {
@@ -85,7 +85,8 @@ function getDefaultPresetOptionsFromEditorProps(props, createAnalyticsEvent) {
85
85
  allowInlineCursorTarget: !isMobile,
86
86
  allowScrollGutter: getScrollGutterOptions(props),
87
87
  inputTracking: inputTracking,
88
- browserFreezeTracking: (_props$performanceTra2 = props.performanceTracking) === null || _props$performanceTra2 === void 0 ? void 0 : _props$performanceTra2.bFreezeTracking
88
+ browserFreezeTracking: (_props$performanceTra2 = props.performanceTracking) === null || _props$performanceTra2 === void 0 ? void 0 : _props$performanceTra2.bFreezeTracking,
89
+ ufo: (0, _featureFlagsFromProps.createFeatureFlagsFromProps)(props).ufo
89
90
  },
90
91
  blockType: {
91
92
  lastNodeMustBeParagraph: appearance === 'comment' || appearance === 'chromeless',
@@ -296,7 +297,8 @@ function createPluginsList(props, prevProps, createAnalyticsEvent) {
296
297
  if (props.allowPanel) {
297
298
  preset.add([_plugins.panelPlugin, {
298
299
  useLongPressSelection: false,
299
- UNSAFE_allowCustomPanel: props.allowPanel.UNSAFE_allowCustomPanel
300
+ UNSAFE_allowCustomPanel: props.allowPanel.UNSAFE_allowCustomPanel,
301
+ UNSAFE_allowCustomPanelEdit: props.allowPanel.UNSAFE_allowCustomPanelEdit
300
302
  }]);
301
303
  }
302
304
 
@@ -43,6 +43,8 @@ var _versionWrapper = require("./version-wrapper");
43
43
 
44
44
  var _editorCommon = require("@atlaskit/editor-common");
45
45
 
46
+ var _ufo = require("@atlaskit/editor-common/ufo");
47
+
46
48
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
47
49
 
48
50
  var _analyticsNamespacedContext = require("@atlaskit/analytics-namespaced-context");
@@ -87,6 +89,8 @@ var Editor = /*#__PURE__*/function (_React$Component) {
87
89
  var _super = _createSuper(Editor);
88
90
 
89
91
  function Editor(props, context) {
92
+ var _props$performanceTra, _props$performanceTra2, _props$featureFlags;
93
+
90
94
  var _this;
91
95
 
92
96
  (0, _classCallCheck2.default)(this, Editor);
@@ -128,11 +132,16 @@ var Editor = /*#__PURE__*/function (_React$Component) {
128
132
  _this.trackEditorActions(_this.editorActions, props);
129
133
 
130
134
  _this.editorSessionId = (0, _v.default)();
135
+ _this.startTime = performance.now();
131
136
  (0, _editorCommon.startMeasure)(_measureEnum.default.EDITOR_MOUNTED);
132
137
 
133
- if (props.performanceTracking && props.performanceTracking.ttiTracking && props.performanceTracking.ttiTracking.enabled) {
138
+ if ((_props$performanceTra = props.performanceTracking) !== null && _props$performanceTra !== void 0 && (_props$performanceTra2 = _props$performanceTra.ttiTracking) !== null && _props$performanceTra2 !== void 0 && _props$performanceTra2.enabled || (_props$featureFlags = props.featureFlags) !== null && _props$featureFlags !== void 0 && _props$featureFlags.ufo) {
139
+ var _props$performanceTra5, _props$performanceTra6, _props$performanceTra7, _props$performanceTra8;
140
+
134
141
  (0, _editorCommon.measureTTI)(function (tti, ttiFromInvocation, canceled) {
135
- if (_this.createAnalyticsEvent) {
142
+ var _props$performanceTra3, _props$performanceTra4, _props$featureFlags2;
143
+
144
+ if ((_props$performanceTra3 = props.performanceTracking) !== null && _props$performanceTra3 !== void 0 && (_props$performanceTra4 = _props$performanceTra3.ttiTracking) !== null && _props$performanceTra4 !== void 0 && _props$performanceTra4.enabled && _this.createAnalyticsEvent) {
136
145
  var _ttiTracking;
137
146
 
138
147
  var ttiEvent = {
@@ -165,7 +174,14 @@ var Editor = /*#__PURE__*/function (_React$Component) {
165
174
 
166
175
  (0, _analytics.fireAnalyticsEvent)(_this.createAnalyticsEvent)(ttiEvent);
167
176
  }
168
- }, props.performanceTracking.ttiTracking.ttiIdleThreshold, props.performanceTracking.ttiTracking.ttiCancelTimeout);
177
+
178
+ if ((_props$featureFlags2 = props.featureFlags) !== null && _props$featureFlags2 !== void 0 && _props$featureFlags2.ufo) {
179
+ var _this$experienceStore, _this$experienceStore2;
180
+
181
+ (_this$experienceStore = _this.experienceStore) === null || _this$experienceStore === void 0 ? void 0 : _this$experienceStore.mark(_ufo.EditorExperience.loadEditor, _analytics.ACTION.EDITOR_TTI, tti);
182
+ (_this$experienceStore2 = _this.experienceStore) === null || _this$experienceStore2 === void 0 ? void 0 : _this$experienceStore2.success(_ufo.EditorExperience.loadEditor);
183
+ }
184
+ }, (_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);
169
185
  }
170
186
 
171
187
  var _extensionProvider = _this.prepareExtensionProvider(props.extensionProviders);
@@ -211,21 +227,29 @@ var Editor = /*#__PURE__*/function (_React$Component) {
211
227
  }, {
212
228
  key: "componentWillUnmount",
213
229
  value: function componentWillUnmount() {
214
- var _this$props2, _this$props2$performa, _this$props2$performa2;
230
+ var _this$props2, _this$props2$performa, _this$props2$performa2, _this$props$featureFl;
215
231
 
216
232
  this.unregisterEditorFromActions();
217
233
  this.providerFactory.destroy();
218
234
  (0, _editorCommon.clearMeasure)(_measureEnum.default.EDITOR_MOUNTED);
219
235
  ((_this$props2 = this.props) === null || _this$props2 === void 0 ? void 0 : (_this$props2$performa = _this$props2.performanceTracking) === null || _this$props2$performa === void 0 ? void 0 : (_this$props2$performa2 = _this$props2$performa.onEditorReadyCallbackTracking) === null || _this$props2$performa2 === void 0 ? void 0 : _this$props2$performa2.enabled) && (0, _editorCommon.clearMeasure)(_measureEnum.default.ON_EDITOR_READY_CALLBACK);
236
+
237
+ if ((_this$props$featureFl = this.props.featureFlags) !== null && _this$props$featureFl !== void 0 && _this$props$featureFl.ufo) {
238
+ var _this$experienceStore3;
239
+
240
+ (_this$experienceStore3 = this.experienceStore) === null || _this$experienceStore3 === void 0 ? void 0 : _this$experienceStore3.abortAll({
241
+ reason: 'editor component unmounted'
242
+ });
243
+ }
220
244
  }
221
245
  }, {
222
246
  key: "trackEditorActions",
223
247
  value: function trackEditorActions(editorActions, props) {
224
- var _props$performanceTra,
225
- _props$performanceTra2,
248
+ var _props$performanceTra9,
249
+ _props$performanceTra10,
226
250
  _this3 = this;
227
251
 
228
- if (props !== null && props !== void 0 && (_props$performanceTra = props.performanceTracking) !== null && _props$performanceTra !== void 0 && (_props$performanceTra2 = _props$performanceTra.contentRetrievalTracking) !== null && _props$performanceTra2 !== void 0 && _props$performanceTra2.enabled) {
252
+ if (props !== null && props !== void 0 && (_props$performanceTra9 = props.performanceTracking) !== null && _props$performanceTra9 !== void 0 && (_props$performanceTra10 = _props$performanceTra9.contentRetrievalTracking) !== null && _props$performanceTra10 !== void 0 && _props$performanceTra10.enabled) {
229
253
  var DEFAULT_SAMPLING_RATE = 100;
230
254
  var getValue = editorActions.getValue.bind(editorActions);
231
255
 
@@ -246,7 +270,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
246
270
  if (!getValueTracked) {
247
271
  var getValueWithTracking = /*#__PURE__*/function () {
248
272
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
249
- var _props$performanceTra3, _props$performanceTra4, _props$performanceTra5, value, _props$performanceTra6, _props$performanceTra7, _props$performanceTra8, _props$performanceTra9, _props$performanceTra10;
273
+ var _props$performanceTra11, _props$performanceTra12, _props$performanceTra13, value, _props$performanceTra14, _props$performanceTra15, _props$performanceTra16, _props$performanceTra17, _props$performanceTra18;
250
274
 
251
275
  return _regenerator.default.wrap(function _callee$(_context) {
252
276
  while (1) {
@@ -259,7 +283,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
259
283
  case 3:
260
284
  value = _context.sent;
261
285
 
262
- if (samplingCounters.success === ((_props$performanceTra3 = props === null || props === void 0 ? void 0 : (_props$performanceTra4 = props.performanceTracking) === null || _props$performanceTra4 === void 0 ? void 0 : (_props$performanceTra5 = _props$performanceTra4.contentRetrievalTracking) === null || _props$performanceTra5 === void 0 ? void 0 : _props$performanceTra5.successSamplingRate) !== null && _props$performanceTra3 !== void 0 ? _props$performanceTra3 : DEFAULT_SAMPLING_RATE)) {
286
+ if (samplingCounters.success === ((_props$performanceTra11 = props === null || props === void 0 ? void 0 : (_props$performanceTra12 = props.performanceTracking) === null || _props$performanceTra12 === void 0 ? void 0 : (_props$performanceTra13 = _props$performanceTra12.contentRetrievalTracking) === null || _props$performanceTra13 === void 0 ? void 0 : _props$performanceTra13.successSamplingRate) !== null && _props$performanceTra11 !== void 0 ? _props$performanceTra11 : DEFAULT_SAMPLING_RATE)) {
263
287
  _this3.handleAnalyticsEvent({
264
288
  payload: {
265
289
  action: _analytics.ACTION.EDITOR_CONTENT_RETRIEVAL_PERFORMED,
@@ -281,7 +305,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
281
305
  _context.prev = 9;
282
306
  _context.t0 = _context["catch"](0);
283
307
 
284
- if (samplingCounters.failure === ((_props$performanceTra6 = props === null || props === void 0 ? void 0 : (_props$performanceTra7 = props.performanceTracking) === null || _props$performanceTra7 === void 0 ? void 0 : (_props$performanceTra8 = _props$performanceTra7.contentRetrievalTracking) === null || _props$performanceTra8 === void 0 ? void 0 : _props$performanceTra8.failureSamplingRate) !== null && _props$performanceTra6 !== void 0 ? _props$performanceTra6 : DEFAULT_SAMPLING_RATE)) {
308
+ if (samplingCounters.failure === ((_props$performanceTra14 = props === null || props === void 0 ? void 0 : (_props$performanceTra15 = props.performanceTracking) === null || _props$performanceTra15 === void 0 ? void 0 : (_props$performanceTra16 = _props$performanceTra15.contentRetrievalTracking) === null || _props$performanceTra16 === void 0 ? void 0 : _props$performanceTra16.failureSamplingRate) !== null && _props$performanceTra14 !== void 0 ? _props$performanceTra14 : DEFAULT_SAMPLING_RATE)) {
285
309
  _this3.handleAnalyticsEvent({
286
310
  payload: {
287
311
  action: _analytics.ACTION.EDITOR_CONTENT_RETRIEVAL_PERFORMED,
@@ -289,7 +313,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
289
313
  attributes: {
290
314
  success: false,
291
315
  errorInfo: _context.t0.toString(),
292
- errorStack: props !== null && props !== void 0 && (_props$performanceTra9 = props.performanceTracking) !== null && _props$performanceTra9 !== void 0 && (_props$performanceTra10 = _props$performanceTra9.contentRetrievalTracking) !== null && _props$performanceTra10 !== void 0 && _props$performanceTra10.reportErrorStack ? _context.t0.stack : undefined
316
+ errorStack: props !== null && props !== void 0 && (_props$performanceTra17 = props.performanceTracking) !== null && _props$performanceTra17 !== void 0 && (_props$performanceTra18 = _props$performanceTra17.contentRetrievalTracking) !== null && _props$performanceTra18 !== void 0 && _props$performanceTra18.reportErrorStack ? _context.t0.stack : undefined
293
317
  },
294
318
  eventType: _analytics.EVENT_TYPE.OPERATIONAL
295
319
  }
@@ -324,14 +348,22 @@ var Editor = /*#__PURE__*/function (_React$Component) {
324
348
  }, {
325
349
  key: "onEditorCreated",
326
350
  value: function onEditorCreated(instance) {
351
+ var _this$props$featureFl2;
352
+
327
353
  this.registerEditorForActions(instance.view, instance.eventDispatcher, instance.transformer);
328
354
 
355
+ if ((_this$props$featureFl2 = this.props.featureFlags) !== null && _this$props$featureFl2 !== void 0 && _this$props$featureFl2.ufo) {
356
+ this.experienceStore = _ufo.ExperienceStore.getInstance(instance.view);
357
+ this.experienceStore.start(_ufo.EditorExperience.loadEditor, this.startTime);
358
+ }
359
+
329
360
  if (this.props.onEditorReady) {
330
- var _this$props3, _this$props3$performa, _this$props3$performa2, _this$props4, _this$props4$performa, _this$props4$performa2;
361
+ var _this$props3, _this$props3$performa, _this$props3$performa2, _this$props$featureFl3;
331
362
 
332
- ((_this$props3 = this.props) === null || _this$props3 === void 0 ? void 0 : (_this$props3$performa = _this$props3.performanceTracking) === null || _this$props3$performa === void 0 ? void 0 : (_this$props3$performa2 = _this$props3$performa.onEditorReadyCallbackTracking) === null || _this$props3$performa2 === void 0 ? void 0 : _this$props3$performa2.enabled) && (0, _editorCommon.startMeasure)(_measureEnum.default.ON_EDITOR_READY_CALLBACK);
363
+ var measureEditorReady = ((_this$props3 = this.props) === null || _this$props3 === void 0 ? void 0 : (_this$props3$performa = _this$props3.performanceTracking) === null || _this$props3$performa === void 0 ? void 0 : (_this$props3$performa2 = _this$props3$performa.onEditorReadyCallbackTracking) === null || _this$props3$performa2 === void 0 ? void 0 : _this$props3$performa2.enabled) || ((_this$props$featureFl3 = this.props.featureFlags) === null || _this$props$featureFl3 === void 0 ? void 0 : _this$props$featureFl3.ufo);
364
+ measureEditorReady && (0, _editorCommon.startMeasure)(_measureEnum.default.ON_EDITOR_READY_CALLBACK);
333
365
  this.props.onEditorReady(this.editorActions);
334
- ((_this$props4 = this.props) === null || _this$props4 === void 0 ? void 0 : (_this$props4$performa = _this$props4.performanceTracking) === null || _this$props4$performa === void 0 ? void 0 : (_this$props4$performa2 = _this$props4$performa.onEditorReadyCallbackTracking) === null || _this$props4$performa2 === void 0 ? void 0 : _this$props4$performa2.enabled) && (0, _editorCommon.stopMeasure)(_measureEnum.default.ON_EDITOR_READY_CALLBACK, this.sendDurationAnalytics(_analytics.ACTION.ON_EDITOR_READY_CALLBACK));
366
+ measureEditorReady && (0, _editorCommon.stopMeasure)(_measureEnum.default.ON_EDITOR_READY_CALLBACK, this.sendDurationAnalytics(_analytics.ACTION.ON_EDITOR_READY_CALLBACK));
335
367
  }
336
368
  }
337
369
  }, {
@@ -339,28 +371,57 @@ var Editor = /*#__PURE__*/function (_React$Component) {
339
371
  value: function sendDurationAnalytics(action) {
340
372
  var _this4 = this;
341
373
 
342
- return function (duration, startTime) {
343
- if (_this4.createAnalyticsEvent) {
344
- var fireMounted = function fireMounted(objectId) {
345
- (0, _analytics.fireAnalyticsEvent)(_this4.createAnalyticsEvent)({
346
- payload: {
347
- action: action,
348
- actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
349
- attributes: {
350
- duration: duration,
351
- startTime: startTime,
352
- objectId: objectId
353
- },
354
- eventType: _analytics.EVENT_TYPE.OPERATIONAL
374
+ return /*#__PURE__*/function () {
375
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(duration, startTime) {
376
+ var _this4$props$featureF;
377
+
378
+ var contextIdentifier, objectId, _this4$experienceStor, _this4$experienceStor2;
379
+
380
+ return _regenerator.default.wrap(function _callee2$(_context2) {
381
+ while (1) {
382
+ switch (_context2.prev = _context2.next) {
383
+ case 0:
384
+ _context2.next = 2;
385
+ return _this4.props.contextIdentifierProvider;
386
+
387
+ case 2:
388
+ contextIdentifier = _context2.sent;
389
+ objectId = contextIdentifier === null || contextIdentifier === void 0 ? void 0 : contextIdentifier.objectId;
390
+
391
+ if (_this4.createAnalyticsEvent) {
392
+ (0, _analytics.fireAnalyticsEvent)(_this4.createAnalyticsEvent)({
393
+ payload: {
394
+ action: action,
395
+ actionSubject: _analytics.ACTION_SUBJECT.EDITOR,
396
+ attributes: {
397
+ duration: duration,
398
+ startTime: startTime,
399
+ objectId: objectId
400
+ },
401
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL
402
+ }
403
+ });
404
+ }
405
+
406
+ if ((_this4$props$featureF = _this4.props.featureFlags) !== null && _this4$props$featureF !== void 0 && _this4$props$featureF.ufo) {
407
+ (_this4$experienceStor = _this4.experienceStore) === null || _this4$experienceStor === void 0 ? void 0 : _this4$experienceStor.mark(_ufo.EditorExperience.loadEditor, action, startTime + duration);
408
+ (_this4$experienceStor2 = _this4.experienceStore) === null || _this4$experienceStor2 === void 0 ? void 0 : _this4$experienceStor2.addMetadata(_ufo.EditorExperience.loadEditor, {
409
+ objectId: objectId
410
+ });
411
+ }
412
+
413
+ case 6:
414
+ case "end":
415
+ return _context2.stop();
355
416
  }
356
- });
357
- };
417
+ }
418
+ }, _callee2);
419
+ }));
358
420
 
359
- Promise.resolve(_this4.props.contextIdentifierProvider).then(function (p) {
360
- fireMounted(p === null || p === void 0 ? void 0 : p.objectId);
361
- }, fireMounted);
362
- }
363
- };
421
+ return function (_x, _x2) {
422
+ return _ref2.apply(this, arguments);
423
+ };
424
+ }();
364
425
  }
365
426
  }, {
366
427
  key: "deprecationWarnings",
@@ -519,14 +580,14 @@ var Editor = /*#__PURE__*/function (_React$Component) {
519
580
  onEditorDestroyed: _this5.onEditorDestroyed,
520
581
  allowAnalyticsGASV3: _this5.props.allowAnalyticsGASV3,
521
582
  disabled: _this5.props.disabled,
522
- render: function render(_ref2) {
583
+ render: function render(_ref3) {
523
584
  var _this5$props$featureF, _this5$props$featureF2;
524
585
 
525
- var editor = _ref2.editor,
526
- view = _ref2.view,
527
- eventDispatcher = _ref2.eventDispatcher,
528
- config = _ref2.config,
529
- dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
586
+ var editor = _ref3.editor,
587
+ view = _ref3.view,
588
+ eventDispatcher = _ref3.eventDispatcher,
589
+ config = _ref3.config,
590
+ dispatchAnalyticsEvent = _ref3.dispatchAnalyticsEvent;
530
591
  return /*#__PURE__*/_react.default.createElement(_editorCommon.BaseTheme, {
531
592
  dynamicTextSizing: _this5.props.allowDynamicTextSizing && _this5.props.appearance !== 'full-width',
532
593
  baseFontSize: _this5.getBaseFontSize()
@@ -46,7 +46,8 @@ function useCXHTMLPreset(_ref) {
46
46
  }
47
47
  }]);
48
48
  preset.add([_plugins.panelPlugin, {
49
- UNSAFE_allowCustomPanel: true
49
+ UNSAFE_allowCustomPanel: true,
50
+ UNSAFE_allowCustomPanelEdit: true
50
51
  }]);
51
52
  preset.add(_plugins.listPlugin);
52
53
  preset.add(_plugins.textColorPlugin);