@atlaskit/editor-plugin-synced-block 5.2.1 → 5.3.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 (76) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/afm-jira/tsconfig.json +1 -1
  3. package/dist/cjs/editor-commands/index.js +43 -5
  4. package/dist/cjs/editor-commands/utils.js +20 -0
  5. package/dist/cjs/pm-plugins/menu-and-toolbar-experiences.js +267 -0
  6. package/dist/cjs/syncedBlockPlugin.js +21 -12
  7. package/dist/cjs/types/index.js +6 -3
  8. package/dist/cjs/ui/CreateSyncedBlockButton.js +2 -1
  9. package/dist/cjs/ui/CreateSyncedBlockDropdownItem.js +2 -1
  10. package/dist/cjs/ui/SyncBlockRefresher.js +18 -4
  11. package/dist/cjs/ui/SyncedLocationDropdown.js +14 -11
  12. package/dist/cjs/ui/floating-toolbar.js +21 -2
  13. package/dist/es2019/editor-commands/index.js +44 -4
  14. package/dist/es2019/editor-commands/utils.js +14 -0
  15. package/dist/es2019/pm-plugins/menu-and-toolbar-experiences.js +261 -0
  16. package/dist/es2019/syncedBlockPlugin.js +19 -12
  17. package/dist/es2019/types/index.js +5 -2
  18. package/dist/es2019/ui/CreateSyncedBlockButton.js +2 -1
  19. package/dist/es2019/ui/CreateSyncedBlockDropdownItem.js +2 -1
  20. package/dist/es2019/ui/SyncBlockRefresher.js +18 -4
  21. package/dist/es2019/ui/SyncedLocationDropdown.js +14 -11
  22. package/dist/es2019/ui/floating-toolbar.js +20 -3
  23. package/dist/esm/editor-commands/index.js +42 -4
  24. package/dist/esm/editor-commands/utils.js +14 -0
  25. package/dist/esm/pm-plugins/menu-and-toolbar-experiences.js +260 -0
  26. package/dist/esm/syncedBlockPlugin.js +21 -12
  27. package/dist/esm/types/index.js +5 -2
  28. package/dist/esm/ui/CreateSyncedBlockButton.js +2 -1
  29. package/dist/esm/ui/CreateSyncedBlockDropdownItem.js +2 -1
  30. package/dist/esm/ui/SyncBlockRefresher.js +18 -4
  31. package/dist/esm/ui/SyncedLocationDropdown.js +14 -11
  32. package/dist/esm/ui/floating-toolbar.js +22 -3
  33. package/dist/types/editor-commands/index.d.ts +8 -1
  34. package/dist/types/editor-commands/utils.d.ts +2 -0
  35. package/dist/types/pm-plugins/menu-and-toolbar-experiences.d.ts +12 -0
  36. package/dist/types/types/index.d.ts +5 -14
  37. package/dist/types-ts4.5/editor-commands/index.d.ts +8 -1
  38. package/dist/types-ts4.5/editor-commands/utils.d.ts +2 -0
  39. package/dist/types-ts4.5/pm-plugins/menu-and-toolbar-experiences.d.ts +12 -0
  40. package/dist/types-ts4.5/types/index.d.ts +5 -14
  41. package/package.json +3 -3
  42. package/dist/cjs/pm-plugins/experience-tracking/create-reference-experience.js +0 -113
  43. package/dist/cjs/pm-plugins/experience-tracking/create-source-experience.js +0 -169
  44. package/dist/cjs/pm-plugins/experience-tracking/delete-reference-experience.js +0 -175
  45. package/dist/cjs/pm-plugins/experience-tracking/delete-source-experience.js +0 -103
  46. package/dist/cjs/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +0 -61
  47. package/dist/cjs/pm-plugins/experience-tracking/provider-only-experiences.js +0 -128
  48. package/dist/cjs/pm-plugins/utils/experience-tracking-utils.js +0 -85
  49. package/dist/es2019/pm-plugins/experience-tracking/create-reference-experience.js +0 -109
  50. package/dist/es2019/pm-plugins/experience-tracking/create-source-experience.js +0 -166
  51. package/dist/es2019/pm-plugins/experience-tracking/delete-reference-experience.js +0 -181
  52. package/dist/es2019/pm-plugins/experience-tracking/delete-source-experience.js +0 -98
  53. package/dist/es2019/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +0 -46
  54. package/dist/es2019/pm-plugins/experience-tracking/provider-only-experiences.js +0 -127
  55. package/dist/es2019/pm-plugins/utils/experience-tracking-utils.js +0 -65
  56. package/dist/esm/pm-plugins/experience-tracking/create-reference-experience.js +0 -107
  57. package/dist/esm/pm-plugins/experience-tracking/create-source-experience.js +0 -163
  58. package/dist/esm/pm-plugins/experience-tracking/delete-reference-experience.js +0 -169
  59. package/dist/esm/pm-plugins/experience-tracking/delete-source-experience.js +0 -97
  60. package/dist/esm/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +0 -55
  61. package/dist/esm/pm-plugins/experience-tracking/provider-only-experiences.js +0 -122
  62. package/dist/esm/pm-plugins/utils/experience-tracking-utils.js +0 -79
  63. package/dist/types/pm-plugins/experience-tracking/create-reference-experience.d.ts +0 -10
  64. package/dist/types/pm-plugins/experience-tracking/create-source-experience.d.ts +0 -10
  65. package/dist/types/pm-plugins/experience-tracking/delete-reference-experience.d.ts +0 -13
  66. package/dist/types/pm-plugins/experience-tracking/delete-source-experience.d.ts +0 -12
  67. package/dist/types/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +0 -5
  68. package/dist/types/pm-plugins/experience-tracking/provider-only-experiences.d.ts +0 -3
  69. package/dist/types/pm-plugins/utils/experience-tracking-utils.d.ts +0 -9
  70. package/dist/types-ts4.5/pm-plugins/experience-tracking/create-reference-experience.d.ts +0 -10
  71. package/dist/types-ts4.5/pm-plugins/experience-tracking/create-source-experience.d.ts +0 -10
  72. package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-reference-experience.d.ts +0 -13
  73. package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-source-experience.d.ts +0 -12
  74. package/dist/types-ts4.5/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +0 -5
  75. package/dist/types-ts4.5/pm-plugins/experience-tracking/provider-only-experiences.d.ts +0 -3
  76. package/dist/types-ts4.5/pm-plugins/utils/experience-tracking-utils.d.ts +0 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlaskit/editor-plugin-synced-block
