@atlaskit/editor-plugin-synced-block 5.1.8 → 5.1.10
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.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/editor-commands/index.js +2 -2
- package/dist/cjs/pm-plugins/experience-tracking/create-reference-experience.js +26 -26
- package/dist/cjs/pm-plugins/experience-tracking/create-source-experience.js +14 -30
- package/dist/cjs/pm-plugins/experience-tracking/delete-reference-experience.js +175 -0
- package/dist/cjs/pm-plugins/experience-tracking/delete-source-experience.js +103 -0
- package/dist/cjs/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +30 -0
- package/dist/cjs/pm-plugins/experience-tracking/provider-only-experiences.js +128 -0
- package/dist/cjs/pm-plugins/utils/experience-tracking-utils.js +85 -0
- package/dist/cjs/types/index.js +5 -2
- package/dist/cjs/ui/CreateSyncedBlockDropdownItem.js +40 -8
- package/dist/cjs/ui/DeleteConfirmationModal.js +3 -1
- package/dist/cjs/ui/floating-toolbar.js +4 -2
- package/dist/es2019/editor-commands/index.js +2 -2
- package/dist/es2019/pm-plugins/experience-tracking/create-reference-experience.js +27 -23
- package/dist/es2019/pm-plugins/experience-tracking/create-source-experience.js +14 -27
- package/dist/es2019/pm-plugins/experience-tracking/delete-reference-experience.js +181 -0
- package/dist/es2019/pm-plugins/experience-tracking/delete-source-experience.js +98 -0
- package/dist/es2019/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +24 -0
- package/dist/es2019/pm-plugins/experience-tracking/provider-only-experiences.js +127 -0
- package/dist/es2019/pm-plugins/utils/experience-tracking-utils.js +65 -0
- package/dist/es2019/types/index.js +4 -1
- package/dist/es2019/ui/CreateSyncedBlockDropdownItem.js +38 -3
- package/dist/es2019/ui/DeleteConfirmationModal.js +3 -1
- package/dist/es2019/ui/floating-toolbar.js +3 -1
- package/dist/esm/editor-commands/index.js +2 -2
- package/dist/esm/pm-plugins/experience-tracking/create-reference-experience.js +26 -25
- package/dist/esm/pm-plugins/experience-tracking/create-source-experience.js +14 -29
- package/dist/esm/pm-plugins/experience-tracking/delete-reference-experience.js +169 -0
- package/dist/esm/pm-plugins/experience-tracking/delete-source-experience.js +97 -0
- package/dist/esm/pm-plugins/experience-tracking/get-experience-tracking-plugins.js +30 -0
- package/dist/esm/pm-plugins/experience-tracking/provider-only-experiences.js +122 -0
- package/dist/esm/pm-plugins/utils/experience-tracking-utils.js +79 -0
- package/dist/esm/types/index.js +4 -1
- package/dist/esm/ui/CreateSyncedBlockDropdownItem.js +40 -8
- package/dist/esm/ui/DeleteConfirmationModal.js +3 -1
- package/dist/esm/ui/floating-toolbar.js +4 -2
- package/dist/types/pm-plugins/experience-tracking/create-reference-experience.d.ts +2 -9
- package/dist/types/pm-plugins/experience-tracking/create-source-experience.d.ts +4 -15
- package/dist/types/pm-plugins/experience-tracking/delete-reference-experience.d.ts +13 -0
- package/dist/types/pm-plugins/experience-tracking/delete-source-experience.d.ts +12 -0
- package/dist/types/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +2 -13
- package/dist/types/pm-plugins/experience-tracking/provider-only-experiences.d.ts +3 -0
- package/dist/types/pm-plugins/utils/experience-tracking-utils.d.ts +9 -0
- package/dist/types/types/index.d.ts +15 -0
- package/dist/types-ts4.5/pm-plugins/experience-tracking/create-reference-experience.d.ts +2 -9
- package/dist/types-ts4.5/pm-plugins/experience-tracking/create-source-experience.d.ts +4 -15
- package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-reference-experience.d.ts +13 -0
- package/dist/types-ts4.5/pm-plugins/experience-tracking/delete-source-experience.d.ts +12 -0
- package/dist/types-ts4.5/pm-plugins/experience-tracking/get-experience-tracking-plugins.d.ts +2 -13
- package/dist/types-ts4.5/pm-plugins/experience-tracking/provider-only-experiences.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/utils/experience-tracking-utils.d.ts +9 -0
- package/dist/types-ts4.5/types/index.d.ts +15 -0
- package/package.json +6 -6
- package/build/tsconfig.json +0 -22
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-synced-block
|
|
2
2
|
|
|
3
|
+
## 5.1.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`c975226c67ed8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/c975226c67ed8) -
|
|
8
|
+
[ux] [EDITOR-4472] Update tooltip copy for copy sync block button
|
|
9
|
+
- [`98a4415c99228`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/98a4415c99228) -
|
|
10
|
+
[ux] Set selection to the start of the previous selection when creating new synced block
|
|
11
|
+
- [`fff45a651440a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fff45a651440a) -
|
|
12
|
+
EDITOR-1665 add experience tracking analytics for sync block save, fetch and delete
|
|
13
|
+
- [`e3856219900ac`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e3856219900ac) -
|
|
14
|
+
Revert removal of 'copy synced block' from block menu
|
|
15
|
+
- Updated dependencies
|
|
16
|
+
|
|
17
|
+
## 5.1.9
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
|
|
3
23
|
## 5.1.8
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
@@ -59,8 +59,8 @@ var createSyncedBlock = exports.createSyncedBlock = function createSyncedBlock(_
|
|
|
59
59
|
syncBlockStore.sourceManager.createBodiedSyncBlockNode(_attrs);
|
|
60
60
|
tr.replaceWith(conversionInfo.from > 0 ? conversionInfo.from - 1 : 0, conversionInfo.to, _newBodiedSyncBlockNode).scrollIntoView();
|
|
61
61
|
|
|
62
|
-
// set selection to the
|
|
63
|
-
tr.setSelection(_state.TextSelection.create(tr.doc, conversionInfo.
|
|
62
|
+
// set selection to the start of the previous selection for the position taken up by the start of the new synced block
|
|
63
|
+
tr.setSelection(_state.TextSelection.create(tr.doc, conversionInfo.from));
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// This transaction will be intercepted in filterTransaction and dispatched when saving to backend succeeds
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.getCreateReferenceExperiencePlugin = void 0;
|
|
8
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
7
|
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
10
8
|
var _experiences = require("@atlaskit/editor-common/experiences");
|
|
11
9
|
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
12
10
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
11
|
+
var _types = require("../../types");
|
|
12
|
+
var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
|
|
13
13
|
var isPastedFromFabricEditor = function isPastedFromFabricEditor(html) {
|
|
14
14
|
return !!html && html.indexOf('data-pm-slice="') >= 0;
|
|
15
15
|
};
|
|
16
16
|
var pluginKey = new _state.PluginKey('createReferenceSyncBlockExperience');
|
|
17
17
|
var START_METHOD = {
|
|
18
|
-
PASTE: 'paste'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
EDITOR_DESTROYED: 'editor-destroyed'
|
|
18
|
+
PASTE: 'paste',
|
|
19
|
+
UNDO: 'undo',
|
|
20
|
+
REDO: 'redo'
|
|
22
21
|
};
|
|
23
22
|
|
|
24
23
|
/**
|
|
@@ -41,7 +40,7 @@ var getCreateReferenceExperiencePlugin = exports.getCreateReferenceExperiencePlu
|
|
|
41
40
|
return {
|
|
42
41
|
destroy: function destroy() {
|
|
43
42
|
experience.abort({
|
|
44
|
-
reason:
|
|
43
|
+
reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
|
|
45
44
|
});
|
|
46
45
|
}
|
|
47
46
|
};
|
|
@@ -63,6 +62,19 @@ var getCreateReferenceExperiencePlugin = exports.getCreateReferenceExperiencePlu
|
|
|
63
62
|
});
|
|
64
63
|
}
|
|
65
64
|
}
|
|
65
|
+
},
|
|
66
|
+
appendTransaction: function appendTransaction(transactions, oldState, newState) {
|
|
67
|
+
transactions.forEach(function (tr) {
|
|
68
|
+
var _wasSyncBlockDeletedO = (0, _experienceTrackingUtils.wasSyncBlockDeletedOrAddedByHistory)(tr, oldState, newState),
|
|
69
|
+
hasAddedSyncBlock = _wasSyncBlockDeletedO.hasAddedSyncBlock,
|
|
70
|
+
isUndo = _wasSyncBlockDeletedO.isUndo;
|
|
71
|
+
if (hasAddedSyncBlock) {
|
|
72
|
+
experience.start({
|
|
73
|
+
method: isUndo ? START_METHOD.UNDO : START_METHOD.REDO
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return null;
|
|
66
78
|
}
|
|
67
79
|
});
|
|
68
80
|
};
|
|
@@ -77,21 +89,20 @@ var getCreateReferenceExperience = function getCreateReferenceExperience(_ref2)
|
|
|
77
89
|
}), new _experiences.ExperienceCheckDomMutation({
|
|
78
90
|
onDomMutation: function onDomMutation(_ref3) {
|
|
79
91
|
var mutations = _ref3.mutations;
|
|
80
|
-
|
|
92
|
+
var insertedResourceIds = (0, _experienceTrackingUtils.getAddedResourceIds)(mutations, '[data-prosemirror-node-name="syncBlock"]');
|
|
93
|
+
if (insertedResourceIds.length > 0) {
|
|
81
94
|
return {
|
|
82
|
-
status: 'success'
|
|
95
|
+
status: 'success',
|
|
96
|
+
metadata: {
|
|
97
|
+
insertedResourceIds: insertedResourceIds
|
|
98
|
+
}
|
|
83
99
|
};
|
|
84
100
|
}
|
|
85
101
|
return undefined;
|
|
86
102
|
},
|
|
87
103
|
observeConfig: function observeConfig() {
|
|
88
|
-
var _refs$containerElemen;
|
|
89
|
-
var proseMirrorElement = (_refs$containerElemen = refs.containerElement) === null || _refs$containerElemen === void 0 ? void 0 : _refs$containerElemen.querySelector('.ProseMirror');
|
|
90
|
-
if (!proseMirrorElement || !(proseMirrorElement instanceof HTMLElement)) {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
104
|
return {
|
|
94
|
-
target:
|
|
105
|
+
target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
|
|
95
106
|
options: {
|
|
96
107
|
childList: true
|
|
97
108
|
}
|
|
@@ -99,15 +110,4 @@ var getCreateReferenceExperience = function getCreateReferenceExperience(_ref2)
|
|
|
99
110
|
}
|
|
100
111
|
})]
|
|
101
112
|
});
|
|
102
|
-
};
|
|
103
|
-
var isReferenceSyncBlockAddedInMutation = function isReferenceSyncBlockAddedInMutation(_ref4) {
|
|
104
|
-
var type = _ref4.type,
|
|
105
|
-
addedNodes = _ref4.addedNodes;
|
|
106
|
-
return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isReferenceSyncBlockNode);
|
|
107
|
-
};
|
|
108
|
-
var isReferenceSyncBlockNode = function isReferenceSyncBlockNode(node) {
|
|
109
|
-
if (!(node instanceof HTMLElement)) {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
return !!node.querySelector('[data-prosemirror-node-name="syncBlock"]');
|
|
113
113
|
};
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.getCreateSourceExperiencePlugin = void 0;
|
|
8
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
7
|
var _bindEventListener = require("bind-event-listener");
|
|
10
8
|
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
11
9
|
var _experiences = require("@atlaskit/editor-common/experiences");
|
|
12
10
|
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
13
11
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
12
|
+
var _types = require("../../types");
|
|
13
|
+
var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
|
|
14
14
|
var pluginKey = new _state.PluginKey('createSourceSyncBlockExperience');
|
|
15
|
-
var ABORT_REASON = {
|
|
16
|
-
EDITOR_DESTROYED: 'editor-destroyed'
|
|
17
|
-
};
|
|
18
15
|
var START_METHOD = {
|
|
19
16
|
BLOCK_MENU: 'block-menu',
|
|
20
17
|
PINNED_TOOLBAR: 'pinned-toolbar',
|
|
@@ -27,8 +24,8 @@ var syncedBlockCreateButtonIds = new Set(SYNCED_BLOCK_CREATE_BUTTON_IDS);
|
|
|
27
24
|
* This experience tracks when a source sync block is inserted.
|
|
28
25
|
*
|
|
29
26
|
* Start: When user inserts a sync block via block menu, quick insert or pinned toolbar
|
|
30
|
-
* Success: When the sync block is added to the DOM within
|
|
31
|
-
* Failure: When
|
|
27
|
+
* Success: When the sync block is added to the DOM within 3000ms of start
|
|
28
|
+
* Failure: When 3000ms passes without the source sync block being added to the DOM
|
|
32
29
|
*/
|
|
33
30
|
var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin = function getCreateSourceExperiencePlugin(_ref) {
|
|
34
31
|
var refs = _ref.refs,
|
|
@@ -44,8 +41,7 @@ var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin =
|
|
|
44
41
|
};
|
|
45
42
|
var experience = getCreateSourceExperience({
|
|
46
43
|
refs: refs,
|
|
47
|
-
dispatchAnalyticsEvent: dispatchAnalyticsEvent
|
|
48
|
-
syncBlockStore: syncBlockStore
|
|
44
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent
|
|
49
45
|
});
|
|
50
46
|
syncBlockStore.sourceManager.setCreateExperience(experience);
|
|
51
47
|
var unbindClickListener = (0, _bindEventListener.bind)(document, {
|
|
@@ -97,7 +93,7 @@ var getCreateSourceExperiencePlugin = exports.getCreateSourceExperiencePlugin =
|
|
|
97
93
|
return {
|
|
98
94
|
destroy: function destroy() {
|
|
99
95
|
experience.abort({
|
|
100
|
-
reason:
|
|
96
|
+
reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
|
|
101
97
|
});
|
|
102
98
|
unbindClickListener();
|
|
103
99
|
unbindKeydownListener();
|
|
@@ -113,25 +109,24 @@ var getCreateSourceExperience = function getCreateSourceExperience(_ref2) {
|
|
|
113
109
|
actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_CREATE,
|
|
114
110
|
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
115
111
|
checks: [new _experiences.ExperienceCheckTimeout({
|
|
116
|
-
durationMs:
|
|
112
|
+
durationMs: 3000
|
|
117
113
|
}), new _experiences.ExperienceCheckDomMutation({
|
|
118
114
|
onDomMutation: function onDomMutation(_ref3) {
|
|
119
115
|
var mutations = _ref3.mutations;
|
|
120
|
-
|
|
116
|
+
var createdResourceIds = (0, _experienceTrackingUtils.getAddedResourceIds)(mutations, '[data-prosemirror-node-name="bodiedSyncBlock"]');
|
|
117
|
+
if (createdResourceIds.length > 0) {
|
|
121
118
|
return {
|
|
122
|
-
status: 'success'
|
|
119
|
+
status: 'success',
|
|
120
|
+
metadata: {
|
|
121
|
+
createdResourceIds: createdResourceIds
|
|
122
|
+
}
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
return undefined;
|
|
126
126
|
},
|
|
127
127
|
observeConfig: function observeConfig() {
|
|
128
|
-
var _refs$containerElemen;
|
|
129
|
-
var proseMirrorElement = (_refs$containerElemen = refs.containerElement) === null || _refs$containerElemen === void 0 ? void 0 : _refs$containerElemen.querySelector('.ProseMirror');
|
|
130
|
-
if (!proseMirrorElement || !(proseMirrorElement instanceof HTMLElement)) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
128
|
return {
|
|
134
|
-
target:
|
|
129
|
+
target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
|
|
135
130
|
options: {
|
|
136
131
|
childList: true
|
|
137
132
|
}
|
|
@@ -171,15 +166,4 @@ var handleButtonClick = function handleButtonClick(testId, experience) {
|
|
|
171
166
|
};
|
|
172
167
|
var isEnterKey = function isEnterKey(key) {
|
|
173
168
|
return key === 'Enter';
|
|
174
|
-
};
|
|
175
|
-
var isSourceSyncBlockAddedInMutation = function isSourceSyncBlockAddedInMutation(_ref4) {
|
|
176
|
-
var type = _ref4.type,
|
|
177
|
-
addedNodes = _ref4.addedNodes;
|
|
178
|
-
return type === 'childList' && (0, _toConsumableArray2.default)(addedNodes).some(isSourceSyncBlockNode);
|
|
179
|
-
};
|
|
180
|
-
var isSourceSyncBlockNode = function isSourceSyncBlockNode(node) {
|
|
181
|
-
if (!(node instanceof HTMLElement)) {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
return !!node.querySelector('[data-prosemirror-node-name="bodiedSyncBlock"]');
|
|
185
169
|
};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getDeleteReferenceExperiencePlugin = exports.getDeleteReferenceExperience = void 0;
|
|
7
|
+
var _bindEventListener = require("bind-event-listener");
|
|
8
|
+
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
9
|
+
var _experiences = require("@atlaskit/editor-common/experiences");
|
|
10
|
+
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
11
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
12
|
+
var _types = require("../../types");
|
|
13
|
+
var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
|
|
14
|
+
var pluginKey = new _state.PluginKey('deleteReferenceSyncBlockExperience');
|
|
15
|
+
var START_METHOD = {
|
|
16
|
+
ELEMENT_TOOLBAR: 'element-toolbar',
|
|
17
|
+
DELETE: 'delete',
|
|
18
|
+
TYPED_OVER: 'typed-over',
|
|
19
|
+
CUT: 'cut',
|
|
20
|
+
UNDO: 'undo',
|
|
21
|
+
REDO: 'redo'
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* This experience tracks when a reference sync block is deleted.
|
|
26
|
+
*
|
|
27
|
+
* Start: When user deletes ref sync block from toolbar, presses delete when cursor is in front of ref sync block,
|
|
28
|
+
* presses any key with a ref sync block selected, cuts with a ref sync block selected, triggers undo/redo that deletes a ref sync block
|
|
29
|
+
* Success: When the sync block is removed from the DOM within 2000ms of start
|
|
30
|
+
* Failure: When 2000ms passes without the reference sync block being removed from the DOM
|
|
31
|
+
*/
|
|
32
|
+
var getDeleteReferenceExperiencePlugin = exports.getDeleteReferenceExperiencePlugin = function getDeleteReferenceExperiencePlugin(_ref) {
|
|
33
|
+
var refs = _ref.refs,
|
|
34
|
+
dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
|
|
35
|
+
syncBlockStore = _ref.syncBlockStore;
|
|
36
|
+
var experience = getDeleteReferenceExperience({
|
|
37
|
+
refs: refs,
|
|
38
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent
|
|
39
|
+
});
|
|
40
|
+
syncBlockStore.sourceManager.setDeleteExperience(experience);
|
|
41
|
+
var unbindClickListener = (0, _bindEventListener.bind)(document, {
|
|
42
|
+
type: 'click',
|
|
43
|
+
listener: function listener(event) {
|
|
44
|
+
var target = event.target;
|
|
45
|
+
if (!target) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
var button = target.closest('button[data-testid]');
|
|
49
|
+
if (!button || !(button instanceof HTMLButtonElement)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
var testId = button.dataset.testid;
|
|
53
|
+
if (isReferenceSyncedBlockDeleteButtonId(testId)) {
|
|
54
|
+
experience.start({
|
|
55
|
+
method: START_METHOD.ELEMENT_TOOLBAR
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return new _safePlugin.SafePlugin({
|
|
61
|
+
key: pluginKey,
|
|
62
|
+
props: {
|
|
63
|
+
handleDOMEvents: {
|
|
64
|
+
cut: function cut(view) {
|
|
65
|
+
var state = view.state;
|
|
66
|
+
if (hasSyncBlockInSelection(state.selection)) {
|
|
67
|
+
experience.start({
|
|
68
|
+
method: START_METHOD.CUT
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
},
|
|
73
|
+
keydown: function keydown(view, event) {
|
|
74
|
+
var state = view.state;
|
|
75
|
+
var hasSelection = hasSyncBlockInSelection(state.selection);
|
|
76
|
+
var hasAdjacent = hasSyncBlockBeforeCursor(state.selection);
|
|
77
|
+
if (hasSelection) {
|
|
78
|
+
experience.start({
|
|
79
|
+
method: START_METHOD.TYPED_OVER
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (isDeleteKey(event.key) && hasAdjacent) {
|
|
83
|
+
experience.start({
|
|
84
|
+
method: START_METHOD.DELETE
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
appendTransaction: function appendTransaction(transactions, oldState, newState) {
|
|
92
|
+
transactions.forEach(function (tr) {
|
|
93
|
+
var _wasSyncBlockDeletedO = (0, _experienceTrackingUtils.wasSyncBlockDeletedOrAddedByHistory)(tr, oldState, newState),
|
|
94
|
+
hasDeletedSyncBlock = _wasSyncBlockDeletedO.hasDeletedSyncBlock,
|
|
95
|
+
isUndo = _wasSyncBlockDeletedO.isUndo;
|
|
96
|
+
if (hasDeletedSyncBlock) {
|
|
97
|
+
experience.start({
|
|
98
|
+
method: isUndo ? START_METHOD.UNDO : START_METHOD.REDO
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return null;
|
|
103
|
+
},
|
|
104
|
+
view: function view() {
|
|
105
|
+
return {
|
|
106
|
+
destroy: function destroy() {
|
|
107
|
+
experience.abort({
|
|
108
|
+
reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
|
|
109
|
+
});
|
|
110
|
+
unbindClickListener();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
var getDeleteReferenceExperience = exports.getDeleteReferenceExperience = function getDeleteReferenceExperience(_ref2) {
|
|
117
|
+
var refs = _ref2.refs,
|
|
118
|
+
dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
|
|
119
|
+
return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
|
|
120
|
+
actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_DELETE,
|
|
121
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
122
|
+
checks: [new _experiences.ExperienceCheckTimeout({
|
|
123
|
+
durationMs: 2000
|
|
124
|
+
}), new _experiences.ExperienceCheckDomMutation({
|
|
125
|
+
onDomMutation: function onDomMutation(_ref3) {
|
|
126
|
+
var mutations = _ref3.mutations;
|
|
127
|
+
var deletedResourceIds = (0, _experienceTrackingUtils.getRemovedResourceIds)(mutations, '[data-prosemirror-node-name="syncBlock"]');
|
|
128
|
+
if (deletedResourceIds.length > 0) {
|
|
129
|
+
return {
|
|
130
|
+
status: 'success',
|
|
131
|
+
metadata: {
|
|
132
|
+
deletedResourceIds: deletedResourceIds
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
},
|
|
138
|
+
observeConfig: function observeConfig() {
|
|
139
|
+
return {
|
|
140
|
+
target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
|
|
141
|
+
options: {
|
|
142
|
+
childList: true
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
})]
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
var isReferenceSyncedBlockDeleteButtonId = function isReferenceSyncedBlockDeleteButtonId(testId) {
|
|
150
|
+
return testId === 'reference-synced-block-delete-button';
|
|
151
|
+
};
|
|
152
|
+
var isDeleteKey = function isDeleteKey(key) {
|
|
153
|
+
return key === 'Delete' || key === 'Backspace';
|
|
154
|
+
};
|
|
155
|
+
var hasSyncBlockInSelection = function hasSyncBlockInSelection(selection) {
|
|
156
|
+
var syncBlock = selection.$from.doc.type.schema.nodes.syncBlock;
|
|
157
|
+
var found = false;
|
|
158
|
+
selection.$from.doc.nodesBetween(selection.from, selection.to, function (node) {
|
|
159
|
+
if (node.type === syncBlock) {
|
|
160
|
+
found = true;
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// sync block nodes can only be found at the top level
|
|
164
|
+
return false;
|
|
165
|
+
});
|
|
166
|
+
return found;
|
|
167
|
+
};
|
|
168
|
+
var hasSyncBlockBeforeCursor = function hasSyncBlockBeforeCursor(selection) {
|
|
169
|
+
if (!selection.empty) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
var syncBlock = selection.$from.doc.type.schema.nodes.syncBlock;
|
|
173
|
+
var nodeBefore = selection.$from.nodeBefore;
|
|
174
|
+
return (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) === syncBlock;
|
|
175
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getDeleteSourceExperiencePlugin = exports.getDeleteSourceExperience = void 0;
|
|
7
|
+
var _bindEventListener = require("bind-event-listener");
|
|
8
|
+
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
9
|
+
var _experiences = require("@atlaskit/editor-common/experiences");
|
|
10
|
+
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
11
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
12
|
+
var _types = require("../../types");
|
|
13
|
+
var _experienceTrackingUtils = require("../utils/experience-tracking-utils");
|
|
14
|
+
var pluginKey = new _state.PluginKey('deleteSourceSyncBlockExperience');
|
|
15
|
+
var START_METHOD = {
|
|
16
|
+
DELETE_CONFIRM_BUTTON: 'delete-confirm-button'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* This experience tracks when a source sync block is deleted.
|
|
21
|
+
*
|
|
22
|
+
* Start: When user clicks the delete button in the delete modal
|
|
23
|
+
* Success: When the sync block is removed from the DOM within 2000ms of start
|
|
24
|
+
* Failure: When 2000ms passes without the source sync block being removed from the DOM
|
|
25
|
+
*/
|
|
26
|
+
var getDeleteSourceExperiencePlugin = exports.getDeleteSourceExperiencePlugin = function getDeleteSourceExperiencePlugin(_ref) {
|
|
27
|
+
var refs = _ref.refs,
|
|
28
|
+
dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
|
|
29
|
+
syncBlockStore = _ref.syncBlockStore;
|
|
30
|
+
var experience = getDeleteSourceExperience({
|
|
31
|
+
refs: refs,
|
|
32
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent
|
|
33
|
+
});
|
|
34
|
+
syncBlockStore.sourceManager.setDeleteExperience(experience);
|
|
35
|
+
var unbindClickListener = (0, _bindEventListener.bind)(document, {
|
|
36
|
+
type: 'click',
|
|
37
|
+
listener: function listener(event) {
|
|
38
|
+
var target = event.target;
|
|
39
|
+
if (!target) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
var button = target.closest('button[data-testid]');
|
|
43
|
+
if (!button || !(button instanceof HTMLButtonElement)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
var testId = button.dataset.testid;
|
|
47
|
+
if (isSyncedBlockDeleteButtonId(testId)) {
|
|
48
|
+
experience.start({
|
|
49
|
+
method: START_METHOD.DELETE_CONFIRM_BUTTON
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return new _safePlugin.SafePlugin({
|
|
55
|
+
key: pluginKey,
|
|
56
|
+
view: function view() {
|
|
57
|
+
return {
|
|
58
|
+
destroy: function destroy() {
|
|
59
|
+
experience.abort({
|
|
60
|
+
reason: _types.EXPERIENCE_ABORT_REASON.EDITOR_DESTROYED
|
|
61
|
+
});
|
|
62
|
+
unbindClickListener();
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
var getDeleteSourceExperience = exports.getDeleteSourceExperience = function getDeleteSourceExperience(_ref2) {
|
|
69
|
+
var refs = _ref2.refs,
|
|
70
|
+
dispatchAnalyticsEvent = _ref2.dispatchAnalyticsEvent;
|
|
71
|
+
return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
|
|
72
|
+
actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_DELETE,
|
|
73
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
74
|
+
checks: [new _experiences.ExperienceCheckTimeout({
|
|
75
|
+
durationMs: 2000
|
|
76
|
+
}), new _experiences.ExperienceCheckDomMutation({
|
|
77
|
+
onDomMutation: function onDomMutation(_ref3) {
|
|
78
|
+
var mutations = _ref3.mutations;
|
|
79
|
+
var deletedResourceIds = (0, _experienceTrackingUtils.getRemovedResourceIds)(mutations, '[data-prosemirror-node-name="bodiedSyncBlock"]');
|
|
80
|
+
if (deletedResourceIds.length > 0) {
|
|
81
|
+
return {
|
|
82
|
+
status: 'success',
|
|
83
|
+
metadata: {
|
|
84
|
+
deletedResourceIds: deletedResourceIds
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
},
|
|
90
|
+
observeConfig: function observeConfig() {
|
|
91
|
+
return {
|
|
92
|
+
target: (0, _experienceTrackingUtils.getTarget)(refs.containerElement),
|
|
93
|
+
options: {
|
|
94
|
+
childList: true
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
})]
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
var isSyncedBlockDeleteButtonId = function isSyncedBlockDeleteButtonId(testId) {
|
|
102
|
+
return testId === 'synced-block-delete-confirmation-modal-delete-button';
|
|
103
|
+
};
|
|
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getExperienceTrackingPlugins = void 0;
|
|
7
7
|
var _createReferenceExperience = require("./create-reference-experience");
|
|
8
8
|
var _createSourceExperience = require("./create-source-experience");
|
|
9
|
+
var _deleteReferenceExperience = require("./delete-reference-experience");
|
|
10
|
+
var _deleteSourceExperience = require("./delete-source-experience");
|
|
11
|
+
var _providerOnlyExperiences = require("./provider-only-experiences");
|
|
9
12
|
var getExperienceTrackingPlugins = exports.getExperienceTrackingPlugins = function getExperienceTrackingPlugins(_ref) {
|
|
10
13
|
var refs = _ref.refs,
|
|
11
14
|
dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent,
|
|
@@ -27,5 +30,32 @@ var getExperienceTrackingPlugins = exports.getExperienceTrackingPlugins = functi
|
|
|
27
30
|
syncBlockStore: syncBlockStore
|
|
28
31
|
});
|
|
29
32
|
}
|
|
33
|
+
}, {
|
|
34
|
+
name: 'deleteSourceExperiencePlugin',
|
|
35
|
+
plugin: function plugin() {
|
|
36
|
+
return (0, _deleteSourceExperience.getDeleteSourceExperiencePlugin)({
|
|
37
|
+
refs: refs,
|
|
38
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
39
|
+
syncBlockStore: syncBlockStore
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}, {
|
|
43
|
+
name: 'deleteReferenceExperiencePlugin',
|
|
44
|
+
plugin: function plugin() {
|
|
45
|
+
return (0, _deleteReferenceExperience.getDeleteReferenceExperiencePlugin)({
|
|
46
|
+
refs: refs,
|
|
47
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
48
|
+
syncBlockStore: syncBlockStore
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}, {
|
|
52
|
+
name: 'providerOnlySyncedBlockExperiencesPlugin',
|
|
53
|
+
plugin: function plugin() {
|
|
54
|
+
return (0, _providerOnlyExperiences.getProviderOnlyExperiencesPlugin)({
|
|
55
|
+
refs: refs,
|
|
56
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
57
|
+
syncBlockStore: syncBlockStore
|
|
58
|
+
});
|
|
59
|
+
}
|
|
30
60
|
}];
|
|
31
61
|
};
|