@atlaskit/editor-plugin-metrics 3.3.0 → 3.4.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 (92) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/metricsPlugin.js +20 -11
  3. package/dist/cjs/pm-plugins/main.js +22 -99
  4. package/dist/cjs/pm-plugins/utils/analytics.js +21 -27
  5. package/dist/cjs/pm-plugins/utils/check-tr-actions/check-tr-action-type.js +90 -0
  6. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-content-moved.js +26 -0
  7. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-deleting-content.js +20 -0
  8. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-empty-line-added-or-deleted.js +29 -0
  9. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-list-type-node-changed.js +37 -0
  10. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-mark-changed.js +16 -0
  11. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-node-attribute-changed.js +103 -0
  12. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-status-changed.js +22 -0
  13. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-table-column-resized.js +60 -0
  14. package/dist/cjs/pm-plugins/utils/check-tr-actions/tr-checks/check-text-input.js +23 -0
  15. package/dist/cjs/pm-plugins/utils/check-tr-actions/types.js +23 -0
  16. package/dist/cjs/pm-plugins/utils/get-new-plugin-state.js +103 -0
  17. package/dist/cjs/pm-plugins/utils/is-safe-insert.js +37 -0
  18. package/dist/cjs/pm-plugins/utils/should-skip-tr.js +52 -0
  19. package/dist/es2019/metricsPlugin.js +9 -1
  20. package/dist/es2019/pm-plugins/main.js +22 -109
  21. package/dist/es2019/pm-plugins/utils/analytics.js +10 -18
  22. package/dist/es2019/pm-plugins/utils/check-tr-actions/check-tr-action-type.js +81 -0
  23. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-content-moved.js +20 -0
  24. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-deleting-content.js +17 -0
  25. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-empty-line-added-or-deleted.js +26 -0
  26. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-list-type-node-changed.js +23 -0
  27. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-mark-changed.js +10 -0
  28. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-node-attribute-changed.js +71 -0
  29. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-status-changed.js +18 -0
  30. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-table-column-resized.js +53 -0
  31. package/dist/es2019/pm-plugins/utils/check-tr-actions/tr-checks/check-text-input.js +20 -0
  32. package/dist/es2019/pm-plugins/utils/check-tr-actions/types.js +17 -0
  33. package/dist/es2019/pm-plugins/utils/get-new-plugin-state.js +101 -0
  34. package/dist/es2019/pm-plugins/utils/is-safe-insert.js +28 -0
  35. package/dist/es2019/pm-plugins/utils/should-skip-tr.js +38 -0
  36. package/dist/esm/metricsPlugin.js +20 -11
  37. package/dist/esm/pm-plugins/main.js +21 -98
  38. package/dist/esm/pm-plugins/utils/analytics.js +20 -26
  39. package/dist/esm/pm-plugins/utils/check-tr-actions/check-tr-action-type.js +83 -0
  40. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-content-moved.js +20 -0
  41. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-deleting-content.js +14 -0
  42. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-empty-line-added-or-deleted.js +23 -0
  43. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-list-type-node-changed.js +31 -0
  44. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-mark-changed.js +10 -0
  45. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-node-attribute-changed.js +96 -0
  46. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-status-changed.js +16 -0
  47. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-table-column-resized.js +54 -0
  48. package/dist/esm/pm-plugins/utils/check-tr-actions/tr-checks/check-text-input.js +17 -0
  49. package/dist/esm/pm-plugins/utils/check-tr-actions/types.js +17 -0
  50. package/dist/esm/pm-plugins/utils/get-new-plugin-state.js +96 -0
  51. package/dist/esm/pm-plugins/utils/is-safe-insert.js +30 -0
  52. package/dist/esm/pm-plugins/utils/should-skip-tr.js +46 -0
  53. package/dist/types/metricsPluginType.d.ts +2 -2
  54. package/dist/types/pm-plugins/main.d.ts +4 -1
  55. package/dist/types/pm-plugins/utils/analytics.d.ts +1 -7
  56. package/dist/types/pm-plugins/utils/check-tr-actions/check-tr-action-type.d.ts +3 -0
  57. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-content-moved.d.ts +3 -0
  58. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-deleting-content.d.ts +3 -0
  59. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-empty-line-added-or-deleted.d.ts +3 -0
  60. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-list-type-node-changed.d.ts +3 -0
  61. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-mark-changed.d.ts +3 -0
  62. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-node-attribute-changed.d.ts +4 -0
  63. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-status-changed.d.ts +3 -0
  64. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-table-column-resized.d.ts +3 -0
  65. package/dist/types/pm-plugins/utils/check-tr-actions/tr-checks/check-text-input.d.ts +3 -0
  66. package/dist/types/pm-plugins/utils/check-tr-actions/types.d.ts +44 -0
  67. package/dist/types/pm-plugins/utils/get-new-plugin-state.d.ts +56 -0
  68. package/dist/types/pm-plugins/utils/is-safe-insert.d.ts +3 -0
  69. package/dist/types/pm-plugins/utils/should-skip-tr.d.ts +2 -0
  70. package/dist/types-ts4.5/metricsPluginType.d.ts +2 -3
  71. package/dist/types-ts4.5/pm-plugins/main.d.ts +4 -1
  72. package/dist/types-ts4.5/pm-plugins/utils/analytics.d.ts +1 -7
  73. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/check-tr-action-type.d.ts +3 -0
  74. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-content-moved.d.ts +3 -0
  75. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-deleting-content.d.ts +3 -0
  76. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-empty-line-added-or-deleted.d.ts +3 -0
  77. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-list-type-node-changed.d.ts +3 -0
  78. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-mark-changed.d.ts +3 -0
  79. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-node-attribute-changed.d.ts +4 -0
  80. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-status-changed.d.ts +3 -0
  81. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-table-column-resized.d.ts +3 -0
  82. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/tr-checks/check-text-input.d.ts +3 -0
  83. package/dist/types-ts4.5/pm-plugins/utils/check-tr-actions/types.d.ts +44 -0
  84. package/dist/types-ts4.5/pm-plugins/utils/get-new-plugin-state.d.ts +56 -0
  85. package/dist/types-ts4.5/pm-plugins/utils/is-safe-insert.d.ts +3 -0
  86. package/dist/types-ts4.5/pm-plugins/utils/should-skip-tr.d.ts +2 -0
  87. package/package.json +12 -6
  88. package/dist/cjs/pm-plugins/utils/check-tr-action-type.js +0 -312
  89. package/dist/es2019/pm-plugins/utils/check-tr-action-type.js +0 -271
  90. package/dist/esm/pm-plugins/utils/check-tr-action-type.js +0 -305
  91. package/dist/types/pm-plugins/utils/check-tr-action-type.d.ts +0 -38
  92. package/dist/types-ts4.5/pm-plugins/utils/check-tr-action-type.d.ts +0 -38
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/editor-plugin-metrics
2
2
 