2
2
 
3
+ ## 5.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`870c3baec758b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/870c3baec758b) -
8
+ Enable consumers to use GraphQL subscription for fetching the block data when the block changes
9
+
10
+ ### Patch Changes
11
+
12
+ - [`5c522f81f181e`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5c522f81f181e) -
13
+ [ux] EDITOR-4369 Support synced location for references on Jira in source and reference synced
14
+ block
15
+ - [`058065aadf69f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/058065aadf69f) -
16
+ [ux] [EDITOR-2851] Support reference sync block unsyc
17
+ - Updated dependencies
18
+
19
+ ## 5.2.2
20
+
21
+ ### Patch Changes
22
+
23
+ - [`7f41011a1b0ff`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/7f41011a1b0ff) -
24
+ EDITOR-1665 update sync block experience events to use general experience ids, keep existing error
25
+ events and add success events
26
+ - Updated dependencies
27
+
3
28
  ## 5.2.1
4
29
 
5
30
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../../tsconfig.entry-points.jira.json",
2
+ "extends": "../../../../tsconfig.local-consumption.json",
3
3
  "compilerOptions": {
4
4
  "target": "es5",
5
5
  "outDir": "../../../../../jira/tsDist/@atlaskit__editor-plugin-synced-block/app",
@@ -3,19 +3,23 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.removeSyncedBlock = exports.editSyncedBlockSource = exports.createSyncedBlock = exports.copySyncedBlockReferenceToClipboardEditorCommand = exports.copySyncedBlockReferenceToClipboard = void 0;
6
+ exports.unsync = exports.removeSyncedBlock = exports.editSyncedBlockSource = exports.createSyncedBlock = exports.copySyncedBlockReferenceToClipboardEditorCommand = exports.copySyncedBlockReferenceToClipboard = void 0;
7
+ var _schemaDefault = require("@atlaskit/adf-schema/schema-default");
7
8
  var _analytics = require("@atlaskit/editor-common/analytics");
8
9
  var _copyButton = require("@atlaskit/editor-common/copy-button");
10
+ var _model = require("@atlaskit/editor-prosemirror/model");
9
11
  var _state = require("@atlaskit/editor-prosemirror/state");
10
12
  var _utils = require("@atlaskit/editor-prosemirror/utils");
11
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
14
  var _main = require("../pm-plugins/main");
13
15
  var _utils2 = require("../pm-plugins/utils/utils");
14
16
  var _types = require("../types");
17
+ var _utils3 = require("./utils");
15
18
  var createSyncedBlock = exports.createSyncedBlock = function createSyncedBlock(_ref) {
16
19
  var tr = _ref.tr,
17
20
  syncBlockStore = _ref.syncBlockStore,
18
- typeAheadInsert = _ref.typeAheadInsert;
21
+ typeAheadInsert = _ref.typeAheadInsert,
22
+ fireAnalyticsEvent = _ref.fireAnalyticsEvent;
19
23
  var _tr$doc$type$schema$n = tr.doc.type.schema.nodes,
20
24
  bodiedSyncBlock = _tr$doc$type$schema$n.bodiedSyncBlock,
21
25
  paragraph = _tr$doc$type$schema$n.paragraph;
@@ -41,9 +45,14 @@ var createSyncedBlock = exports.createSyncedBlock = function createSyncedBlock(_
41
45
  var conversionInfo = (0, _utils2.canBeConvertedToSyncBlock)(tr.selection);
42
46
  if (!conversionInfo) {
43
47
  if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
44
- var _syncBlockStore$sourc;
45
- (_syncBlockStore$sourc = syncBlockStore.sourceManager.createExperience) === null || _syncBlockStore$sourc === void 0 || _syncBlockStore$sourc.failure({
46
- reason: 'Selection is not allowed to be converted to sync block'
48
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 || fireAnalyticsEvent({
49
+ action: _analytics.ACTION.ERROR,
50
+ actionSubject: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
51
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_CREATE,
52
+ attributes: {
53
+ error: 'Content cannot be converted to sync block'
54
+ },
55
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL
47
56
  });
48
57
  }
49
58
  return false;
@@ -168,4 +177,33 @@ var removeSyncedBlock = exports.removeSyncedBlock = function removeSyncedBlock(a
168
177
  api === null || api === void 0 || api.core.actions.focus();
169
178
  return true;
170
179
  };
180
+ };
181
+
182
+ /**
183
+ * Deletes (bodied)SyncBlock node and paste its content to the editor
184
+ */
185
+ var unsync = exports.unsync = function unsync(storeManager, isBodiedSyncBlock, view) {
186
+ var _storeManager$referen;
187
+ if (!view) {
188
+ return false;
189
+ }
190
+ var state = view.state;
191
+ var syncBlock = (0, _utils2.findSyncBlockOrBodiedSyncBlock)(state.schema, state.selection);
192
+ if (!syncBlock) {
193
+ return false;
194
+ }
195
+ if (isBodiedSyncBlock) {
196
+ return true;
197
+ }
198
+
199
+ // handle syncBlock unsync
200
+ var syncBlockContent = (_storeManager$referen = storeManager.referenceManager.getFromCache(syncBlock.node.attrs.resourceId)) === null || _storeManager$referen === void 0 || (_storeManager$referen = _storeManager$referen.data) === null || _storeManager$referen === void 0 ? void 0 : _storeManager$referen.content;
201
+ if (!syncBlockContent) {
202
+ return false;
203
+ }
204
+
205
+ // use defaultSchema for serialization so we can serialize any type of nodes and marks despite current editor's schema might not allow it
206
+ var contentFragment = _model.Fragment.fromJSON(_schemaDefault.defaultSchema, syncBlockContent);
207
+ var contentDOM = _model.DOMSerializer.fromSchema(_schemaDefault.defaultSchema).serializeFragment(contentFragment);
208
+ return (0, _utils3.pasteSyncBlockHTMLContent)(contentDOM, view);
171
209
  };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.pasteSyncBlockHTMLContent = void 0;
7
+ var pasteSyncBlockHTMLContent = exports.pasteSyncBlockHTMLContent = function pasteSyncBlockHTMLContent(contentDOM, view) {
8
+ var tmpDiv = document.createElement('div');
9
+ tmpDiv.appendChild(contentDOM);
10
+
11
+ // This is required so that prosemirror can read the fragment context and slice properly
12
+ if (tmpDiv.firstChild instanceof HTMLElement) {
13
+ tmpDiv.firstChild.setAttribute('data-pm-slice', '0 0 []');
14
+
15
+ // As per requirement - when unsync reference block, it should render its content as copy&paste behaviour
16
+ // Hence here we call pasteHTML to evoke editor paste logic that handles any unsupported nodes/marks
17
+ return view.pasteHTML(tmpDiv.innerHTML);
18
+ }
19
+ return false;
20
+ };
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getMenuAndToolbarExperiencesPlugin = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _bindEventListener = require("bind-event-listener");
10
+ var _analytics = require("@atlaskit/editor-common/analytics");
11
+ var _experiences = require("@atlaskit/editor-common/experiences");
12
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
13
+ var _state = require("@atlaskit/editor-prosemirror/state");
14
+ var _types = require("../types");
15
+ var TIMEOUT_DURATION = 30000;
16
+ var pluginKey = new _state.PluginKey('syncedBlockMenuAndToolbarExperience');
17
+ var SYNCED_BLOCK_BUTTON_TEST_IDS = Object.values(_types.SYNCED_BLOCK_BUTTON_TEST_ID);
18
+ var syncedBlockButtonIds = new Set(SYNCED_BLOCK_BUTTON_TEST_IDS);
19
+ var targetEl;
20
+ var getMenuAndToolbarExperiencesPlugin = exports.getMenuAndToolbarExperiencesPlugin = function getMenuAndToolbarExperiencesPlugin(_ref) {
21
+ var refs = _ref.refs,
22
+ dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent;
23
+ var popupsTargetEl;
24
+ var editorViewEl;
25
+ var getPopupsTarget = function getPopupsTarget() {
26
+ if (!popupsTargetEl) {
27
+ popupsTargetEl = refs.popupsMountPoint || refs.wrapperElement || (0, _experiences.getPopupContainerFromEditorView)(editorViewEl);
28
+ }
29
+ return popupsTargetEl;
30
+ };
31
+ var createSourcePrimaryToolbarExperience = getCreateSourcePrimaryToolbarExperience({
32
+ refs: refs,
33
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
34
+ });
35
+ var createSourceBlockMenuExperience = getCreateSourceBlockMenuExperience({
36
+ refs: refs,
37
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
38
+ });
39
+ var createSourceQuickInsertMenuExperience = getCreateSourceQuickInsertMenuExperience({
40
+ refs: refs,
41
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
42
+ });
43
+ var deleteReferenceSyncedBlockExperience = getDeleteReferenceSyncedBlockToolbarExperience({
44
+ refs: refs,
45
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent
46
+ });
47
+ var unbindClickListener = (0, _bindEventListener.bind)(document, {
48
+ type: 'click',
49
+ listener: function listener(event) {
50
+ var target = event.target;
51
+ if (!target) {
52
+ return;
53
+ }
54
+ var button = target.closest('button[data-testid]');
55
+ if (!button || !(button instanceof HTMLButtonElement)) {
56
+ return;
57
+ }
58
+ var testId = button.dataset.testid;
59
+ if (!isSyncedBlockButtonId(testId)) {
60
+ return;
61
+ }
62
+ handleButtonClick({
63
+ testId: testId,
64
+ createSourcePrimaryToolbarExperience: createSourcePrimaryToolbarExperience,
65
+ createSourceBlockMenuExperience: createSourceBlockMenuExperience,
66
+ createSourceQuickInsertMenuExperience: createSourceQuickInsertMenuExperience,
67
+ deleteReferenceSyncedBlockExperience: deleteReferenceSyncedBlockExperience
68
+ });
69
+ }
70
+ });
71
+ var unbindKeydownListener = (0, _bindEventListener.bind)(document, {
72
+ type: 'keydown',
73
+ listener: function listener(event) {
74
+ if (isEnterKey(event.key)) {
75
+ var typeaheadPopup = (0, _experiences.popupWithNestedElement)(getPopupsTarget(), '.fabric-editor-typeahead');
76
+ if (!typeaheadPopup || !(typeaheadPopup instanceof HTMLElement)) {
77
+ return;
78
+ }
79
+ var firstItem = typeaheadPopup.querySelector('[role="option"]');
80
+ if (!firstItem || !(firstItem instanceof HTMLElement)) {
81
+ return;
82
+ }
83
+ var testId = firstItem.dataset.testid;
84
+ if (testId === _types.SYNCED_BLOCK_BUTTON_TEST_ID.quickInsertCreate) {
85
+ createSourceQuickInsertMenuExperience.start();
86
+ }
87
+ }
88
+ },
89
+ options: {
90
+ capture: true
91
+ }
92
+ });
93
+ return new _safePlugin.SafePlugin({
94
+ key: pluginKey,
95
+ view: function view(editorView) {
96
+ editorViewEl = editorView.dom;
97
+ return {
98
+ destroy: function destroy() {
99
+ createSourcePrimaryToolbarExperience.abort({
100
+ reason: 'editor-destroyed'
101
+ });
102
+ createSourceBlockMenuExperience.abort({
103
+ reason: 'editor-destroyed'
104
+ });
105
+ createSourceQuickInsertMenuExperience.abort({
106
+ reason: 'editor-destroyed'
107
+ });
108
+ deleteReferenceSyncedBlockExperience.abort({
109
+ reason: 'editor-destroyed'
110
+ });
111
+ unbindClickListener();
112
+ unbindKeydownListener();
113
+ }
114
+ };
115
+ }
116
+ });
117
+ };
118
+ var getCreateSourcePrimaryToolbarExperience = function getCreateSourcePrimaryToolbarExperience(_ref2) {
119
+ var refs = _ref2.refs,
120
+ dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
121
+ return new _experiences.Experience(_experiences.EXPERIENCE_ID.TOOLBAR_ACTION, {
122
+ action: _analytics.ACTION.SYNCED_BLOCK_CREATE,
123
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.PRIMARY_TOOLBAR,
124
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
125
+ checks: [new _experiences.ExperienceCheckTimeout({
126
+ durationMs: TIMEOUT_DURATION
127
+ }), syncedBlockAddedToDomCheck(refs)]
128
+ });
129
+ };
130
+ var getCreateSourceBlockMenuExperience = function getCreateSourceBlockMenuExperience(_ref3) {
131
+ var refs = _ref3.refs,
132
+ dispatchAnalyticsEvent = _ref3.dispatchAnalyticsEvent;
133
+ return new _experiences.Experience(_experiences.EXPERIENCE_ID.MENU_ACTION, {
134
+ action: _analytics.ACTION.SYNCED_BLOCK_CREATE,
135
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.BLOCK_MENU,
136
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
137
+ checks: [new _experiences.ExperienceCheckTimeout({
138
+ durationMs: TIMEOUT_DURATION
139
+ }), syncedBlockAddedToDomCheck(refs)]
140
+ });
141
+ };
142
+ var getCreateSourceQuickInsertMenuExperience = function getCreateSourceQuickInsertMenuExperience(_ref4) {
143
+ var refs = _ref4.refs,
144
+ dispatchAnalyticsEvent = _ref4.dispatchAnalyticsEvent;
145
+ return new _experiences.Experience(_experiences.EXPERIENCE_ID.MENU_ACTION, {
146
+ action: _analytics.ACTION.SYNCED_BLOCK_CREATE,
147
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.QUICK_INSERT,
148
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
149
+ checks: [new _experiences.ExperienceCheckTimeout({
150
+ durationMs: TIMEOUT_DURATION
151
+ }), syncedBlockAddedToDomCheck(refs)]
152
+ });
153
+ };
154
+ var getDeleteReferenceSyncedBlockToolbarExperience = function getDeleteReferenceSyncedBlockToolbarExperience(_ref5) {
155
+ var refs = _ref5.refs,
156
+ dispatchAnalyticsEvent = _ref5.dispatchAnalyticsEvent;
157
+ return new _experiences.Experience(_experiences.EXPERIENCE_ID.TOOLBAR_ACTION, {
158
+ action: _analytics.ACTION.REFERENCE_SYNCED_BLOCK_DELETE,
159
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_TOOLBAR,
160
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
161
+ checks: [new _experiences.ExperienceCheckTimeout({
162
+ durationMs: TIMEOUT_DURATION
163
+ }), referenceSyncBlockRemovedFromDomCheck(refs)]
164
+ });
165
+ };
166
+ var isSyncedBlockButtonId = function isSyncedBlockButtonId(value) {
167
+ return !!value && syncedBlockButtonIds.has(value);
168
+ };
169
+ var handleButtonClick = function handleButtonClick(_ref6) {
170
+ var testId = _ref6.testId,
171
+ createSourcePrimaryToolbarExperience = _ref6.createSourcePrimaryToolbarExperience,
172
+ createSourceBlockMenuExperience = _ref6.createSourceBlockMenuExperience,
173
+ createSourceQuickInsertMenuExperience = _ref6.createSourceQuickInsertMenuExperience,
174
+ deleteReferenceSyncedBlockExperience = _ref6.deleteReferenceSyncedBlockExperience;
175
+ switch (testId) {
176
+ case _types.SYNCED_BLOCK_BUTTON_TEST_ID.primaryToolbarCreate:
177
+ createSourcePrimaryToolbarExperience.start();
178
+ break;
179
+ case _types.SYNCED_BLOCK_BUTTON_TEST_ID.blockMenuCreate:
180
+ createSourceBlockMenuExperience.start();
181
+ break;
182
+ case _types.SYNCED_BLOCK_BUTTON_TEST_ID.quickInsertCreate:
183
+ createSourceQuickInsertMenuExperience.start();
184
+ break;
185
+ case _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarReferenceDelete:
186
+ deleteReferenceSyncedBlockExperience.start();
187
+ break;
188
+ default:
189
+ {
190
+ // Exhaustiveness check: if a new SyncedBlockToolbarButtonId is added
191
+ // but not handled above, TypeScript will error here.
192
+ var _exhaustiveCheck = testId;
193
+ return _exhaustiveCheck;
194
+ }
195
+ }
196
+ };
197
+ var isEnterKey = function isEnterKey(key) {
198
+ return key === 'Enter';
199
+ };
200
+ var getTarget = function getTarget(containerElement) {
201
+ if (!targetEl) {
202
+ var element = containerElement === null || containerElement === void 0 ? void 0 : containerElement.querySelector('.ProseMirror');
203
+ if (!element || !(element instanceof HTMLElement)) {
204
+ return null;
205
+ }
206
+ targetEl = element;
207
+ }
208
+ return targetEl;
209
+ };
210
+ var syncedBlockAddedToDomCheck = function syncedBlockAddedToDomCheck(refs) {
211
+ return new _experiences.ExperienceCheckDomMutation({
212
+ onDomMutation: function onDomMutation(_ref7) {
213
+ var mutations = _ref7.mutations;
214
+ if (mutations.some(isBodiedSyncBlockAddedInMutation)) {
215
+ return {
216
+ status: 'success'
217
+ };
218
+ }
219
+ return undefined;
220
+ },
221
+ observeConfig: function observeConfig() {
222
+ return {
223
+ target: getTarget(refs.containerElement),
224
+ options: {
225
+ childList: true
226
+ }
227
+ };
228
+ }
229
+ });
230
+ };
231
+ var isBodiedSyncBlockAddedInMutation = function isBodiedSyncBlockAddedInMutation(_ref8) {
232
+ var type = _ref8.type,
233
+ addedNodes = _ref8.addedNodes;
234
+ return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isBodiedSyncBlockWithinNode);
235
+ };
236
+ var isBodiedSyncBlockWithinNode = function isBodiedSyncBlockWithinNode(node) {
237
+ return (0, _experiences.getNodeQuery)('[data-prosemirror-node-name="bodiedSyncBlock"]')(node);
238
+ };
239
+ var referenceSyncBlockRemovedFromDomCheck = function referenceSyncBlockRemovedFromDomCheck(refs) {
240
+ return new _experiences.ExperienceCheckDomMutation({
241
+ onDomMutation: function onDomMutation(_ref9) {
242
+ var mutations = _ref9.mutations;
243
+ if (mutations.some(isSyncBlockRemovedInMutation)) {
244
+ return {
245
+ status: 'success'
246
+ };
247
+ }
248
+ return undefined;
249
+ },
250
+ observeConfig: function observeConfig() {
251
+ return {
252
+ target: getTarget(refs.containerElement),
253
+ options: {
254
+ childList: true
255
+ }
256
+ };
257
+ }
258
+ });
259
+ };
260
+ var isSyncBlockRemovedInMutation = function isSyncBlockRemovedInMutation(_ref0) {
261
+ var type = _ref0.type,
262
+ removedNodes = _ref0.removedNodes;
263
+ return type === 'childList' && (0, _toConsumableArray2.default)(removedNodes).some(isSyncBlockWithinNode);
264
+ };
265
+ var isSyncBlockWithinNode = function isSyncBlockWithinNode(node) {
266
+ return (0, _experiences.getNodeQuery)('[data-prosemirror-node-name="syncBlock"]')(node);
267
+ };
@@ -15,8 +15,9 @@ var _lozenge = _interopRequireDefault(require("@atlaskit/lozenge"));
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
16
  var _editorActions = require("./editor-actions");
17
17
  var _editorCommands = require("./editor-commands");
18
- var _getExperienceTrackingPlugins = require("./pm-plugins/experience-tracking/get-experience-tracking-plugins");
19
18
  var _main = require("./pm-plugins/main");
19
+ var _menuAndToolbarExperiences = require("./pm-plugins/menu-and-toolbar-experiences");
20
+ var _types = require("./types");
20
21
  var _blockMenuComponents = require("./ui/block-menu-components");
21
22
  var _DeleteConfirmationModal = require("./ui/DeleteConfirmationModal");
22
23
  var _Flag = require("./ui/Flag");
@@ -49,14 +50,18 @@ var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_
49
50
  plugin: function plugin(params) {
50
51
  return (0, _main.createPlugin)(config, params, syncBlockStore, api);
51
52
  }
52
- }].concat((0, _toConsumableArray2.default)((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? (0, _getExperienceTrackingPlugins.getExperienceTrackingPlugins)({
53
- refs: refs,
54
- dispatchAnalyticsEvent: function dispatchAnalyticsEvent(payload) {
55
- var _api$analytics2;
56
- return api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions.fireAnalyticsEvent(payload);
57
- },
58
- syncBlockStore: syncBlockStore
59
- }) : []));
53
+ }].concat((0, _toConsumableArray2.default)((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? [{
54
+ name: 'menuAndToolbarExperiencesPlugin',
55
+ plugin: function plugin() {
56
+ return (0, _menuAndToolbarExperiences.getMenuAndToolbarExperiencesPlugin)({
57
+ refs: refs,
58
+ dispatchAnalyticsEvent: function dispatchAnalyticsEvent(payload) {
59
+ var _api$analytics2;
60
+ return api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || (_api$analytics2 = _api$analytics2.actions) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.fireAnalyticsEvent(payload);
61
+ }
62
+ });
63
+ }
64
+ }] : []));
60
65
  },
61
66
  commands: {
62
67
  copySyncedBlockReferenceToClipboard: function copySyncedBlockReferenceToClipboard() {
@@ -64,13 +69,15 @@ var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_
64
69
  },
65
70
  insertSyncedBlock: function insertSyncedBlock() {
66
71
  return function (_ref2) {
72
+ var _api$analytics3;
67
73
  var tr = _ref2.tr;
68
74
  if (!(config !== null && config !== void 0 && config.enableSourceCreation)) {
69
75
  return null;
70
76
  }
71
77
  return (0, _editorCommands.createSyncedBlock)({
72
78
  tr: tr,
73
- syncBlockStore: syncBlockStore
79
+ syncBlockStore: syncBlockStore,
80
+ fireAnalyticsEvent: api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions.fireAnalyticsEvent
74
81
  }) || null;
75
82
  };
76
83
  }
@@ -106,13 +113,15 @@ var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_
106
113
  });
107
114
  },
108
115
  action: function action(insert, state) {
116
+ var _api$analytics4;
109
117
  return (0, _editorCommands.createSyncedBlock)({
110
118
  tr: state.tr,
111
119
  syncBlockStore: syncBlockStore,
112
- typeAheadInsert: insert
120
+ typeAheadInsert: insert,
121
+ fireAnalyticsEvent: api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions.fireAnalyticsEvent
113
122
  });
114
123
  },
115
- testId: (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? 'create-synced-block-quick-insert-btn' : undefined
124
+ testId: (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? _types.SYNCED_BLOCK_BUTTON_TEST_ID.quickInsertCreate : undefined
116
125
  }];
117
126
  },
118
127
  floatingToolbar: function floatingToolbar(state, intl) {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.FLAG_ID = exports.EXPERIENCE_ABORT_REASON = void 0;
6
+ exports.SYNCED_BLOCK_BUTTON_TEST_ID = exports.FLAG_ID = void 0;
7
7
  var FLAG_ID = exports.FLAG_ID = /*#__PURE__*/function (FLAG_ID) {
8
8
  FLAG_ID["CANNOT_DELETE_WHEN_OFFLINE"] = "cannot-delete-when-offline";
9
9
  FLAG_ID["CANNOT_EDIT_WHEN_OFFLINE"] = "cannot-edit-when-offline";
@@ -12,6 +12,9 @@ var FLAG_ID = exports.FLAG_ID = /*#__PURE__*/function (FLAG_ID) {
12
12
  FLAG_ID["SYNC_BLOCK_COPIED"] = "sync-block-copied";
13
13
  return FLAG_ID;
14
14
  }({});
15
- var EXPERIENCE_ABORT_REASON = exports.EXPERIENCE_ABORT_REASON = {
16
- EDITOR_DESTROYED: 'editor-destroyed'
15
+ var SYNCED_BLOCK_BUTTON_TEST_ID = exports.SYNCED_BLOCK_BUTTON_TEST_ID = {
16
+ primaryToolbarCreate: 'create-synced-block-toolbar-btn',
17
+ blockMenuCreate: 'create-synced-block-block-menu-btn',
18
+ quickInsertCreate: 'create-synced-block-quick-insert-btn',
19
+ syncedBlockToolbarReferenceDelete: 'reference-synced-block-delete-btn'
17
20
  };
@@ -14,6 +14,7 @@ var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
14
14
  var _editorToolbar = require("@atlaskit/editor-toolbar");
15
15
  var _blockSynced = _interopRequireDefault(require("@atlaskit/icon-lab/core/block-synced"));
16
16
  var _utils = require("../pm-plugins/utils/utils");
17
+ var _types = require("../types");
17
18
  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); }
18
19
  var CreateSyncedBlockButton = exports.CreateSyncedBlockButton = function CreateSyncedBlockButton(_ref) {
19
20
  var api = _ref.api;
@@ -53,7 +54,7 @@ var CreateSyncedBlockButton = exports.CreateSyncedBlockButton = function CreateS
53
54
  label: ""
54
55
  }),
55
56
  isDisabled: isDisabled,
56
- testId: "create-synced-block-toolbar-btn",
57
+ testId: _types.SYNCED_BLOCK_BUTTON_TEST_ID.primaryToolbarCreate,
57
58
  onClick: onClick
58
59
  }));
59
60
  };
@@ -14,6 +14,7 @@ var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
14
14
  var _editorToolbar = require("@atlaskit/editor-toolbar");
15
15
  var _lozenge = _interopRequireDefault(require("@atlaskit/lozenge"));
16
16
  var _utils = require("../pm-plugins/utils/utils");
17
+ var _types = require("../types");
17
18
  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); }
18
19
  var CreateSyncedBlockDropdownItem = function CreateSyncedBlockDropdownItem(_ref) {
19
20
  var api = _ref.api;
@@ -51,7 +52,7 @@ var CreateSyncedBlockDropdownItem = function CreateSyncedBlockDropdownItem(_ref)
51
52
  }),
52
53
  onClick: onClick,
53
54
  isDisabled: isOffline,
54
- testId: "create-synced-block-block-menu-btn",
55
+ testId: _types.SYNCED_BLOCK_BUTTON_TEST_ID.blockMenuCreate,
55
56
  elemAfter: /*#__PURE__*/_react.default.createElement(_lozenge.default, {
56
57
  appearance: "new"
57
58
  }, formatMessage(_messages.blockMenuMessages.newLozenge))
@@ -6,10 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.SyncBlockRefresher = exports.SYNC_BLOCK_FETCH_INTERVAL = void 0;
7
7
  var _react = require("react");
8
8
  var _hooks = require("@atlaskit/editor-common/hooks");
9
+ var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
9
11
  var SYNC_BLOCK_FETCH_INTERVAL = exports.SYNC_BLOCK_FETCH_INTERVAL = 3000;
10
12
 
11
- // Component that refreshes synced block subscriptions at regular intervals
12
- // this is a workaround for the subscription mechanism not being real-time
13
+ // Component that manages synced block data synchronization.
14
+ // When the feature flag 'platform_synced_block_dogfooding' is enabled,
15
+ // it uses provider-based GraphQL subscriptions for updates.
16
+ // When disabled, it falls back to polling at regular intervals.
13
17
  var SyncBlockRefresher = exports.SyncBlockRefresher = function SyncBlockRefresher(_ref) {
14
18
  var syncBlockStoreManager = _ref.syncBlockStoreManager,
15
19
  api = _ref.api;
@@ -20,9 +24,19 @@ var SyncBlockRefresher = exports.SyncBlockRefresher = function SyncBlockRefreshe
20
24
  };
21
25
  }),
22
26
  mode = _useSharedPluginState.mode;
27
+ var featureFlagEnabled = (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding');
28
+ var isOnline = !(0, _editorPluginConnectivity.isOfflineMode)(mode);
23
29
  (0, _react.useEffect)(function () {
30
+ var useRealTimeSubscriptions = featureFlagEnabled && isOnline;
31
+ syncBlockStoreManager.referenceManager.setRealTimeSubscriptionsEnabled(useRealTimeSubscriptions);
32
+ }, [syncBlockStoreManager, featureFlagEnabled, isOnline]);
33
+ (0, _react.useEffect)(function () {
34
+ var useRealTimeSubscriptions = featureFlagEnabled && isOnline;
35
+ if (useRealTimeSubscriptions) {
36
+ return;
37
+ }
24
38
  var interval = -1;
25
- if (mode !== 'offline') {
39
+ if (isOnline) {
26
40
  interval = window.setInterval(function () {
27
41
  var _document;
28
42
  // check if document is visible to avoid unnecessary refreshes
@@ -36,6 +50,6 @@ var SyncBlockRefresher = exports.SyncBlockRefresher = function SyncBlockRefreshe
36
50
  return function () {
37
51
  window.clearInterval(interval);
38
52
  };
39
- }, [syncBlockStoreManager, mode]);
53
+ }, [syncBlockStoreManager, isOnline, featureFlagEnabled]);
40
54
  return null;
41
55
  };
@@ -56,16 +56,17 @@ var styles = {
56
56
  var ItemTitle = function ItemTitle(_ref) {
57
57
  var title = _ref.title,
58
58
  formatMessage = _ref.formatMessage,
59
- onSamePage = _ref.onSamePage,
59
+ onSameDocument = _ref.onSameDocument,
60
60
  isSource = _ref.isSource,
61
- hasAccess = _ref.hasAccess;
61
+ hasAccess = _ref.hasAccess,
62
+ productType = _ref.productType;
62
63
  return /*#__PURE__*/React.createElement(_compiled.Inline, null, /*#__PURE__*/React.createElement(_compiled.Box, {
63
64
  as: "span",
64
65
  xcss: styles.title
65
- }, title), onSamePage && /*#__PURE__*/React.createElement(_compiled.Box, {
66
+ }, title), onSameDocument && /*#__PURE__*/React.createElement(_compiled.Box, {
66
67
  as: "span",
67
68
  xcss: styles.note
68
- }, "\xA0- ", formatMessage(_messages.syncBlockMessages.syncedLocationDropdownTitleNote)), isSource && /*#__PURE__*/React.createElement(_compiled.Box, {
69
+ }, "\xA0- ", formatMessage(productType === 'confluence-page' ? _messages.syncBlockMessages.syncedLocationDropdownTitleNoteForConfluencePage : _messages.syncBlockMessages.syncedLocationDropdownTitleNoteForJiraWorkItem)), isSource && /*#__PURE__*/React.createElement(_compiled.Box, {
69
70
  as: "span",
70
71
  xcss: styles.lozenge
71
72
  }, /*#__PURE__*/React.createElement(_lozenge.default, null, formatMessage(_messages.syncBlockMessages.syncedLocationDropdownSourceLozenge))), !hasAccess && /*#__PURE__*/React.createElement(_compiled.Box, {
@@ -82,7 +83,7 @@ var subTypeIconMap = {
82
83
  page: _page.default,
83
84
  blogpost: _quotationMark.default
84
85
  };
85
- var getSubTypeIcon = function getSubTypeIcon(subType) {
86
+ var getConfluenceSubTypeIcon = function getConfluenceSubTypeIcon(subType) {
86
87
  return subType && subType in subTypeIconMap ? subTypeIconMap[subType] : _page.default;
87
88
  };
88
89
  var ProductIcon = function ProductIcon(_ref2) {
@@ -99,17 +100,18 @@ var ProductIcon = function ProductIcon(_ref2) {
99
100
  var ItemIcon = function ItemIcon(_ref3) {
100
101
  var reference = _ref3.reference;
101
102
  var hasAccess = reference.hasAccess,
102
- subType = reference.subType;
103
- if (hasAccess) {
103
+ subType = reference.subType,
104
+ productType = reference.productType;
105
+ if (productType === 'confluence-page' && hasAccess) {
104
106
  return /*#__PURE__*/React.createElement(_icon.IconTile, {
105
- icon: getSubTypeIcon(subType),
107
+ icon: getConfluenceSubTypeIcon(subType),
106
108
  label: "",
107
109
  appearance: 'gray',
108
110
  size: "xsmall"
109
111
  });
110
112
  }
111
113
  return /*#__PURE__*/React.createElement(ProductIcon, {
112
- product: reference.productType
114
+ product: productType
113
115
  });
114
116
  };
115
117
  var processReferenceData = exports.processReferenceData = function processReferenceData(referenceData, intl) {
@@ -277,9 +279,10 @@ var DropdownContent = function DropdownContent(_ref7) {
277
279
  }, /*#__PURE__*/React.createElement(ItemTitle, {
278
280
  title: reference.title || reference.url || '',
279
281
  formatMessage: formatMessage,
280
- onSamePage: reference.onSamePage,
282
+ onSameDocument: reference.onSameDocument,
281
283
  isSource: reference.isSource,
282
- hasAccess: reference.hasAccess
284
+ hasAccess: reference.hasAccess,
285
+ productType: reference.productType
283
286
  }))));
284
287
  })));
285
288
  } else {