@atlaskit/editor-plugin-synced-block 5.4.5 → 5.4.7

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 (32) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/nodeviews/syncedBlock.js +15 -0
  3. package/dist/cjs/pm-plugins/main.js +38 -67
  4. package/dist/cjs/pm-plugins/utils/track-sync-blocks.js +24 -66
  5. package/dist/cjs/pm-plugins/utils/utils.js +20 -10
  6. package/dist/cjs/syncedBlockPlugin.js +1 -3
  7. package/dist/cjs/types/index.js +1 -0
  8. package/dist/cjs/ui/Flag.js +5 -1
  9. package/dist/cjs/ui/SyncedLocationDropdown.js +11 -20
  10. package/dist/es2019/nodeviews/syncedBlock.js +11 -0
  11. package/dist/es2019/pm-plugins/main.js +39 -68
  12. package/dist/es2019/pm-plugins/utils/track-sync-blocks.js +25 -58
  13. package/dist/es2019/pm-plugins/utils/utils.js +18 -8
  14. package/dist/es2019/syncedBlockPlugin.js +2 -4
  15. package/dist/es2019/types/index.js +1 -0
  16. package/dist/es2019/ui/Flag.js +5 -0
  17. package/dist/es2019/ui/SyncedLocationDropdown.js +12 -21
  18. package/dist/esm/nodeviews/syncedBlock.js +15 -0
  19. package/dist/esm/pm-plugins/main.js +39 -68
  20. package/dist/esm/pm-plugins/utils/track-sync-blocks.js +24 -66
  21. package/dist/esm/pm-plugins/utils/utils.js +19 -9
  22. package/dist/esm/syncedBlockPlugin.js +2 -4
  23. package/dist/esm/types/index.js +1 -0
  24. package/dist/esm/ui/Flag.js +5 -1
  25. package/dist/esm/ui/SyncedLocationDropdown.js +11 -20
  26. package/dist/types/nodeviews/syncedBlock.d.ts +3 -1
  27. package/dist/types/pm-plugins/utils/utils.d.ts +1 -1
  28. package/dist/types/types/index.d.ts +6 -5
  29. package/dist/types-ts4.5/nodeviews/syncedBlock.d.ts +3 -1
  30. package/dist/types-ts4.5/pm-plugins/utils/utils.d.ts +1 -1
  31. package/dist/types-ts4.5/types/index.d.ts +6 -5
  32. package/package.json +3 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @atlaskit/editor-plugin-synced-block
2
2
 
3
+ ## 5.4.7
4
+
5
+ ### Patch Changes
6
+
7
+ - [`dc717554783a6`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/dc717554783a6) -
8
+ [ux] EDITOR-5556 show warning flag when extensions are added inside synced blocks
9
+ - Updated dependencies
10
+
11
+ ## 5.4.6
12
+
13
+ ### Patch Changes
14
+
15
+ - [`2e6129d5b39bc`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/2e6129d5b39bc) -
16
+ EDITOR-5529 clean up platform_synced_block_patch_3 and platform_synced_block_patch_4
17
+ - [`b853527230a60`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b853527230a60) -
18
+ [EDITOR-5520] Fix reference sync block shows old page data when transitioning between live pages
19
+ - Updated dependencies
20
+
3
21
  ## 5.4.5
4
22
 
5
23
  ### Patch Changes
@@ -17,6 +17,7 @@ var _errorBoundary = require("@atlaskit/editor-common/error-boundary");
17
17
  var _reactNodeView = _interopRequireDefault(require("@atlaskit/editor-common/react-node-view"));
18
18
  var _syncBlock = require("@atlaskit/editor-common/sync-block");
19
19
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
20
+ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
20
21
  var _editorCommands = require("../editor-commands");
21
22
  var _SyncBlockRendererWrapper = require("../ui/SyncBlockRendererWrapper");
22
23
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
@@ -40,6 +41,20 @@ var SyncBlock = exports.SyncBlock = /*#__PURE__*/function (_ReactNodeView) {
40
41
  domRef.classList.add(_syncBlock.SyncBlockSharedCssClassName.prefix);
41
42
  return domRef;
42
43
  }