3
+ ## 3.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#120928](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/120928)
8
+ [`01cb5ca9596cf`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/01cb5ca9596cf) -
9
+ [ED-26316] Refactor checkTrActionType functions to be in it's own file to help with readability,
10
+ add check for safe insert count and update it in analytics event fired
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
16
+ ## 3.3.1
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies
21
+
3
22
  ## 3.3.0
4
23
 
5
24
  ### Minor Changes
@@ -24,9 +24,17 @@ var metricsPlugin = exports.metricsPlugin = function metricsPlugin(_ref) {
24
24
  }];
25
25
  },
26
26
  commands: {
27
- startActiveSessionTimer: function startActiveSessionTimer() {
27
+ setContentMoved: function setContentMoved() {
28
28
  return function (_ref2) {
29
29
  var tr = _ref2.tr;
30
+ return tr.setMeta(_main.metricsKey, {
31
+ contentMoved: true
32
+ });
33
+ };
34
+ },
35
+ startActiveSessionTimer: function startActiveSessionTimer() {
36
+ return function (_ref3) {
37
+ var tr = _ref3.tr;
30
38
  var pluginState = api === null || api === void 0 ? void 0 : api.metrics.sharedState.currentState();
31
39
  if (!(pluginState !== null && pluginState !== void 0 && pluginState.intentToStartEditTime)) {
32
40
  return tr;
@@ -38,8 +46,8 @@ var metricsPlugin = exports.metricsPlugin = function metricsPlugin(_ref) {
38
46
  };
39
47
  },
40
48
  stopActiveSession: function stopActiveSession() {
41
- return function (_ref3) {
42
- var tr = _ref3.tr;
49
+ return function (_ref4) {
50
+ var tr = _ref4.tr;
43
51
  if (!api) {
44
52
  return tr;
45
53
  }
@@ -48,11 +56,12 @@ var metricsPlugin = exports.metricsPlugin = function metricsPlugin(_ref) {
48
56
  return tr;
49
57
  }
50
58
  if (pluginState && pluginState.totalActionCount > 0 && pluginState.activeSessionTime > 0) {
59
+ var _api$analytics;
51
60
  var payloadToSend = (0, _analytics.getAnalyticsPayload)({
52
61
  currentContent: tr.doc.content,
53
62
  pluginState: pluginState
54
63
  });
55
- api === null || api === void 0 || api.analytics.actions.attachAnalyticsEvent(payloadToSend)(tr);
64
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.attachAnalyticsEvent(payloadToSend)(tr);
56
65
  }
57
66
  tr.setMeta(_main.metricsKey, {
58
67
  stopActiveSession: true
@@ -60,13 +69,13 @@ var metricsPlugin = exports.metricsPlugin = function metricsPlugin(_ref) {
60
69
  return tr;
61
70
  };
62
71
  },
63
- handleIntentToStartEdit: function handleIntentToStartEdit(_ref4) {
64
- var newSelection = _ref4.newSelection,
65
- _ref4$shouldStartTime = _ref4.shouldStartTimer,
66
- shouldStartTimer = _ref4$shouldStartTime === void 0 ? true : _ref4$shouldStartTime,
67
- shouldPersistActiveSession = _ref4.shouldPersistActiveSession;
68
- return function (_ref5) {
69
- var tr = _ref5.tr;
72
+ handleIntentToStartEdit: function handleIntentToStartEdit(_ref5) {
73
+ var newSelection = _ref5.newSelection,
74
+ _ref5$shouldStartTime = _ref5.shouldStartTimer,
75
+ shouldStartTimer = _ref5$shouldStartTime === void 0 ? true : _ref5$shouldStartTime,
76
+ shouldPersistActiveSession = _ref5.shouldPersistActiveSession;
77
+ return function (_ref6) {
78
+ var tr = _ref6.tr;
70
79
  if (!api) {
71
80
  return tr;
72
81
  }
@@ -11,9 +11,9 @@ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
11
11
  var _state = require("@atlaskit/editor-prosemirror/state");
12
12
  var _activeSessionTimer = require("./utils/active-session-timer");
13
13
  var _analytics = require("./utils/analytics");
14
- var _checkTrActionType = require("./utils/check-tr-action-type");
15
- var _isNonTextUndo = require("./utils/is-non-text-undo");
14
+ var _getNewPluginState = require("./utils/get-new-plugin-state");
16
15
  var _isTrWithDocChanges = require("./utils/is-tr-with-doc-changes");
16
+ var _shouldSkipTr = require("./utils/should-skip-tr");
17
17
  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; }
18
18
  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; }
19
19
  var metricsKey = exports.metricsKey = new _state.PluginKey('metricsPlugin');
@@ -31,9 +31,12 @@ var initialPluginState = exports.initialPluginState = {
31
31
  nodeAttributeChangeCount: 0,
32
32
  contentMovedCount: 0,
33
33
  nodeDeletionCount: 0,
34
- undoCount: 0
34
+ undoCount: 0,
35
+ markChangeCount: 0,
36
+ contentDeletedCount: 0
35
37
  },
36
- repeatedActionCount: 0
38
+ repeatedActionCount: 0,
39
+ safeInsertCount: 0
37
40
  };
38
41
  var createPlugin = exports.createPlugin = function createPlugin(api) {
39
42
  var timer = new _activeSessionTimer.ActiveSessionTimer(api);
@@ -48,6 +51,7 @@ var createPlugin = exports.createPlugin = function createPlugin(api) {
48
51
  // eslint-disable-next-line @typescript-eslint/max-params
49
52
  apply: function apply(tr, pluginState, oldState, newState) {
50
53
  var _meta$shouldPersistAc;
54
+ // Return if transaction is remote or replaceDocument is set
51
55
  if (tr.getMeta('isRemote') || tr.getMeta('replaceDocument')) {
52
56
  return pluginState;
53
57
  }
@@ -63,127 +67,46 @@ var createPlugin = exports.createPlugin = function createPlugin(api) {
63
67
  var hasDocChanges = (0, _isTrWithDocChanges.isTrWithDocChanges)(tr);
64
68
  var intentToStartEditTime = (meta === null || meta === void 0 ? void 0 : meta.intentToStartEditTime) || pluginState.intentToStartEditTime;
65
69
  var now = performance.now();
70
+ // If there is no intentToStartEditTime and there are no doc changes, return the plugin state
66
71
  if (!intentToStartEditTime && !hasDocChanges && !tr.storedMarksSet) {
67
72
  return pluginState;
68
73
  }
74
+
75
+ // Set intentToStartEditTime if it is not set and there are doc changes or marks are set
69
76
  if (!intentToStartEditTime && (hasDocChanges || tr.storedMarksSet)) {
70
77
  intentToStartEditTime = now;
71
78
  }
72
79
 
73
- // Start active session timer if intentToStartEditTime is set and shouldStartTimer is true
74
- // shouldPersistActiveSession is set to true when dragging block controls and when insert menu is open
80
+ // Start active session timer if intentToStartEditTime is defined, shouldStartTimer is true and shouldPersistActiveSession is false
81
+ // shouldPersistActiveSession is true when dragging block controls and when insert menu is open as user is interacting with the editor without making doc changes
75
82
  // Timer should start when menu closes or dragging stops
76
83
  if (intentToStartEditTime && meta !== null && meta !== void 0 && meta.shouldStartTimer && !pluginState.shouldPersistActiveSession) {
77
84
  timer.startTimer();
78
85
  }
79
- var undoCount = (0, _isNonTextUndo.isNonTextUndo)(tr) ? 1 : 0;
80
- var newActionTypeCount = pluginState.actionTypeCount ? _objectSpread(_objectSpread({}, pluginState.actionTypeCount), {}, {
81
- undoCount: pluginState.actionTypeCount.undoCount + undoCount
82
- }) : _objectSpread(_objectSpread({}, initialPluginState.actionTypeCount), {}, {
83
- undoCount: undoCount
84
- });
85
86
  if (hasDocChanges) {
86
87
  timer.startTimer();
87
- var actionTypeCount = pluginState.actionTypeCount,
88
- timeOfLastTextInput = pluginState.timeOfLastTextInput,
89
- totalActionCount = pluginState.totalActionCount,
90
- previousTrType = pluginState.previousTrType;
91
- if ((0, _checkTrActionType.shouldSkipTr)(tr)) {
88
+ if ((0, _shouldSkipTr.shouldSkipTr)(tr)) {
92
89
  return pluginState;
93
90
  }
94
- var trType = (0, _checkTrActionType.checkTrActionType)(tr);
95
- var shouldNotIncrementActionCount = false;
96
- var shouldSetTimeOfLastTextInput = false;
97
- var isTextInput = false;
98
- if (trType) {
99
- var _trType$extraData, _previousTrType$extra;
100
- var isNotNewStatus = trType.type === _checkTrActionType.ActionType.UPDATING_STATUS && (previousTrType === null || previousTrType === void 0 ? void 0 : previousTrType.type) === _checkTrActionType.ActionType.UPDATING_STATUS && (trType === null || trType === void 0 || (_trType$extraData = trType.extraData) === null || _trType$extraData === void 0 ? void 0 : _trType$extraData.statusId) === (previousTrType === null || previousTrType === void 0 || (_previousTrType$extra = previousTrType.extraData) === null || _previousTrType$extra === void 0 ? void 0 : _previousTrType$extra.statusId);
101
- var isAddingTextToListNode = trType.type === _checkTrActionType.ActionType.TEXT_INPUT && !!previousTrType && [_checkTrActionType.ActionType.UPDATING_NEW_LIST_TYPE_ITEM, _checkTrActionType.ActionType.INSERTING_NEW_LIST_TYPE_NODE].includes(previousTrType.type);
102
- var isAddingNewListItemAfterTextInput = !!previousTrType && previousTrType.type === _checkTrActionType.ActionType.TEXT_INPUT && [_checkTrActionType.ActionType.UPDATING_NEW_LIST_TYPE_ITEM].includes(trType.type);
103
-
104
- // Check if tr is textInput and only increment textInputCount if previous action was not textInput
105
- isTextInput = [_checkTrActionType.ActionType.TEXT_INPUT, _checkTrActionType.ActionType.EMPTY_LINE_ADDED_OR_DELETED].includes(trType.type);
106
-
107
- // timeOfLastTextInput should be set if tr includes continuous text input on the same node
108
- shouldSetTimeOfLastTextInput = [_checkTrActionType.ActionType.TEXT_INPUT, _checkTrActionType.ActionType.EMPTY_LINE_ADDED_OR_DELETED, _checkTrActionType.ActionType.UPDATING_NEW_LIST_TYPE_ITEM, _checkTrActionType.ActionType.INSERTING_NEW_LIST_TYPE_NODE, _checkTrActionType.ActionType.UPDATING_STATUS].includes(trType.type) || isNotNewStatus;
109
-
110
- // Should not increase action count if tr is text input,
111
- // empty line added or deleted, updating new list item or is updating same status node
112
-
113
- shouldNotIncrementActionCount = isTextInput || isNotNewStatus || isAddingTextToListNode || isAddingNewListItemAfterTextInput;
114
- }
115
- var newTextInputCount = isTextInput ? actionTypeCount.textInputCount + 1 : actionTypeCount.textInputCount;
116
- var newTotalActionCount = totalActionCount + 1;
117
- if (timeOfLastTextInput && shouldNotIncrementActionCount) {
118
- newTotalActionCount = totalActionCount;
119
- }
120
- if (timeOfLastTextInput && isTextInput && previousTrType && [_checkTrActionType.ActionType.TEXT_INPUT, _checkTrActionType.ActionType.EMPTY_LINE_ADDED_OR_DELETED, _checkTrActionType.ActionType.UPDATING_NEW_LIST_TYPE_ITEM, _checkTrActionType.ActionType.INSERTING_NEW_LIST_TYPE_NODE].includes(previousTrType.type)) {
121
- newTextInputCount = actionTypeCount.textInputCount;
122
- }
123
- var newNodeAttrCount = actionTypeCount.nodeAttributeChangeCount;
124
- var newRepeatedActionCount = pluginState.repeatedActionCount;
125
- if ((trType === null || trType === void 0 ? void 0 : trType.type) === _checkTrActionType.ActionType.CHANGING_ATTRS) {
126
- newNodeAttrCount = newNodeAttrCount + 1;
127
- if ((previousTrType === null || previousTrType === void 0 ? void 0 : previousTrType.type) === _checkTrActionType.ActionType.CHANGING_ATTRS) {
128
- var _trType$extraData2 = trType.extraData,
129
- newAttr = _trType$extraData2.attr,
130
- newFrom = _trType$extraData2.from,
131
- newTo = _trType$extraData2.to;
132
- var _previousTrType$extra2 = previousTrType.extraData,
133
- prevAttr = _previousTrType$extra2.attr,
134
- prevFrom = _previousTrType$extra2.from,
135
- prevTo = _previousTrType$extra2.to;
136
- newRepeatedActionCount = newAttr === prevAttr && newFrom === prevFrom && newTo === prevTo ? newRepeatedActionCount + 1 : newRepeatedActionCount;
137
- }
138
- }
139
- var newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
140
- activeSessionTime: now - intentToStartEditTime,
141
- totalActionCount: newTotalActionCount,
142
- timeOfLastTextInput: shouldSetTimeOfLastTextInput ? now : undefined,
143
- contentSizeChanged: pluginState.contentSizeChanged + (newState.doc.content.size - oldState.doc.content.size),
144
- actionTypeCount: _objectSpread(_objectSpread({}, newActionTypeCount), {}, {
145
- textInputCount: newTextInputCount,
146
- nodeAttributeChangeCount: newNodeAttrCount
147
- }),
91
+ var newPluginState = (0, _getNewPluginState.getNewPluginState)({
92
+ now: now,
148
93
  intentToStartEditTime: intentToStartEditTime,
149
94
  shouldPersistActiveSession: shouldPersistActiveSession,
150
- previousTrType: trType,
151
- repeatedActionCount: newRepeatedActionCount
95
+ tr: tr,
96
+ pluginState: pluginState,
97
+ oldState: oldState,
98
+ newState: newState
152
99
  });
153
100
  return newPluginState;
154
101
  }
155
102
  return _objectSpread(_objectSpread({}, pluginState), {}, {
156
103
  lastSelection: (meta === null || meta === void 0 ? void 0 : meta.newSelection) || pluginState.lastSelection,
157
104
  intentToStartEditTime: intentToStartEditTime,
158
- actionTypeCount: newActionTypeCount,
159
105
  shouldPersistActiveSession: shouldPersistActiveSession
160
106
  });
161
107
  }
162
108
  },
163
109
  view: function view(_view) {
164
- var _api$blockControls;
165
- var handleIsDraggingChanged = api === null || api === void 0 || (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : _api$blockControls.sharedState.onChange(function (_ref) {
166
- var nextSharedState = _ref.nextSharedState,
167
- prevSharedState = _ref.prevSharedState;
168
- if (nextSharedState) {
169
- api === null || api === void 0 || api.core.actions.execute(function (_ref2) {
170
- var tr = _ref2.tr;
171
- if (!(prevSharedState !== null && prevSharedState !== void 0 && prevSharedState.isDragging) && nextSharedState.isDragging) {
172
- api === null || api === void 0 || api.metrics.commands.handleIntentToStartEdit({
173
- shouldStartTimer: false,
174
- shouldPersistActiveSession: true
175
- })({
176
- tr: tr
177
- });
178
- } else if (prevSharedState !== null && prevSharedState !== void 0 && prevSharedState.isDragging && !nextSharedState.isDragging) {
179
- api === null || api === void 0 || api.metrics.commands.startActiveSessionTimer()({
180
- tr: tr
181
- });
182
- }
183
- return tr;
184
- });
185
- }
186
- });
187
110
  var fireAnalyticsEvent = function fireAnalyticsEvent() {
188
111
  var pluginState = metricsKey.getState(_view.state);
189
112
  if (!pluginState) {
@@ -194,7 +117,8 @@ var createPlugin = exports.createPlugin = function createPlugin(api) {
194
117
  pluginState: pluginState
195
118
  });
196
119
  if (pluginState && pluginState.totalActionCount > 0 && pluginState.activeSessionTime > 0) {
197
- api === null || api === void 0 || api.analytics.actions.fireAnalyticsEvent(payloadToSend, undefined, {
120
+ var _api$analytics;
121
+ api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || _api$analytics.actions.fireAnalyticsEvent(payloadToSend, undefined, {
198
122
  immediate: true
199
123
  });
200
124
  }
@@ -210,7 +134,6 @@ var createPlugin = exports.createPlugin = function createPlugin(api) {
210
134
  fireAnalyticsEvent();
211
135
  timer.cleanupTimer();
212
136
  unbindBeforeUnload();
213
- handleIsDraggingChanged === null || handleIsDraggingChanged === void 0 || handleIsDraggingChanged();
214
137
  }
215
138
  };
216
139
  },
@@ -4,44 +4,37 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getPayloadAttributes = exports.getAnalyticsPayload = void 0;
7
+ exports.getAnalyticsPayload = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _analytics = require("@atlaskit/editor-common/analytics");
11
11
  var _getNodeChanges = require("./get-node-changes");
12
12
  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; }
13
13
  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; }
14
- var getPayloadAttributes = exports.getPayloadAttributes = function getPayloadAttributes(_ref) {
15
- var pluginState = _ref.pluginState,
16
- contentSizeChanged = _ref.contentSizeChanged;
17
- return {
18
- efficiency: {
19
- totalActiveTime: pluginState.activeSessionTime,
20
- totalActionCount: pluginState.totalActionCount,
21
- actionByTypeCount: pluginState.actionTypeCount
22
- },
23
- effectiveness: {
24
- undoCount: pluginState.actionTypeCount.undoCount,
25
- repeatedActionCount: pluginState.repeatedActionCount,
26
- safeInsertCount: 0
27
- },
28
- contentSizeChanged: contentSizeChanged
29
- };
30
- };
31
- var getAnalyticsPayload = exports.getAnalyticsPayload = function getAnalyticsPayload(_ref2) {
14
+ var getAnalyticsPayload = exports.getAnalyticsPayload = function getAnalyticsPayload(_ref) {
32
15
  var _pluginState$actionTy;
33
- var currentContent = _ref2.currentContent,
34
- pluginState = _ref2.pluginState;
16
+ var currentContent = _ref.currentContent,
17
+ pluginState = _ref.pluginState;
35
18
  var nodeChanges = (0, _getNodeChanges.getNodeChanges)({
36
19
  currentContent: currentContent,
37
20
  pluginState: pluginState
38
21
  });
22
+ var getActionCountByTypeSum = function getActionCountByTypeSum() {
23
+ var actionCountByTypeSum = 0;
24
+ Object.entries(pluginState.actionTypeCount).forEach(function (_ref2) {
25
+ var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
26
+ _actionType = _ref3[0],
27
+ count = _ref3[1];
28
+ actionCountByTypeSum += count;
29
+ });
30
+ return pluginState.totalActionCount - actionCountByTypeSum;
31
+ };
39
32
  var nodeInsertionCount = 0;
40
33
  var nodeDeletionCount = 0;
41
- Object.entries(nodeChanges).forEach(function (_ref3) {
42
- var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
43
- _ = _ref4[0],
44
- change = _ref4[1];
34
+ Object.entries(nodeChanges).forEach(function (_ref4) {
35
+ var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
36
+ _ = _ref5[0],
37
+ change = _ref5[1];
45
38
  if (change > 0) {
46
39
  nodeInsertionCount += change;
47
40
  } else if (change < 0) {
@@ -58,13 +51,14 @@ var getAnalyticsPayload = exports.getAnalyticsPayload = function getAnalyticsPay
58
51
  totalActionCount: pluginState.totalActionCount,
59
52
  actionByTypeCount: _objectSpread(_objectSpread({}, (_pluginState$actionTy = pluginState.actionTypeCount) !== null && _pluginState$actionTy !== void 0 ? _pluginState$actionTy : {}), {}, {
60
53
  nodeDeletionCount: nodeDeletionCount,
61
- nodeInsertionCount: nodeInsertionCount
54
+ nodeInsertionCount: nodeInsertionCount,
55
+ other: getActionCountByTypeSum()
62
56
  })
63
57
  },
64
58
  effectiveness: {
65
59
  undoCount: pluginState.actionTypeCount.undoCount,
66
60
  repeatedActionCount: pluginState.repeatedActionCount,
67
- safeInsertCount: 0
61
+ safeInsertCount: pluginState.safeInsertCount
68
62
  },
69
63
  contentSizeChanged: pluginState.contentSizeChanged
70
64
  },
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.checkTrActionType = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _transform = require("@atlaskit/editor-prosemirror/transform");
10
+ var _checkContentMoved = require("./tr-checks/check-content-moved");
11
+ var _checkDeletingContent = require("./tr-checks/check-deleting-content");
12
+ var _checkEmptyLineAddedOrDeleted = require("./tr-checks/check-empty-line-added-or-deleted");
13
+ var _checkListTypeNodeChanged = require("./tr-checks/check-list-type-node-changed");
14
+ var _checkMarkChanged = require("./tr-checks/check-mark-changed");
15
+ var _checkNodeAttributeChanged = require("./tr-checks/check-node-attribute-changed");
16
+ var _checkStatusChanged = require("./tr-checks/check-status-changed");
17
+ var _checkTableColumnResized = require("./tr-checks/check-table-column-resized");
18
+ var _checkTextInput = require("./tr-checks/check-text-input");
19
+ var checkTrActionType = exports.checkTrActionType = function checkTrActionType(tr) {
20
+ var stepsLength = tr.steps.length;
21
+ if (stepsLength <= 0) {
22
+ return undefined;
23
+ }
24
+ var contentPastedOrMoved = (0, _checkContentMoved.checkContentPastedOrMoved)(tr);
25
+ if (contentPastedOrMoved) {
26
+ return contentPastedOrMoved;
27
+ }
28
+
29
+ // Resized column data is either AttrStep or BatchAttrsStep, so we want to check it first
30
+ var resizedColumnData = (0, _checkTableColumnResized.checkTableColumnResized)(tr);
31
+ if (resizedColumnData) {
32
+ return resizedColumnData;
33
+ }
34
+
35
+ // Since we are looking at editor actions, we want to look at the first step only
36
+ var _tr$steps = (0, _slicedToArray2.default)(tr.steps, 1),
37
+ firstStep = _tr$steps[0];
38
+ var isReplaceStep = firstStep instanceof _transform.ReplaceStep;
39
+ var isReplaceAroundStep = firstStep instanceof _transform.ReplaceAroundStep;
40
+
41
+ // Check if mark is added or removed, this is for text formatting changes
42
+ var marksChanged = (0, _checkMarkChanged.checkMarkChanged)(firstStep);
43
+ if (marksChanged) {
44
+ return marksChanged;
45
+ }
46
+
47
+ // Return early if it's not a replace step or replace around step as following checks are for these steps only
48
+ if (!(isReplaceStep || isReplaceAroundStep)) {
49
+ return undefined;
50
+ }
51
+ if (isReplaceStep) {
52
+ // Check if tr is text input as we want to ignore continuous typing actions
53
+ var textInput = (0, _checkTextInput.checkTextInput)(firstStep);
54
+ if (textInput) {
55
+ return textInput;
56
+ }
57
+
58
+ // Check if tr is adding/ removing empty lines as we want to ignore continuous typing actions
59
+ var emptyLineAddedOrDeleted = (0, _checkEmptyLineAddedOrDeleted.checkEmptyLineAddedOrDeleted)(firstStep);
60
+ if (emptyLineAddedOrDeleted) {
61
+ return emptyLineAddedOrDeleted;
62
+ }
63
+
64
+ //Check if tr is removing content
65
+ var isDeletingContent = (0, _checkDeletingContent.checkDeletingContent)(firstStep);
66
+ if (isDeletingContent) {
67
+ return isDeletingContent;
68
+ }
69
+
70
+ // Status nodes save status content in attributes and a new transaction is fired each keypress
71
+ // Check if tr is updating status so we can handle actionCount correctly
72
+ var status = (0, _checkStatusChanged.checkStatusChanged)(firstStep);
73
+ if (status) {
74
+ return status;
75
+ }
76
+ }
77
+
78
+ // Check if tr is updating list type node because we want to ignore continuous typing actions and adding new list items
79
+ var updatingListTypeNode = (0, _checkListTypeNodeChanged.checkListTypeNodeChanged)(firstStep);
80
+ if (updatingListTypeNode) {
81
+ return updatingListTypeNode;
82
+ }
83
+
84
+ // Check if tr is updating node attributes so we can track nodeAttributeChangeCount
85
+ var nodeAttributeChange = (0, _checkNodeAttributeChanged.checkNodeAttributeChanged)(tr, firstStep);
86
+ if (nodeAttributeChange) {
87
+ return nodeAttributeChange;
88
+ }
89
+ return undefined;
90
+ };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkContentPastedOrMoved = void 0;
7
+ var _main = require("../../../main");
8
+ var _types = require("../types");
9
+ var UI_EVENT = 'uiEvent';
10
+ var PASTE_EVENT = 'paste';
11
+ var checkContentPastedOrMoved = exports.checkContentPastedOrMoved = function checkContentPastedOrMoved(tr) {
12
+ var _tr$getMeta;
13
+ var isContentMoved = (_tr$getMeta = tr.getMeta(_main.metricsKey)) === null || _tr$getMeta === void 0 ? void 0 : _tr$getMeta.contentMoved;
14
+ var isContentPasted = tr.getMeta(UI_EVENT) === PASTE_EVENT;
15
+ if (isContentMoved) {
16
+ return {
17
+ type: _types.ActionType.MOVING_CONTENT
18
+ };
19
+ }
20
+ if (isContentPasted) {
21
+ return {
22
+ type: _types.ActionType.PASTING_CONTENT
23
+ };
24
+ }
25
+ return undefined;
26
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkDeletingContent = void 0;
7
+ var _types = require("../types");
8
+ var checkDeletingContent = exports.checkDeletingContent = function checkDeletingContent(step) {
9
+ var _ref = step,
10
+ content = _ref.slice.content,
11
+ from = _ref.from,
12
+ to = _ref.to;
13
+ var isDeletingContent = to !== from && content.childCount === 0;
14
+ if (!isDeletingContent) {
15
+ return undefined;
16
+ }
17
+ return {
18
+ type: _types.ActionType.DELETING_CONTENT
19
+ };
20
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkEmptyLineAddedOrDeleted = void 0;
7
+ var _types = require("../types");
8
+ var checkEmptyLineAddedOrDeleted = exports.checkEmptyLineAddedOrDeleted = function checkEmptyLineAddedOrDeleted(step) {
9
+ var _ref = step,
10
+ content = _ref.slice.content,
11
+ from = _ref.from,
12
+ to = _ref.to;
13
+ var isEmptyLineDeleted = to - from === 2 && content.size === 0;
14
+ if (isEmptyLineDeleted) {
15
+ return {
16
+ type: _types.ActionType.EMPTY_LINE_ADDED_OR_DELETED
17
+ };
18
+ }
19
+ var isEmptyLineAdded = false;
20
+ content.forEach(function (node) {
21
+ isEmptyLineAdded = node.type.name === 'paragraph' && node.content.size === 0;
22
+ });
23
+ if (!isEmptyLineAdded) {
24
+ return undefined;
25
+ }
26
+ return {
27
+ type: _types.ActionType.EMPTY_LINE_ADDED_OR_DELETED
28
+ };
29
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkListTypeNodeChanged = void 0;
7
+ var _types = require("../types");
8
+ 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; } } }; }
9
+ 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; } }
10
+ 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; }
11
+ var checkListTypeNodeChanged = exports.checkListTypeNodeChanged = function checkListTypeNodeChanged(step) {
12
+ var content = step.slice.content;
13
+ var childCount = content.childCount;
14
+ if (childCount < 1) {
15
+ return undefined;
16
+ }
17
+ var _iterator = _createForOfIteratorHelper(content.content),
18
+ _step;
19
+ try {
20
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
21
+ var node = _step.value;
22
+ var isListTypeNode = ['decisionList', 'decisionItem', 'bulletList', 'listItem', 'orderedList', 'taskList', 'taskItem'].includes(node.type.name);
23
+ if (isListTypeNode) {
24
+ return childCount === 1 ? {
25
+ type: _types.ActionType.INSERTING_NEW_LIST_TYPE_NODE
26
+ } : {
27
+ type: _types.ActionType.UPDATING_NEW_LIST_TYPE_ITEM
28
+ };
29
+ }
30
+ }
31
+ } catch (err) {
32
+ _iterator.e(err);
33
+ } finally {
34
+ _iterator.f();
35
+ }
36
+ return undefined;
37
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkMarkChanged = void 0;
7
+ var _transform = require("@atlaskit/editor-prosemirror/transform");
8
+ var _types = require("../types");
9
+ var checkMarkChanged = exports.checkMarkChanged = function checkMarkChanged(step) {
10
+ if (!(step instanceof _transform.AddMarkStep || step instanceof _transform.RemoveMarkStep)) {
11
+ return undefined;
12
+ }
13
+ return {
14
+ type: _types.ActionType.CHANGING_MARK
15
+ };
16
+ };