44
+ }, {
45
+ key: "validUpdate",
46
+ value: function validUpdate(currentNode, newNode) {
47
+ // Only consider as the valid update if the localId and resourceId are the same
48
+ // This prevents PM reusing the same node view for different sync block node in live page transition
49
+ return currentNode.attrs.localId === newNode.attrs.localId && currentNode.attrs.resourceId === newNode.attrs.resourceId;
50
+ }
51
+ }, {
52
+ key: "update",
53
+ value: function update(node, decorations, innerDecorations) {
54
+ return _superPropGet(SyncBlock, "update", this, 3)([node, decorations, innerDecorations, (0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
55
+ exposure: true
56
+ }) ? this.validUpdate : undefined]);
57
+ }
43
58
  }, {
44
59
  key: "render",
45
60
  value: function render(_ref) {
@@ -81,24 +81,23 @@ var showCopiedFlag = function showCopiedFlag(api) {
81
81
  });
82
82
  });
83
83
  };
84
- var showInlineExtensionInSyncBlockWarningIfNeeded = function showInlineExtensionInSyncBlockWarningIfNeeded(tr, state, api, inlineExtensionFlagShown) {
84
+ var showExtensionInSyncBlockWarningIfNeeded = function showExtensionInSyncBlockWarningIfNeeded(tr, state, api, extensionFlagShown) {
85
85
  var _api$connectivity;
86
- if (!(0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
87
- return;
88
- }
89
86
  if (!tr.docChanged || tr.getMeta('isRemote') || Boolean(tr.getMeta(_utils.pmHistoryPluginKey)) || (0, _editorPluginConnectivity.isOfflineMode)(api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode)) {
90
87
  return;
91
88
  }
92
- var resourceId = (0, _utils2.wasInlineExtensionInsertedInBodiedSyncBlock)(tr, state);
89
+ var resourceId = (0, _utils2.wasExtensionInsertedInBodiedSyncBlock)(tr, state);
93
90
  // Only show the flag on the first instance per sync block (same as UNPUBLISHED_SYNC_BLOCK_PASTED)
94
- if (resourceId && !inlineExtensionFlagShown.has(resourceId)) {
95
- inlineExtensionFlagShown.add(resourceId);
91
+ if (resourceId && !extensionFlagShown.has(resourceId)) {
92
+ extensionFlagShown.add(resourceId);
96
93
  (0, _utils2.deferDispatch)(function () {
97
94
  api === null || api === void 0 || api.core.actions.execute(function (_ref2) {
98
95
  var tr = _ref2.tr;
99
96
  return tr.setMeta(syncedBlockPluginKey, {
100
97
  activeFlag: {
101
- id: _types.FLAG_ID.INLINE_EXTENSION_IN_SYNC_BLOCK
98
+ id: (0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
99
+ exposure: true
100
+ }) ? _types.FLAG_ID.EXTENSION_IN_SYNC_BLOCK : _types.FLAG_ID.INLINE_EXTENSION_IN_SYNC_BLOCK
102
101
  }
103
102
  });
104
103
  });
@@ -120,7 +119,7 @@ var filterTransactionOnline = function filterTransactionOnline(_ref3) {
120
119
  confirmationTransactionRef = _ref3.confirmationTransactionRef,
121
120
  bodiedSyncBlockRemoved = _ref3.bodiedSyncBlockRemoved,
122
121
  bodiedSyncBlockAdded = _ref3.bodiedSyncBlockAdded,
123
- inlineExtensionFlagShown = _ref3.inlineExtensionFlagShown;
122
+ extensionFlagShown = _ref3.extensionFlagShown;
124
123
  var _trackSyncBlocks = (0, _trackSyncBlocks8.trackSyncBlocks)(function (node) {
125
124
  return node.type.name === 'syncBlock';
126
125
  }, tr, state),
@@ -140,31 +139,17 @@ var filterTransactionOnline = function filterTransactionOnline(_ref3) {
140
139
  });
141
140
  });
142
141
  syncBlockAdded.forEach(function (syncBlock) {
143
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
144
- var _api$analytics2;
145
- api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || (_api$analytics2 = _api$analytics2.actions) === null || _api$analytics2 === void 0 || _api$analytics2.fireAnalyticsEvent({
146
- action: _analytics.ACTION.INSERTED,
147
- actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
148
- actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK,
149
- attributes: {
150
- resourceId: syncBlock.attrs.resourceId,
151
- blockInstanceId: syncBlock.attrs.localId
152
- },
153
- eventType: _analytics.EVENT_TYPE.TRACK
154
- });
155
- } else {
156
- var _api$analytics3;
157
- api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 || (_api$analytics3 = _api$analytics3.actions) === null || _api$analytics3 === void 0 || _api$analytics3.fireAnalyticsEvent({
158
- action: _analytics.ACTION.INSERTED,
159
- actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
160
- actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_CREATE,
161
- attributes: {
162
- resourceId: syncBlock.attrs.resourceId,
163
- blockInstanceId: syncBlock.attrs.localId
164
- },
165
- eventType: _analytics.EVENT_TYPE.OPERATIONAL
166
- });
167
- }
142
+ var _api$analytics2;
143
+ api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || (_api$analytics2 = _api$analytics2.actions) === null || _api$analytics2 === void 0 || _api$analytics2.fireAnalyticsEvent({
144
+ action: _analytics.ACTION.INSERTED,
145
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
146
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK,
147
+ attributes: {
148
+ resourceId: syncBlock.attrs.resourceId,
149
+ blockInstanceId: syncBlock.attrs.localId
150
+ },
151
+ eventType: _analytics.EVENT_TYPE.TRACK
152
+ });
168
153
  });
169
154
  if (bodiedSyncBlockRemoved.length > 0) {
170
155
  // eslint-disable-next-line no-param-reassign
@@ -181,7 +166,7 @@ var filterTransactionOnline = function filterTransactionOnline(_ref3) {
181
166
  (0, _handleBodiedSyncBlockCreation.handleBodiedSyncBlockCreation)(bodiedSyncBlockAdded, state, api);
182
167
  return true;
183
168
  }
184
- showInlineExtensionInSyncBlockWarningIfNeeded(tr, state, api, inlineExtensionFlagShown);
169
+ showExtensionInSyncBlockWarningIfNeeded(tr, state, api, extensionFlagShown);
185
170
  return true;
186
171
  };
187
172
  var filterTransactionOffline = function filterTransactionOffline(_ref4) {
@@ -233,7 +218,7 @@ var SyncedBlockPluginContext = /*#__PURE__*/function () {
233
218
  });
234
219
  (0, _defineProperty2.default)(this, "_isCopyEvent", false);
235
220
  (0, _defineProperty2.default)(this, "unpublishedFlagShown", new Set());
236
- (0, _defineProperty2.default)(this, "inlineExtensionFlagShown", new Set());
221
+ (0, _defineProperty2.default)(this, "extensionFlagShown", new Set());
237
222
  }
238
223
  return (0, _createClass2.default)(SyncedBlockPluginContext, [{
239
224
  key: "isCopyEvent",
@@ -255,7 +240,7 @@ var SyncedBlockPluginContext = /*#__PURE__*/function () {
255
240
  }]);
256
241
  }();
257
242
  var createPlugin = exports.createPlugin = function createPlugin(options, pmPluginFactoryParams, syncBlockStore, api) {
258
- var _ctx$confirmationTran, _ctx$unpublishedFlagS, _ctx$inlineExtensionF;
243
+ var _ctx$confirmationTran, _ctx$unpublishedFlagS, _ctx$extensionFlagSho;
259
244
  var _ref6 = options || {},
260
245
  _ref6$useLongPressSel = _ref6.useLongPressSelection,
261
246
  useLongPressSelection = _ref6$useLongPressSel === void 0 ? false : _ref6$useLongPressSel;
@@ -265,7 +250,7 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
265
250
  };
266
251
  var isCopyEvent = false;
267
252
  var unpublishedFlagShown = (_ctx$unpublishedFlagS = ctx === null || ctx === void 0 ? void 0 : ctx.unpublishedFlagShown) !== null && _ctx$unpublishedFlagS !== void 0 ? _ctx$unpublishedFlagS : new Set();
268
- var inlineExtensionFlagShown = (_ctx$inlineExtensionF = ctx === null || ctx === void 0 ? void 0 : ctx.inlineExtensionFlagShown) !== null && _ctx$inlineExtensionF !== void 0 ? _ctx$inlineExtensionF : new Set();
253
+ var extensionFlagShown = (_ctx$extensionFlagSho = ctx === null || ctx === void 0 ? void 0 : ctx.extensionFlagShown) !== null && _ctx$extensionFlagSho !== void 0 ? _ctx$extensionFlagSho : new Set();
269
254
 
270
255
  // Set up callback to detect unpublished sync blocks when they're fetched
271
256
  syncBlockStore.referenceManager.setOnUnpublishedSyncBlockDetected(function (resourceId) {
@@ -519,7 +504,7 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
519
504
  confirmationTransactionRef: confirmationTransactionRef,
520
505
  bodiedSyncBlockRemoved: bodiedSyncBlockRemoved,
521
506
  bodiedSyncBlockAdded: bodiedSyncBlockAdded,
522
- inlineExtensionFlagShown: inlineExtensionFlagShown
507
+ extensionFlagShown: extensionFlagShown
523
508
  });
524
509
  }
525
510
  if (!isOffline) {
@@ -529,8 +514,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
529
514
  _syncBlockRemoved = _trackSyncBlocks5.removed,
530
515
  _syncBlockAdded = _trackSyncBlocks5.added;
531
516
  _syncBlockRemoved.forEach(function (syncBlock) {
532
- var _api$analytics4;
533
- api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 || (_api$analytics4 = _api$analytics4.actions) === null || _api$analytics4 === void 0 || _api$analytics4.fireAnalyticsEvent({
517
+ var _api$analytics3;
518
+ api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 || (_api$analytics3 = _api$analytics3.actions) === null || _api$analytics3 === void 0 || _api$analytics3.fireAnalyticsEvent({
534
519
  action: _analytics.ACTION.DELETED,
535
520
  actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
536
521
  actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_DELETE,
@@ -542,31 +527,17 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
542
527
  });
543
528
  });
544
529
  _syncBlockAdded.forEach(function (syncBlock) {
545
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
546
- var _api$analytics5;
547
- api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 || (_api$analytics5 = _api$analytics5.actions) === null || _api$analytics5 === void 0 || _api$analytics5.fireAnalyticsEvent({
548
- action: _analytics.ACTION.INSERTED,
549
- actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
550
- actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK,
551
- attributes: {
552
- resourceId: syncBlock.attrs.resourceId,
553
- blockInstanceId: syncBlock.attrs.localId
554
- },
555
- eventType: _analytics.EVENT_TYPE.TRACK
556
- });
557
- } else {
558
- var _api$analytics6;
559
- api === null || api === void 0 || (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 || (_api$analytics6 = _api$analytics6.actions) === null || _api$analytics6 === void 0 || _api$analytics6.fireAnalyticsEvent({
560
- action: _analytics.ACTION.INSERTED,
561
- actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
562
- actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_CREATE,
563
- attributes: {
564
- resourceId: syncBlock.attrs.resourceId,
565
- blockInstanceId: syncBlock.attrs.localId
566
- },
567
- eventType: _analytics.EVENT_TYPE.OPERATIONAL
568
- });
569
- }
530
+ var _api$analytics4;
531
+ api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 || (_api$analytics4 = _api$analytics4.actions) === null || _api$analytics4 === void 0 || _api$analytics4.fireAnalyticsEvent({
532
+ action: _analytics.ACTION.INSERTED,
533
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
534
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK,
535
+ attributes: {
536
+ resourceId: syncBlock.attrs.resourceId,
537
+ blockInstanceId: syncBlock.attrs.localId
538
+ },
539
+ eventType: _analytics.EVENT_TYPE.TRACK
540
+ });
570
541
  });
571
542
  if (bodiedSyncBlockRemoved.length > 0) {
572
543
  confirmationTransactionRef.current = tr;
@@ -582,7 +553,7 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
582
553
  (0, _handleBodiedSyncBlockCreation.handleBodiedSyncBlockCreation)(bodiedSyncBlockAdded, state, api);
583
554
  return true;
584
555
  }
585
- showInlineExtensionInSyncBlockWarningIfNeeded(tr, state, api, inlineExtensionFlagShown);
556
+ showExtensionInSyncBlockWarningIfNeeded(tr, state, api, extensionFlagShown);
586
557
  return true;
587
558
  }
588
559
  var _trackSyncBlocks6 = (0, _trackSyncBlocks8.trackSyncBlocks)(function (node) {
@@ -6,10 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.trackSyncBlocks = exports.hasEditInSyncBlock = void 0;
7
7
  var _transform = require("@atlaskit/editor-prosemirror/transform");
8
8
  var _utils = require("@atlaskit/editor-prosemirror/utils");
9
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
11
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13
9
  var trackSyncBlocks = exports.trackSyncBlocks = function trackSyncBlocks(predicate, tr, state) {
14
10
  var removed = {};
15
11
  var added = {};
@@ -26,10 +22,10 @@ var trackSyncBlocks = exports.trackSyncBlocks = function trackSyncBlocks(predica
26
22
  });
27
23
 
28
24
  // this is a quick check to see if any insertion/deletion of bodiedSyncBlock happened
29
- var hasBodiedSyncBlockChanges = replaceSteps.some(function (step, idx) {
25
+ var hasBodiedSyncBlockChanges = replaceSteps.some(function (step) {
30
26
  var from = step.from,
31
27
  to = step.to;
32
- var docAtStep = (0, _platformFeatureFlags.fg)('platform_synced_block_patch_3') ? tr.docs[tr.steps.indexOf(step)] : tr.docs[idx];
28
+ var docAtStep = tr.docs[tr.steps.indexOf(step)];
33
29
  var hasChange = false;
34
30
  if (from !== to) {
35
31
  step.getMap().forEach(function (oldStart, oldEnd) {
@@ -109,70 +105,32 @@ var trackSyncBlocks = exports.trackSyncBlocks = function trackSyncBlocks(predica
109
105
  */
110
106
  var hasEditInSyncBlock = exports.hasEditInSyncBlock = function hasEditInSyncBlock(tr, state) {
111
107
  var bodiedSyncBlock = state.schema.nodes.bodiedSyncBlock;
112
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
113
- for (var i = 0; i < tr.steps.length; i++) {
114
- var _tr$docs;
115
- var step = tr.steps[i];
116
- var map = step.getMap();
117
- var docAfterStep = (_tr$docs = tr.docs[i + 1]) !== null && _tr$docs !== void 0 ? _tr$docs : tr.doc;
118
- var positions = [];
108
+ for (var i = 0; i < tr.steps.length; i++) {
109
+ var _tr$docs;
110
+ var step = tr.steps[i];
111
+ var map = step.getMap();
112
+ var docAfterStep = (_tr$docs = tr.docs[i + 1]) !== null && _tr$docs !== void 0 ? _tr$docs : tr.doc;
113
+ var positions = [];
119
114
 
120
- // Extract positions from steps dynamically based on applicable properties
121
- if ('from' in step && typeof step.from === 'number' && 'to' in step && typeof step.to === 'number') {
122
- var _ref = step,
123
- from = _ref.from,
124
- to = _ref.to;
125
- positions.push(from, to);
126
- } else if ('pos' in step && typeof step.pos === 'number') {
127
- var _ref2 = step,
128
- pos = _ref2.pos;
129
- positions.push(pos);
130
- }
131
- for (var _i = 0, _positions = positions; _i < _positions.length; _i++) {
132
- var _pos = _positions[_i];
133
- var newPos = map.map(_pos);
134
- if (newPos >= 0 && newPos <= docAfterStep.content.size) {
135
- if ((0, _utils.findParentNodeOfTypeClosestToPos)(docAfterStep.resolve(newPos), bodiedSyncBlock)) {
136
- return true;
137
- }
138
- }
139
- }
115
+ // Extract positions from steps dynamically based on applicable properties
116
+ if ('from' in step && typeof step.from === 'number' && 'to' in step && typeof step.to === 'number') {
117
+ var _ref = step,
118
+ from = _ref.from,
119
+ to = _ref.to;
120
+ positions.push(from, to);
121
+ } else if ('pos' in step && typeof step.pos === 'number') {
122
+ var _ref2 = step,
123
+ pos = _ref2.pos;
124
+ positions.push(pos);
140
125
  }
141
- } else {
142
- var _iterator = _createForOfIteratorHelper(tr.steps),
143
- _step;
144
- try {
145
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
146
- var _step2 = _step.value;
147
- var _map = _step2.getMap();
148
- var doc = tr.doc;
149
- var _positions2 = [];
150
-
151
- // Extract positions from steps dynamically based on applicable properties
152
- if ('from' in _step2 && typeof _step2.from === 'number' && 'to' in _step2 && typeof _step2.to === 'number') {
153
- var _ref3 = _step2,
154
- _from = _ref3.from,
155
- _to = _ref3.to;
156
- _positions2.push(_from, _to);
157
- } else if ('pos' in _step2 && typeof _step2.pos === 'number') {
158
- var _ref4 = _step2,
159
- _pos2 = _ref4.pos;
160
- _positions2.push(_pos2);
161
- }
162
- for (var _i2 = 0, _positions3 = _positions2; _i2 < _positions3.length; _i2++) {
163
- var _pos3 = _positions3[_i2];
164
- var _newPos = _map.map(_pos3);
165
- if (_newPos >= 0 && _newPos <= doc.content.size) {
166
- if ((0, _utils.findParentNodeOfTypeClosestToPos)(doc.resolve(_newPos), bodiedSyncBlock)) {
167
- return true;
168
- }
169
- }
126
+ for (var _i = 0, _positions = positions; _i < _positions.length; _i++) {
127
+ var _pos = _positions[_i];
128
+ var newPos = map.map(_pos);
129
+ if (newPos >= 0 && newPos <= docAfterStep.content.size) {
130
+ if ((0, _utils.findParentNodeOfTypeClosestToPos)(docAfterStep.resolve(newPos), bodiedSyncBlock)) {
131
+ return true;
170
132
  }
171
133
  }
172
- } catch (err) {
173
- _iterator.e(err);
174
- } finally {
175
- _iterator.f();
176
134
  }
177
135
  }
178
136
  return false;
@@ -3,12 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.wasInlineExtensionInsertedInBodiedSyncBlock = exports.sliceFullyContainsNode = exports.isBodiedSyncBlockNode = exports.findSyncBlockOrBodiedSyncBlock = exports.findSyncBlock = exports.findBodiedSyncBlock = exports.deferDispatch = exports.canBeConvertedToSyncBlock = void 0;
6
+ exports.wasExtensionInsertedInBodiedSyncBlock = exports.sliceFullyContainsNode = exports.isBodiedSyncBlockNode = exports.findSyncBlockOrBodiedSyncBlock = exports.findSyncBlock = exports.findBodiedSyncBlock = exports.deferDispatch = exports.canBeConvertedToSyncBlock = void 0;
7
7
  var _selection = require("@atlaskit/editor-common/selection");
8
8
  var _model = require("@atlaskit/editor-prosemirror/model");
9
9
  var _transform = require("@atlaskit/editor-prosemirror/transform");
10
10
  var _utils = require("@atlaskit/editor-prosemirror/utils");
11
11
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
+ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
12
13
  /**
13
14
  * Defers a callback to the next microtask (when gated) or next macrotask via setTimeout(0).
14
15
  * Used to avoid re-entrant ProseMirror dispatch cycles.
@@ -97,31 +98,36 @@ var sliceFullyContainsNode = exports.sliceFullyContainsNode = function sliceFull
97
98
  }
98
99
  return true;
99
100
  };
100
- var _fragmentContainsInlineExtension = function fragmentContainsInlineExtension(fragment) {
101
+
102
+ // even though extension and bodiedExtension are explicitly not allowed by the schema, they can still be inserted nested inside other nodes e.g. layouts
103
+ var EXTENSION_NODES = new Set(['inlineExtension', 'extension', 'bodiedExtension']);
104
+ var _fragmentContainsExtension = function fragmentContainsExtension(fragment) {
101
105
  var found = false;
102
106
  fragment.forEach(function (node) {
103
107
  if (found) {
104
108
  return;
105
109
  }
106
- if (node.type.name === 'inlineExtension') {
110
+ if ((0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
111
+ exposure: true
112
+ }) ? EXTENSION_NODES.has(node.type.name) : node.type.name === 'inlineExtension') {
107
113
  found = true;
108
114
  } else if (node.content.size) {
109
- if (_fragmentContainsInlineExtension(node.content)) {
115
+ if (_fragmentContainsExtension(node.content)) {
110
116
  found = true;
111
117
  }
112
118
  }
113
119
  });
114
120
  return found;
115
121
  };
116
- var sliceContainsInlineExtension = function sliceContainsInlineExtension(slice) {
117
- return _fragmentContainsInlineExtension(slice.content);
122
+ var sliceContainsExtension = function sliceContainsExtension(slice) {
123
+ return _fragmentContainsExtension(slice.content);
118
124
  };
119
125
 
120
126
  /**
121
127
  * Returns the resourceId of the bodied sync block where an inline extension was inserted, or undefined.
122
128
  * Used to show a warning flag only on the first instance per sync block.
123
129
  */
124
- var wasInlineExtensionInsertedInBodiedSyncBlock = exports.wasInlineExtensionInsertedInBodiedSyncBlock = function wasInlineExtensionInsertedInBodiedSyncBlock(tr, state) {
130
+ var wasExtensionInsertedInBodiedSyncBlock = exports.wasExtensionInsertedInBodiedSyncBlock = function wasExtensionInsertedInBodiedSyncBlock(tr, state) {
125
131
  if (!tr.docChanged || tr.getMeta('isRemote')) {
126
132
  return undefined;
127
133
  }
@@ -141,7 +147,7 @@ var wasInlineExtensionInsertedInBodiedSyncBlock = exports.wasInlineExtensionInse
141
147
  continue;
142
148
  }
143
149
  var replaceStep = step;
144
- if (!sliceContainsInlineExtension(replaceStep.slice)) {
150
+ if (!sliceContainsExtension(replaceStep.slice)) {
145
151
  continue;
146
152
  }
147
153
  var docAfterStep = (_docs = docs[i + 1]) !== null && _docs !== void 0 ? _docs : tr.doc;
@@ -164,13 +170,17 @@ var wasInlineExtensionInsertedInBodiedSyncBlock = exports.wasInlineExtensionInse
164
170
  if (resourceId !== undefined) {
165
171
  return false;
166
172
  }
167
- if (node.type.name === 'inlineExtension') {
173
+ if ((0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
174
+ exposure: true
175
+ }) ? EXTENSION_NODES.has(node.type.name) : node.type.name === 'inlineExtension') {
168
176
  var _$pos = tr.doc.resolve(pos);
169
177
  var _parent = (0, _utils.findParentNodeOfTypeClosestToPos)(_$pos, bodiedSyncBlock);
170
178
  if (_parent !== null && _parent !== void 0 && _parent.node.attrs.resourceId) {
171
179
  var mappedPos = tr.mapping.invert().map(pos);
172
180
  var nodeBefore = state.doc.nodeAt(mappedPos);
173
- if (!nodeBefore || nodeBefore.type.name !== 'inlineExtension') {
181
+ if (!nodeBefore || ((0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
182
+ exposure: true
183
+ }) ? EXTENSION_NODES.has(nodeBefore.type.name) : nodeBefore.type.name !== 'inlineExtension')) {
174
184
  resourceId = _parent.node.attrs.resourceId;
175
185
  return false;
176
186
  }
@@ -39,9 +39,7 @@ var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_
39
39
  node: _adfSchema.syncBlock
40
40
  }, {
41
41
  name: 'bodiedSyncBlock',
42
- node:
43
- // eslint-disable-next-line @atlaskit/platform/no-preconditioning
44
- (0, _platformFeatureFlags.fg)('platform_synced_block_patch_3') && !(0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
42
+ node: !(0, _experiments.editorExperiment)('platform_synced_block_patch_6', true, {
45
43
  exposure: true
46
44
  }) ?
47
45
  // delete bodiedSyncBlockNodeWithToDOMFixed when cleaning up platform_synced_block_patch_6
@@ -13,6 +13,7 @@ var FLAG_ID = exports.FLAG_ID = /*#__PURE__*/function (FLAG_ID) {
13
13
  FLAG_ID["UNPUBLISHED_SYNC_BLOCK_PASTED"] = "unpublished-sync-block-pasted";
14
14
  FLAG_ID["CANNOT_CREATE_SYNC_BLOCK"] = "cannot-create-sync-block";
15
15
  FLAG_ID["INLINE_EXTENSION_IN_SYNC_BLOCK"] = "inline-extension-in-sync-block";
16
+ FLAG_ID["EXTENSION_IN_SYNC_BLOCK"] = "extension-in-sync-block";
16
17
  return FLAG_ID;
17
18
  }({});
18
19
  var SYNCED_BLOCK_BUTTON_TEST_ID = exports.SYNCED_BLOCK_BUTTON_TEST_ID = {
@@ -21,7 +21,7 @@ var _types = require("../types");
21
21
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
22
22
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
23
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
- var flagMap = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _types.FLAG_ID.CANNOT_DELETE_WHEN_OFFLINE, {
24
+ var flagMap = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _types.FLAG_ID.CANNOT_DELETE_WHEN_OFFLINE, {
25
25
  title: _messages.syncBlockMessages.failToDeleteTitle,
26
26
  description: _messages.syncBlockMessages.failToDeleteWhenOfflineDescription,
27
27
  type: 'error'
@@ -48,6 +48,10 @@ var flagMap = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _d
48
48
  title: _messages.syncBlockMessages.cannotCreateSyncBlockTitle,
49
49
  description: _messages.syncBlockMessages.CannotCreateSyncBlockDescription,
50
50
  type: 'error'
51
+ }), _types.FLAG_ID.EXTENSION_IN_SYNC_BLOCK, {
52
+ title: _messages.syncBlockMessages.extensionInSyncBlockTitle,
53
+ description: _messages.syncBlockMessages.extensionInSyncBlockDescription,
54
+ type: 'error'
51
55
  }), _types.FLAG_ID.INLINE_EXTENSION_IN_SYNC_BLOCK, {
52
56
  title: _messages.syncBlockMessages.inlineExtensionInSyncBlockTitle,
53
57
  description: _messages.syncBlockMessages.inlineExtensionInSyncBlockDescription,
@@ -31,7 +31,6 @@ var _quotationMark = _interopRequireDefault(require("@atlaskit/icon/core/quotati
31
31
  var _statusError = _interopRequireDefault(require("@atlaskit/icon/core/status-error"));
32
32
  var _logo = require("@atlaskit/logo");
33
33
  var _lozenge = _interopRequireDefault(require("@atlaskit/lozenge"));
34
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
35
34
  var _compiled = require("@atlaskit/primitives/compiled");
36
35
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
37
36
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
@@ -89,31 +88,23 @@ var productIconMap = {
89
88
  'jira-work-item': _logo.JiraIcon
90
89
  };
91
90
  var subTypeIconMap = {
92
- live: _pageLiveDoc.default,
93
- page: _page.default,
94
- blogpost: _quotationMark.default
95
- };
96
- var subTypeIconMapNew = {
97
91
  live: _pageLiveDoc.default,
98
92
  page: _page.default
99
93
  };
100
94
  var getConfluenceSubTypeIcon = function getConfluenceSubTypeIcon(sourceAri, subType) {
101
- if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
102
- try {
103
- var _getPageIdAndTypeFrom = (0, _editorSyncedBlockProvider.getPageIdAndTypeFromConfluencePageAri)({
104
- ari: sourceAri
105
- }),
106
- pageType = _getPageIdAndTypeFrom.type;
107
- if (pageType === 'blogpost') {
108
- return _quotationMark.default;
109
- } else {
110
- return subType && subType in subTypeIconMapNew ? subTypeIconMapNew[subType] : _page.default;
111
- }
112
- } catch (_unused) {
113
- return _page.default;
95
+ try {
96
+ var _getPageIdAndTypeFrom = (0, _editorSyncedBlockProvider.getPageIdAndTypeFromConfluencePageAri)({
97
+ ari: sourceAri
98
+ }),
99
+ pageType = _getPageIdAndTypeFrom.type;
100
+ if (pageType === 'blogpost') {
101
+ return _quotationMark.default;
102
+ } else {
103
+ return subType && subType in subTypeIconMap ? subTypeIconMap[subType] : _page.default;
114
104
  }
105
+ } catch (_unused) {
106
+ return _page.default;
115
107
  }
116
- return subType && subType in subTypeIconMap ? subTypeIconMap[subType] : _page.default;
117
108
  };
118
109
  var ProductIcon = function ProductIcon(_ref2) {
119
110
  var _productIconMap$produ;
@@ -4,6 +4,7 @@ import { ErrorBoundary } from '@atlaskit/editor-common/error-boundary';
4
4
  import ReactNodeView from '@atlaskit/editor-common/react-node-view';
5
5
  import { SyncBlockSharedCssClassName, SyncBlockActionsProvider } from '@atlaskit/editor-common/sync-block';
6
6
  import { useFetchSyncBlockData, useFetchSyncBlockTitle } from '@atlaskit/editor-synced-block-provider';
7
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
7
8
  import { removeSyncedBlockAtPos } from '../editor-commands';
8
9
  import { SyncBlockRendererWrapper } from '../ui/SyncBlockRendererWrapper';
9
10
  export class SyncBlock extends ReactNodeView {
@@ -18,6 +19,16 @@ export class SyncBlock extends ReactNodeView {
18
19
  domRef.classList.add(SyncBlockSharedCssClassName.prefix);
19
20
  return domRef;
20
21
  }
22
+ validUpdate(currentNode, newNode) {
23
+ // Only consider as the valid update if the localId and resourceId are the same
24
+ // This prevents PM reusing the same node view for different sync block node in live page transition
25
+ return currentNode.attrs.localId === newNode.attrs.localId && currentNode.attrs.resourceId === newNode.attrs.resourceId;
26
+ }
27
+ update(node, decorations, innerDecorations) {
28
+ return super.update(node, decorations, innerDecorations, editorExperiment('platform_synced_block_patch_6', true, {
29
+ exposure: true
30
+ }) ? this.validUpdate : undefined);
31
+ }
21
32
  render({
22
33
  getPos
23
34
  }) {