@manuscripts/track-changes-plugin 1.7.3 → 1.7.4

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 (38) hide show
  1. package/dist/cjs/ChangeSet.js +6 -7
  2. package/dist/cjs/change-steps/diffChangeSteps.js +1 -1
  3. package/dist/cjs/change-steps/processChangeSteps.js +7 -6
  4. package/dist/cjs/changes/applyChanges.js +7 -3
  5. package/dist/cjs/changes/findChanges.js +1 -1
  6. package/dist/cjs/changes/fixInconsistentChanges.js +2 -2
  7. package/dist/cjs/changes/updateChangeAttrs.js +1 -1
  8. package/dist/cjs/compute/nodeHelpers.js +2 -6
  9. package/dist/cjs/compute/setFragmentAsInserted.js +1 -1
  10. package/dist/cjs/compute/splitSliceIntoMergedParts.js +1 -3
  11. package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +4 -10
  12. package/dist/cjs/mutate/deleteNode.js +8 -10
  13. package/dist/cjs/plugin.js +14 -7
  14. package/dist/cjs/steps/trackReplaceAroundStep.js +2 -2
  15. package/dist/cjs/steps/trackReplaceStep.js +4 -2
  16. package/dist/cjs/steps/trackTransaction.js +5 -5
  17. package/dist/es/ChangeSet.js +6 -7
  18. package/dist/es/change-steps/diffChangeSteps.js +1 -1
  19. package/dist/es/change-steps/processChangeSteps.js +7 -6
  20. package/dist/es/changes/applyChanges.js +7 -3
  21. package/dist/es/changes/findChanges.js +1 -1
  22. package/dist/es/changes/fixInconsistentChanges.js +2 -2
  23. package/dist/es/changes/updateChangeAttrs.js +2 -2
  24. package/dist/es/compute/nodeHelpers.js +2 -6
  25. package/dist/es/compute/setFragmentAsInserted.js +1 -1
  26. package/dist/es/compute/splitSliceIntoMergedParts.js +1 -3
  27. package/dist/es/mutate/deleteAndMergeSplitNodes.js +4 -10
  28. package/dist/es/mutate/deleteNode.js +8 -10
  29. package/dist/es/plugin.js +14 -7
  30. package/dist/es/steps/trackReplaceAroundStep.js +2 -2
  31. package/dist/es/steps/trackReplaceStep.js +4 -2
  32. package/dist/es/steps/trackTransaction.js +5 -5
  33. package/dist/types/ChangeSet.d.ts +1 -1
  34. package/dist/types/mutate/deleteAndMergeSplitNodes.d.ts +1 -1
  35. package/dist/types/steps/trackReplaceAroundStep.d.ts +1 -1
  36. package/dist/types/steps/trackReplaceStep.d.ts +1 -1
  37. package/dist/types/types/change.d.ts +1 -0
  38. package/package.json +27 -5
@@ -36,14 +36,15 @@ class ChangeSet {
36
36
  const rootNodes = [];
37
37
  let currentNodeChange;
38
38
  this.changes.forEach((c) => {
39
- if (currentNodeChange && c.from >= currentNodeChange.to) {
39
+ if (currentNodeChange &&
40
+ (c.from >= currentNodeChange.to ||
41
+ c.dataTracked.statusUpdateAt !== currentNodeChange.dataTracked.statusUpdateAt)) {
40
42
  rootNodes.push(currentNodeChange);
41
43
  currentNodeChange = undefined;
42
44
  }
43
45
  if (currentNodeChange &&
44
46
  c.from < currentNodeChange.to &&
45
- !(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) &&
46
- __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
47
+ !(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) && __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
47
48
  currentNodeChange.children.push(c);
48
49
  }
49
50
  else if (c.type === 'node-change') {
@@ -101,15 +102,13 @@ class ChangeSet {
101
102
  return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
102
103
  }
103
104
  getIn(ids) {
104
- return ids
105
- .map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id))
106
- .filter((c) => c !== undefined);
105
+ return ids.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id)).filter((c) => c !== undefined);
107
106
  }
108
107
  getNotIn(ids) {
109
108
  return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
110
109
  }
111
110
  static flattenTreeToIds(changes) {
112
- return changes.flatMap((c) => this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id);
111
+ return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
113
112
  }
114
113
  static shouldDeleteChange(change) {
115
114
  const { status, operation } = change.dataTracked;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.diffChangeSteps = void 0;
4
4
  const prosemirror_model_1 = require("prosemirror-model");
5
- const matchInserted_1 = require("./matchInserted");
6
5
  const logger_1 = require("../utils/logger");
6
+ const matchInserted_1 = require("./matchInserted");
7
7
  function cutFragment(matched, deleted, content) {
8
8
  const newContent = [];
9
9
  for (let i = 0; matched <= deleted && i < content.childCount; i += 1) {
@@ -36,12 +36,12 @@ var __rest = (this && this.__rest) || function (s, e) {
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  exports.processChangeSteps = void 0;
38
38
  const prosemirror_transform_1 = require("prosemirror-transform");
39
- const logger_1 = require("../utils/logger");
40
- const change_1 = require("../types/change");
39
+ const nodeHelpers_1 = require("../compute/nodeHelpers");
41
40
  const deleteNode_1 = require("../mutate/deleteNode");
42
41
  const deleteText_1 = require("../mutate/deleteText");
43
42
  const mergeTrackedMarks_1 = require("../mutate/mergeTrackedMarks");
44
- const nodeHelpers_1 = require("../compute/nodeHelpers");
43
+ const change_1 = require("../types/change");
44
+ const logger_1 = require("../utils/logger");
45
45
  const trackUtils = __importStar(require("../utils/track-utils"));
46
46
  function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
47
47
  const mapping = new prosemirror_transform_1.Mapping();
@@ -52,13 +52,14 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
52
52
  changes.forEach((c) => {
53
53
  let step = newTr.steps[newTr.steps.length - 1];
54
54
  switch (c.type) {
55
- case "delete-node":
55
+ case 'delete-node':
56
56
  deletesCounter++;
57
57
  const trackedData = (0, nodeHelpers_1.getBlockInlineTrackedData)(c.node);
58
58
  const inserted = trackedData === null || trackedData === void 0 ? void 0 : trackedData.find((d) => d.operation === change_1.CHANGE_OPERATION.insert);
59
59
  isInserted = !!inserted || (!trackedData && isInserted);
60
- if (isInserted && deletesCounter > 1)
60
+ if (isInserted && deletesCounter > 1) {
61
61
  return false;
62
+ }
62
63
  (0, deleteNode_1.deleteOrSetNodeDeleted)(c.node, mapping.map(c.pos), newTr, deleteAttrs);
63
64
  const newestStep = newTr.steps[newTr.steps.length - 1];
64
65
  if (step !== newestStep) {
@@ -67,7 +68,7 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
67
68
  }
68
69
  (0, mergeTrackedMarks_1.mergeTrackedMarks)(mapping.map(c.pos), newTr.doc, newTr, schema);
69
70
  break;
70
- case "delete-text":
71
+ case 'delete-text':
71
72
  const node = newTr.doc.nodeAt(mapping.map(c.pos));
72
73
  if (!node) {
73
74
  logger_1.log.error(`processChangeSteps: no text node found for text-change`, c);
@@ -14,15 +14,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.applyAcceptedRejectedChanges = void 0;
15
15
  const prosemirror_transform_1 = require("prosemirror-transform");
16
16
  const ChangeSet_1 = require("../ChangeSet");
17
- const change_1 = require("../types/change");
18
- const logger_1 = require("../utils/logger");
19
17
  const deleteNode_1 = require("../mutate/deleteNode");
20
18
  const mergeNode_1 = require("../mutate/mergeNode");
19
+ const change_1 = require("../types/change");
20
+ const logger_1 = require("../utils/logger");
21
21
  const updateChangeAttrs_1 = require("./updateChangeAttrs");
22
22
  function getUpdatedDataTracked(dataTracked, changeId) {
23
23
  if (!dataTracked) {
24
24
  return null;
25
25
  }
26
+ console.log(dataTracked);
26
27
  const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
27
28
  return newDataTracked.length ? newDataTracked : null;
28
29
  }
@@ -42,7 +43,9 @@ function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prose
42
43
  if (ChangeSet_1.ChangeSet.isNodeAttrChange(change)) {
43
44
  const _a = change.newAttrs, { dataTracked } = _a, attrs = __rest(_a, ["dataTracked"]);
44
45
  const changeLog = attrsChangesLog.get(node.attrs.id);
45
- const newDataTracked = changeLog && changeLog.length ? dataTracked.filter((c) => !changeLog.includes(c.id)) : dataTracked;
46
+ const newDataTracked = changeLog && changeLog.length
47
+ ? dataTracked.filter((c) => !changeLog.includes(c.id))
48
+ : dataTracked;
46
49
  tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: newDataTracked.length ? newDataTracked : null }), node.marks);
47
50
  }
48
51
  return;
@@ -72,6 +75,7 @@ function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prose
72
75
  addAttrLog(node.attrs.id, change.dataTracked.id);
73
76
  }
74
77
  else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
78
+ console.log('GETTING IN ---- CHANGE_STATUS.rejected');
75
79
  tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
76
80
  addAttrLog(node.attrs.id, change.dataTracked.id);
77
81
  }
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findChanges = void 0;
4
4
  const ChangeSet_1 = require("../ChangeSet");
5
- const change_1 = require("../types/change");
6
5
  const nodeHelpers_1 = require("../compute/nodeHelpers");
6
+ const change_1 = require("../types/change");
7
7
  function findChanges(state) {
8
8
  const changes = [];
9
9
  let current;
@@ -8,8 +8,8 @@ function fixInconsistentChanges(changeSet, currentUserID, newTr, schema) {
8
8
  const iteratedIds = new Set();
9
9
  let changed = false;
10
10
  changeSet.invalidChanges.forEach((c) => {
11
- const { id, authorID, operation, reviewedByID, status, createdAt, updatedAt } = c.dataTracked;
12
- const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: (0, uuidv4_1.uuidv4)() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: change_1.CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() }));
11
+ const { id, authorID, operation, reviewedByID, status, createdAt, statusUpdateAt, updatedAt } = c.dataTracked;
12
+ const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: (0, uuidv4_1.uuidv4)() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: change_1.CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() })), (!statusUpdateAt && { statusUpdateAt: 0 }));
13
13
  if (Object.keys(newAttrs).length > 0) {
14
14
  (0, updateChangeAttrs_1.updateChangeAttrs)(newTr, c, Object.assign(Object.assign({}, c.dataTracked), newAttrs), schema);
15
15
  changed = true;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateChangeChildrenAttributes = exports.updateChangeAttrs = void 0;
4
- const logger_1 = require("../utils/logger");
5
4
  const ChangeSet_1 = require("../ChangeSet");
6
5
  const nodeHelpers_1 = require("../compute/nodeHelpers");
6
+ const logger_1 = require("../utils/logger");
7
7
  function updateChangeAttrs(tr, change, trackedAttrs, schema) {
8
8
  const node = tr.doc.nodeAt(change.from);
9
9
  if (!node) {
@@ -18,9 +18,7 @@ function getTextNodeTrackedMarkData(node, schema) {
18
18
  const marksTrackedData = [];
19
19
  node.marks.forEach((mark) => {
20
20
  if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
21
- const operation = mark.type === schema.marks.tracked_insert
22
- ? change_1.CHANGE_OPERATION.insert
23
- : change_1.CHANGE_OPERATION.delete;
21
+ const operation = mark.type === schema.marks.tracked_insert ? change_1.CHANGE_OPERATION.insert : change_1.CHANGE_OPERATION.delete;
24
22
  marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
25
23
  }
26
24
  });
@@ -65,9 +63,7 @@ function shouldMergeTrackedAttributes(left, right) {
65
63
  });
66
64
  return false;
67
65
  }
68
- return (left.status === right.status &&
69
- left.operation === right.operation &&
70
- left.authorID === right.authorID);
66
+ return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
71
67
  }
72
68
  exports.shouldMergeTrackedAttributes = shouldMergeTrackedAttributes;
73
69
  function getMergeableMarkTrackedAttrs(node, attrs, schema) {
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setFragmentAsInserted = void 0;
4
4
  const prosemirror_model_1 = require("prosemirror-model");
5
- const logger_1 = require("../utils/logger");
6
5
  const change_1 = require("../types/change");
6
+ const logger_1 = require("../utils/logger");
7
7
  const nodeHelpers_1 = require("./nodeHelpers");
8
8
  function markInlineNodeChange(node, newTrackAttrs, schema) {
9
9
  const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
@@ -32,9 +32,7 @@ function splitSliceIntoMergedParts(insertSlice, mergeEqualSides = false) {
32
32
  const { openStart, openEnd, content: { firstChild, lastChild, content: nodes }, } = insertSlice;
33
33
  let updatedSliceNodes = nodes;
34
34
  const mergeSides = openStart !== openEnd || mergeEqualSides;
35
- const firstMergedNode = openStart > 0 && mergeSides && firstChild
36
- ? getMergedNode(firstChild, 1, openStart, true)
37
- : undefined;
35
+ const firstMergedNode = openStart > 0 && mergeSides && firstChild ? getMergedNode(firstChild, 1, openStart, true) : undefined;
38
36
  const lastMergedNode = openEnd > 0 && mergeSides && lastChild ? getMergedNode(lastChild, 1, openEnd, false) : undefined;
39
37
  if (firstMergedNode) {
40
38
  updatedSliceNodes = updatedSliceNodes.slice(1);
@@ -25,8 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.deleteAndMergeSplitNodes = void 0;
27
27
  const prosemirror_model_1 = require("prosemirror-model");
28
- const splitSliceIntoMergedParts_1 = require("../compute/splitSliceIntoMergedParts");
29
28
  const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
29
+ const splitSliceIntoMergedParts_1 = require("../compute/splitSliceIntoMergedParts");
30
30
  const trackUtils = __importStar(require("../utils/track-utils"));
31
31
  function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackAttrs, insertSlice) {
32
32
  const steps = [];
@@ -42,16 +42,12 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
42
42
  let mergingStartSide = true;
43
43
  startDoc.nodesBetween(from, to, (node, pos) => {
44
44
  const nodeEnd = pos + node.nodeSize;
45
- const wasWithinGap = gap &&
46
- ((!node.isText && pos >= gap.start) ||
47
- (node.isText && pos >= gap.start && nodeEnd <= gap.end));
45
+ const wasWithinGap = gap && ((!node.isText && pos >= gap.start) || (node.isText && pos >= gap.start && nodeEnd <= gap.end));
48
46
  if (nodeEnd > from && !wasWithinGap) {
49
47
  const nodeCompletelyDeleted = pos >= from && nodeEnd <= to;
50
48
  const endTokenDeleted = nodeEnd <= to;
51
49
  const startTokenDeleted = pos >= from;
52
- if (node.isText ||
53
- (!endTokenDeleted && startTokenDeleted) ||
54
- (endTokenDeleted && !startTokenDeleted)) {
50
+ if (node.isText || (!endTokenDeleted && startTokenDeleted) || (endTokenDeleted && !startTokenDeleted)) {
55
51
  if (!endTokenDeleted && startTokenDeleted) {
56
52
  mergingStartSide = false;
57
53
  }
@@ -96,9 +92,7 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
96
92
  });
97
93
  return {
98
94
  sliceWasSplit: !!(firstMergedNode || lastMergedNode),
99
- newSliceContent: updatedSliceNodes
100
- ? prosemirror_model_1.Fragment.fromArray(updatedSliceNodes)
101
- : insertSlice.content,
95
+ newSliceContent: updatedSliceNodes ? prosemirror_model_1.Fragment.fromArray(updatedSliceNodes) : insertSlice.content,
102
96
  steps,
103
97
  };
104
98
  }
@@ -2,18 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteOrSetNodeDeleted = exports.deleteNode = void 0;
4
4
  const prosemirror_model_1 = require("prosemirror-model");
5
- const prosemirror_transform_1 = require("prosemirror-transform");
6
- const logger_1 = require("../utils/logger");
7
- const change_1 = require("../types/change");
8
5
  const nodeHelpers_1 = require("../compute/nodeHelpers");
6
+ const change_1 = require("../types/change");
7
+ const logger_1 = require("../utils/logger");
9
8
  function deleteNode(node, pos, tr) {
10
9
  var _a;
11
10
  const startPos = tr.doc.resolve(pos + 1);
12
- const range = startPos.blockRange(tr.doc.resolve(startPos.pos - 2 + node.nodeSize));
13
- const targetDepth = range && (0, prosemirror_transform_1.liftTarget)(range);
14
- if (range && typeof targetDepth === 'number') {
15
- return tr.lift(range, targetDepth);
16
- }
17
11
  const resPos = tr.doc.resolve(pos);
18
12
  const canMergeToNodeAbove = resPos.parent !== tr.doc && resPos.nodeBefore && node.isBlock && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
19
13
  if (canMergeToNodeAbove) {
@@ -26,14 +20,18 @@ function deleteNode(node, pos, tr) {
26
20
  exports.deleteNode = deleteNode;
27
21
  function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
28
22
  const dataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(node);
29
- const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert);
23
+ const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert && d.status === change_1.CHANGE_STATUS.pending);
30
24
  const deleted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.delete);
31
25
  const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.set_node_attributes);
32
26
  if (inserted && inserted.authorID === deleteAttrs.authorID) {
33
27
  return deleteNode(node, pos, newTr);
34
28
  }
35
29
  if (!newTr.doc.nodeAt(pos)) {
36
- logger_1.log.error(`deleteOrSetNodeDeleted: no node found for deletion`, { pos, node, newTr });
30
+ logger_1.log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
31
+ pos,
32
+ node,
33
+ newTr,
34
+ });
37
35
  return;
38
36
  }
39
37
  const newDeleted = deleted
@@ -14,14 +14,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.trackChangesPlugin = exports.trackChangesPluginKey = void 0;
15
15
  const prosemirror_state_1 = require("prosemirror-state");
16
16
  const actions_1 = require("./actions");
17
- const ChangeSet_1 = require("./ChangeSet");
18
- const logger_1 = require("./utils/logger");
19
17
  const applyChanges_1 = require("./changes/applyChanges");
20
18
  const findChanges_1 = require("./changes/findChanges");
21
19
  const fixInconsistentChanges_1 = require("./changes/fixInconsistentChanges");
22
- const trackTransaction_1 = require("./steps/trackTransaction");
23
20
  const updateChangeAttrs_1 = require("./changes/updateChangeAttrs");
21
+ const ChangeSet_1 = require("./ChangeSet");
22
+ const trackTransaction_1 = require("./steps/trackTransaction");
24
23
  const track_1 = require("./types/track");
24
+ const logger_1 = require("./utils/logger");
25
25
  exports.trackChangesPluginKey = new prosemirror_state_1.PluginKey('track-changes');
26
26
  const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
27
27
  const { userID, debug, skipTrsWithMetas = [] } = opts;
@@ -82,18 +82,24 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
82
82
  trs.forEach((tr) => {
83
83
  const wasAppended = tr.getMeta('appendedTransaction');
84
84
  const skipMetaUsed = skipTrsWithMetas.some((m) => tr.getMeta(m) || (wasAppended === null || wasAppended === void 0 ? void 0 : wasAppended.getMeta(m)));
85
- const skipTrackUsed = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.skipTrack) || (wasAppended && (0, actions_1.getAction)(wasAppended, actions_1.TrackChangesAction.skipTrack));
86
- if (tr.docChanged && !skipMetaUsed && !skipTrackUsed && !tr.getMeta('history$') && !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
85
+ const skipTrackUsed = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.skipTrack) ||
86
+ (wasAppended && (0, actions_1.getAction)(wasAppended, actions_1.TrackChangesAction.skipTrack));
87
+ if (tr.docChanged &&
88
+ !skipMetaUsed &&
89
+ !skipTrackUsed &&
90
+ !tr.getMeta('history$') &&
91
+ !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
87
92
  createdTr = (0, trackTransaction_1.trackTransaction)(tr, oldState, createdTr, userID);
88
93
  }
89
94
  docChanged = docChanged || tr.docChanged;
90
95
  const setChangeStatuses = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.setChangeStatuses);
91
96
  if (setChangeStatuses) {
92
97
  const { status, ids } = setChangeStatuses;
98
+ const changeTime = new Date().getTime();
93
99
  ids.forEach((changeId) => {
94
100
  const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
95
101
  if (change) {
96
- createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, reviewedByID: userID }), oldState.schema);
102
+ createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
97
103
  }
98
104
  });
99
105
  }
@@ -103,7 +109,8 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
103
109
  (0, actions_1.setAction)(createdTr, actions_1.TrackChangesAction.refreshChanges, true);
104
110
  }
105
111
  });
106
- const changed = pluginState.changeSet.hasInconsistentData && (0, fixInconsistentChanges_1.fixInconsistentChanges)(pluginState.changeSet, userID, createdTr, oldState.schema);
112
+ const changed = pluginState.changeSet.hasInconsistentData &&
113
+ (0, fixInconsistentChanges_1.fixInconsistentChanges)(pluginState.changeSet, userID, createdTr, oldState.schema);
107
114
  if (changed) {
108
115
  logger_1.log.warn('had to fix inconsistent changes in', createdTr);
109
116
  }
@@ -25,11 +25,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.trackReplaceAroundStep = void 0;
27
27
  const prosemirror_model_1 = require("prosemirror-model");
28
- const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
28
+ const actions_1 = require("../actions");
29
29
  const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
30
+ const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
30
31
  const logger_1 = require("../utils/logger");
31
32
  const trackUtils = __importStar(require("../utils/track-utils"));
32
- const actions_1 = require("../actions");
33
33
  function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
34
34
  logger_1.log.info('###### ReplaceAroundStep ######');
35
35
  const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
@@ -25,8 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.trackReplaceStep = void 0;
27
27
  const prosemirror_model_1 = require("prosemirror-model");
28
- const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
29
28
  const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
29
+ const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
30
30
  const logger_1 = require("../utils/logger");
31
31
  const trackUtils = __importStar(require("../utils/track-utils"));
32
32
  function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc) {
@@ -71,7 +71,9 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
71
71
  });
72
72
  }
73
73
  else {
74
- selectionPos = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete' || ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward' ? toA : fromA;
74
+ const isDeleteEvent = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete';
75
+ const isDeleteContentForward = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward';
76
+ selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
75
77
  }
76
78
  });
77
79
  return [changeSteps, selectionPos];
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trackTransaction = void 0;
4
4
  const prosemirror_state_1 = require("prosemirror-state");
5
5
  const prosemirror_transform_1 = require("prosemirror-transform");
6
- const logger_1 = require("../utils/logger");
6
+ const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
7
+ const processChangeSteps_1 = require("../change-steps/processChangeSteps");
7
8
  const change_1 = require("../types/change");
9
+ const logger_1 = require("../utils/logger");
8
10
  const trackReplaceAroundStep_1 = require("./trackReplaceAroundStep");
9
11
  const trackReplaceStep_1 = require("./trackReplaceStep");
10
- const processChangeSteps_1 = require("../change-steps/processChangeSteps");
11
- const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
12
12
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
13
13
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
14
14
  function trackTransaction(tr, oldState, newTr, authorID) {
@@ -18,6 +18,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
18
18
  reviewedByID: null,
19
19
  createdAt: tr.time,
20
20
  updatedAt: tr.time,
21
+ statusUpdateAt: 0,
21
22
  status: change_1.CHANGE_STATUS.pending,
22
23
  };
23
24
  const wasNodeSelection = tr.selection instanceof prosemirror_state_1.NodeSelection;
@@ -39,8 +40,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
39
40
  }
40
41
  else if (step instanceof prosemirror_transform_1.ReplaceStep) {
41
42
  const { slice } = step;
42
- if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 &&
43
- isHighlightMarkerNode(slice.content.content[0])) {
43
+ if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
44
44
  continue;
45
45
  }
46
46
  const newStep = step.invert(tr.docs[i]);
@@ -33,14 +33,15 @@ export class ChangeSet {
33
33
  const rootNodes = [];
34
34
  let currentNodeChange;
35
35
  this.changes.forEach((c) => {
36
- if (currentNodeChange && c.from >= currentNodeChange.to) {
36
+ if (currentNodeChange &&
37
+ (c.from >= currentNodeChange.to ||
38
+ c.dataTracked.statusUpdateAt !== currentNodeChange.dataTracked.statusUpdateAt)) {
37
39
  rootNodes.push(currentNodeChange);
38
40
  currentNodeChange = undefined;
39
41
  }
40
42
  if (currentNodeChange &&
41
43
  c.from < currentNodeChange.to &&
42
- !(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) &&
43
- __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
44
+ !(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) && __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
44
45
  currentNodeChange.children.push(c);
45
46
  }
46
47
  else if (c.type === 'node-change') {
@@ -98,15 +99,13 @@ export class ChangeSet {
98
99
  return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
99
100
  }
100
101
  getIn(ids) {
101
- return ids
102
- .map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id))
103
- .filter((c) => c !== undefined);
102
+ return ids.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id)).filter((c) => c !== undefined);
104
103
  }
105
104
  getNotIn(ids) {
106
105
  return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
107
106
  }
108
107
  static flattenTreeToIds(changes) {
109
- return changes.flatMap((c) => this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id);
108
+ return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
110
109
  }
111
110
  static shouldDeleteChange(change) {
112
111
  const { status, operation } = change.dataTracked;
@@ -1,6 +1,6 @@
1
1
  import { Fragment, Slice } from 'prosemirror-model';
2
- import { matchInserted } from './matchInserted';
3
2
  import { log } from '../utils/logger';
3
+ import { matchInserted } from './matchInserted';
4
4
  function cutFragment(matched, deleted, content) {
5
5
  const newContent = [];
6
6
  for (let i = 0; matched <= deleted && i < content.childCount; i += 1) {
@@ -10,12 +10,12 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import { Mapping, ReplaceStep } from 'prosemirror-transform';
13
- import { log } from '../utils/logger';
14
- import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
13
+ import { addTrackIdIfDoesntExist, getBlockInlineTrackedData } from '../compute/nodeHelpers';
15
14
  import { deleteOrSetNodeDeleted } from '../mutate/deleteNode';
16
15
  import { deleteTextIfInserted } from '../mutate/deleteText';
17
16
  import { mergeTrackedMarks } from '../mutate/mergeTrackedMarks';
18
- import { addTrackIdIfDoesntExist, getBlockInlineTrackedData } from '../compute/nodeHelpers';
17
+ import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
18
+ import { log } from '../utils/logger';
19
19
  import * as trackUtils from '../utils/track-utils';
20
20
  export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
21
21
  const mapping = new Mapping();
@@ -26,13 +26,14 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
26
26
  changes.forEach((c) => {
27
27
  let step = newTr.steps[newTr.steps.length - 1];
28
28
  switch (c.type) {
29
- case "delete-node":
29
+ case 'delete-node':
30
30
  deletesCounter++;
31
31
  const trackedData = getBlockInlineTrackedData(c.node);
32
32
  const inserted = trackedData === null || trackedData === void 0 ? void 0 : trackedData.find((d) => d.operation === CHANGE_OPERATION.insert);
33
33
  isInserted = !!inserted || (!trackedData && isInserted);
34
- if (isInserted && deletesCounter > 1)
34
+ if (isInserted && deletesCounter > 1) {
35
35
  return false;
36
+ }
36
37
  deleteOrSetNodeDeleted(c.node, mapping.map(c.pos), newTr, deleteAttrs);
37
38
  const newestStep = newTr.steps[newTr.steps.length - 1];
38
39
  if (step !== newestStep) {
@@ -41,7 +42,7 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
41
42
  }
42
43
  mergeTrackedMarks(mapping.map(c.pos), newTr.doc, newTr, schema);
43
44
  break;
44
- case "delete-text":
45
+ case 'delete-text':
45
46
  const node = newTr.doc.nodeAt(mapping.map(c.pos));
46
47
  if (!node) {
47
48
  log.error(`processChangeSteps: no text node found for text-change`, c);
@@ -11,15 +11,16 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  };
12
12
  import { Mapping } from 'prosemirror-transform';
13
13
  import { ChangeSet } from '../ChangeSet';
14
- import { CHANGE_STATUS } from '../types/change';
15
- import { log } from '../utils/logger';
16
14
  import { deleteNode } from '../mutate/deleteNode';
17
15
  import { mergeNode } from '../mutate/mergeNode';
16
+ import { CHANGE_STATUS } from '../types/change';
17
+ import { log } from '../utils/logger';
18
18
  import { updateChangeChildrenAttributes } from './updateChangeAttrs';
19
19
  function getUpdatedDataTracked(dataTracked, changeId) {
20
20
  if (!dataTracked) {
21
21
  return null;
22
22
  }
23
+ console.log(dataTracked);
23
24
  const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
24
25
  return newDataTracked.length ? newDataTracked : null;
25
26
  }
@@ -39,7 +40,9 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = ne
39
40
  if (ChangeSet.isNodeAttrChange(change)) {
40
41
  const _a = change.newAttrs, { dataTracked } = _a, attrs = __rest(_a, ["dataTracked"]);
41
42
  const changeLog = attrsChangesLog.get(node.attrs.id);
42
- const newDataTracked = changeLog && changeLog.length ? dataTracked.filter((c) => !changeLog.includes(c.id)) : dataTracked;
43
+ const newDataTracked = changeLog && changeLog.length
44
+ ? dataTracked.filter((c) => !changeLog.includes(c.id))
45
+ : dataTracked;
43
46
  tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: newDataTracked.length ? newDataTracked : null }), node.marks);
44
47
  }
45
48
  return;
@@ -69,6 +72,7 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = ne
69
72
  addAttrLog(node.attrs.id, change.dataTracked.id);
70
73
  }
71
74
  else if (ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === CHANGE_STATUS.rejected) {
75
+ console.log('GETTING IN ---- CHANGE_STATUS.rejected');
72
76
  tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
73
77
  addAttrLog(node.attrs.id, change.dataTracked.id);
74
78
  }
@@ -1,6 +1,6 @@
1
1
  import { ChangeSet } from '../ChangeSet';
2
+ import { equalMarks, getNodeTrackedData } from '../compute/nodeHelpers';
2
3
  import { CHANGE_OPERATION, } from '../types/change';
3
- import { getNodeTrackedData, equalMarks } from '../compute/nodeHelpers';
4
4
  export function findChanges(state) {
5
5
  const changes = [];
6
6
  let current;
@@ -5,8 +5,8 @@ export function fixInconsistentChanges(changeSet, currentUserID, newTr, schema)
5
5
  const iteratedIds = new Set();
6
6
  let changed = false;
7
7
  changeSet.invalidChanges.forEach((c) => {
8
- const { id, authorID, operation, reviewedByID, status, createdAt, updatedAt } = c.dataTracked;
9
- const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: uuidv4() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() }));
8
+ const { id, authorID, operation, reviewedByID, status, createdAt, statusUpdateAt, updatedAt } = c.dataTracked;
9
+ const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: uuidv4() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() })), (!statusUpdateAt && { statusUpdateAt: 0 }));
10
10
  if (Object.keys(newAttrs).length > 0) {
11
11
  updateChangeAttrs(newTr, c, Object.assign(Object.assign({}, c.dataTracked), newAttrs), schema);
12
12
  changed = true;
@@ -1,6 +1,6 @@
1
- import { log } from '../utils/logger';
2
1
  import { ChangeSet } from '../ChangeSet';
3
- import { getTextNodeTrackedMarkData, getBlockInlineTrackedData } from '../compute/nodeHelpers';
2
+ import { getBlockInlineTrackedData, getTextNodeTrackedMarkData, } from '../compute/nodeHelpers';
3
+ import { log } from '../utils/logger';
4
4
  export function updateChangeAttrs(tr, change, trackedAttrs, schema) {
5
5
  const node = tr.doc.nodeAt(change.from);
6
6
  if (!node) {
@@ -14,9 +14,7 @@ export function getTextNodeTrackedMarkData(node, schema) {
14
14
  const marksTrackedData = [];
15
15
  node.marks.forEach((mark) => {
16
16
  if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
17
- const operation = mark.type === schema.marks.tracked_insert
18
- ? CHANGE_OPERATION.insert
19
- : CHANGE_OPERATION.delete;
17
+ const operation = mark.type === schema.marks.tracked_insert ? CHANGE_OPERATION.insert : CHANGE_OPERATION.delete;
20
18
  marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
21
19
  }
22
20
  });
@@ -57,9 +55,7 @@ export function shouldMergeTrackedAttributes(left, right) {
57
55
  });
58
56
  return false;
59
57
  }
60
- return (left.status === right.status &&
61
- left.operation === right.operation &&
62
- left.authorID === right.authorID);
58
+ return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
63
59
  }
64
60
  export function getMergeableMarkTrackedAttrs(node, attrs, schema) {
65
61
  const nodeAttrs = getTextNodeTrackedMarkData(node, schema);
@@ -1,6 +1,6 @@
1
1
  import { Fragment } from 'prosemirror-model';
2
- import { log } from '../utils/logger';
3
2
  import { CHANGE_OPERATION } from '../types/change';
3
+ import { log } from '../utils/logger';
4
4
  import { addTrackIdIfDoesntExist, equalMarks, getTextNodeTrackedMarkData } from './nodeHelpers';
5
5
  function markInlineNodeChange(node, newTrackAttrs, schema) {
6
6
  const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
@@ -29,9 +29,7 @@ export function splitSliceIntoMergedParts(insertSlice, mergeEqualSides = false)
29
29
  const { openStart, openEnd, content: { firstChild, lastChild, content: nodes }, } = insertSlice;
30
30
  let updatedSliceNodes = nodes;
31
31
  const mergeSides = openStart !== openEnd || mergeEqualSides;
32
- const firstMergedNode = openStart > 0 && mergeSides && firstChild
33
- ? getMergedNode(firstChild, 1, openStart, true)
34
- : undefined;
32
+ const firstMergedNode = openStart > 0 && mergeSides && firstChild ? getMergedNode(firstChild, 1, openStart, true) : undefined;
35
33
  const lastMergedNode = openEnd > 0 && mergeSides && lastChild ? getMergedNode(lastChild, 1, openEnd, false) : undefined;
36
34
  if (firstMergedNode) {
37
35
  updatedSliceNodes = updatedSliceNodes.slice(1);
@@ -1,6 +1,6 @@
1
1
  import { Fragment } from 'prosemirror-model';
2
- import { splitSliceIntoMergedParts } from '../compute/splitSliceIntoMergedParts';
3
2
  import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
3
+ import { splitSliceIntoMergedParts } from '../compute/splitSliceIntoMergedParts';
4
4
  import * as trackUtils from '../utils/track-utils';
5
5
  export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackAttrs, insertSlice) {
6
6
  const steps = [];
@@ -16,16 +16,12 @@ export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema,
16
16
  let mergingStartSide = true;
17
17
  startDoc.nodesBetween(from, to, (node, pos) => {
18
18
  const nodeEnd = pos + node.nodeSize;
19
- const wasWithinGap = gap &&
20
- ((!node.isText && pos >= gap.start) ||
21
- (node.isText && pos >= gap.start && nodeEnd <= gap.end));
19
+ const wasWithinGap = gap && ((!node.isText && pos >= gap.start) || (node.isText && pos >= gap.start && nodeEnd <= gap.end));
22
20
  if (nodeEnd > from && !wasWithinGap) {
23
21
  const nodeCompletelyDeleted = pos >= from && nodeEnd <= to;
24
22
  const endTokenDeleted = nodeEnd <= to;
25
23
  const startTokenDeleted = pos >= from;
26
- if (node.isText ||
27
- (!endTokenDeleted && startTokenDeleted) ||
28
- (endTokenDeleted && !startTokenDeleted)) {
24
+ if (node.isText || (!endTokenDeleted && startTokenDeleted) || (endTokenDeleted && !startTokenDeleted)) {
29
25
  if (!endTokenDeleted && startTokenDeleted) {
30
26
  mergingStartSide = false;
31
27
  }
@@ -70,9 +66,7 @@ export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema,
70
66
  });
71
67
  return {
72
68
  sliceWasSplit: !!(firstMergedNode || lastMergedNode),
73
- newSliceContent: updatedSliceNodes
74
- ? Fragment.fromArray(updatedSliceNodes)
75
- : insertSlice.content,
69
+ newSliceContent: updatedSliceNodes ? Fragment.fromArray(updatedSliceNodes) : insertSlice.content,
76
70
  steps,
77
71
  };
78
72
  }
@@ -1,16 +1,10 @@
1
1
  import { Fragment } from 'prosemirror-model';
2
- import { liftTarget } from 'prosemirror-transform';
3
- import { log } from '../utils/logger';
4
- import { CHANGE_OPERATION } from '../types/change';
5
2
  import { addTrackIdIfDoesntExist, getBlockInlineTrackedData } from '../compute/nodeHelpers';
3
+ import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
4
+ import { log } from '../utils/logger';
6
5
  export function deleteNode(node, pos, tr) {
7
6
  var _a;
8
7
  const startPos = tr.doc.resolve(pos + 1);
9
- const range = startPos.blockRange(tr.doc.resolve(startPos.pos - 2 + node.nodeSize));
10
- const targetDepth = range && liftTarget(range);
11
- if (range && typeof targetDepth === 'number') {
12
- return tr.lift(range, targetDepth);
13
- }
14
8
  const resPos = tr.doc.resolve(pos);
15
9
  const canMergeToNodeAbove = resPos.parent !== tr.doc && resPos.nodeBefore && node.isBlock && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
16
10
  if (canMergeToNodeAbove) {
@@ -22,14 +16,18 @@ export function deleteNode(node, pos, tr) {
22
16
  }
23
17
  export function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
24
18
  const dataTracked = getBlockInlineTrackedData(node);
25
- const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.insert);
19
+ const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.insert && d.status === CHANGE_STATUS.pending);
26
20
  const deleted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.delete);
27
21
  const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.set_node_attributes);
28
22
  if (inserted && inserted.authorID === deleteAttrs.authorID) {
29
23
  return deleteNode(node, pos, newTr);
30
24
  }
31
25
  if (!newTr.doc.nodeAt(pos)) {
32
- log.error(`deleteOrSetNodeDeleted: no node found for deletion`, { pos, node, newTr });
26
+ log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
27
+ pos,
28
+ node,
29
+ newTr,
30
+ });
33
31
  return;
34
32
  }
35
33
  const newDeleted = deleted
package/dist/es/plugin.js CHANGED
@@ -11,14 +11,14 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  };
12
12
  import { Plugin, PluginKey } from 'prosemirror-state';
13
13
  import { getAction, setAction, TrackChangesAction } from './actions';
14
- import { ChangeSet } from './ChangeSet';
15
- import { log, enableDebug } from './utils/logger';
16
14
  import { applyAcceptedRejectedChanges } from './changes/applyChanges';
17
15
  import { findChanges } from './changes/findChanges';
18
16
  import { fixInconsistentChanges } from './changes/fixInconsistentChanges';
19
- import { trackTransaction } from './steps/trackTransaction';
20
17
  import { updateChangeAttrs } from './changes/updateChangeAttrs';
18
+ import { ChangeSet } from './ChangeSet';
19
+ import { trackTransaction } from './steps/trackTransaction';
21
20
  import { TrackChangesStatus } from './types/track';
21
+ import { enableDebug, log } from './utils/logger';
22
22
  export const trackChangesPluginKey = new PluginKey('track-changes');
23
23
  export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
24
24
  const { userID, debug, skipTrsWithMetas = [] } = opts;
@@ -79,18 +79,24 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) =>
79
79
  trs.forEach((tr) => {
80
80
  const wasAppended = tr.getMeta('appendedTransaction');
81
81
  const skipMetaUsed = skipTrsWithMetas.some((m) => tr.getMeta(m) || (wasAppended === null || wasAppended === void 0 ? void 0 : wasAppended.getMeta(m)));
82
- const skipTrackUsed = getAction(tr, TrackChangesAction.skipTrack) || (wasAppended && getAction(wasAppended, TrackChangesAction.skipTrack));
83
- if (tr.docChanged && !skipMetaUsed && !skipTrackUsed && !tr.getMeta('history$') && !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
82
+ const skipTrackUsed = getAction(tr, TrackChangesAction.skipTrack) ||
83
+ (wasAppended && getAction(wasAppended, TrackChangesAction.skipTrack));
84
+ if (tr.docChanged &&
85
+ !skipMetaUsed &&
86
+ !skipTrackUsed &&
87
+ !tr.getMeta('history$') &&
88
+ !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
84
89
  createdTr = trackTransaction(tr, oldState, createdTr, userID);
85
90
  }
86
91
  docChanged = docChanged || tr.docChanged;
87
92
  const setChangeStatuses = getAction(tr, TrackChangesAction.setChangeStatuses);
88
93
  if (setChangeStatuses) {
89
94
  const { status, ids } = setChangeStatuses;
95
+ const changeTime = new Date().getTime();
90
96
  ids.forEach((changeId) => {
91
97
  const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
92
98
  if (change) {
93
- createdTr = updateChangeAttrs(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, reviewedByID: userID }), oldState.schema);
99
+ createdTr = updateChangeAttrs(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
94
100
  }
95
101
  });
96
102
  }
@@ -100,7 +106,8 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) =>
100
106
  setAction(createdTr, TrackChangesAction.refreshChanges, true);
101
107
  }
102
108
  });
103
- const changed = pluginState.changeSet.hasInconsistentData && fixInconsistentChanges(pluginState.changeSet, userID, createdTr, oldState.schema);
109
+ const changed = pluginState.changeSet.hasInconsistentData &&
110
+ fixInconsistentChanges(pluginState.changeSet, userID, createdTr, oldState.schema);
104
111
  if (changed) {
105
112
  log.warn('had to fix inconsistent changes in', createdTr);
106
113
  }
@@ -1,9 +1,9 @@
1
1
  import { Slice } from 'prosemirror-model';
2
- import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
2
+ import { TrackChangesAction } from '../actions';
3
3
  import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
4
+ import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
4
5
  import { log } from '../utils/logger';
5
6
  import * as trackUtils from '../utils/track-utils';
6
- import { TrackChangesAction } from '../actions';
7
7
  export function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
8
8
  log.info('###### ReplaceAroundStep ######');
9
9
  const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
@@ -1,6 +1,6 @@
1
1
  import { Slice } from 'prosemirror-model';
2
- import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
3
2
  import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
3
+ import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
4
4
  import { log } from '../utils/logger';
5
5
  import * as trackUtils from '../utils/track-utils';
6
6
  export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc) {
@@ -45,7 +45,9 @@ export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, curre
45
45
  });
46
46
  }
47
47
  else {
48
- selectionPos = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete' || ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward' ? toA : fromA;
48
+ const isDeleteEvent = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete';
49
+ const isDeleteContentForward = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward';
50
+ selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
49
51
  }
50
52
  });
51
53
  return [changeSteps, selectionPos];
@@ -1,11 +1,11 @@
1
1
  import { NodeSelection as NodeSelectionClass } from 'prosemirror-state';
2
2
  import { ReplaceAroundStep, ReplaceStep } from 'prosemirror-transform';
3
- import { log } from '../utils/logger';
3
+ import { diffChangeSteps } from '../change-steps/diffChangeSteps';
4
+ import { processChangeSteps } from '../change-steps/processChangeSteps';
4
5
  import { CHANGE_STATUS } from '../types/change';
6
+ import { log } from '../utils/logger';
5
7
  import { trackReplaceAroundStep } from './trackReplaceAroundStep';
6
8
  import { trackReplaceStep } from './trackReplaceStep';
7
- import { processChangeSteps } from '../change-steps/processChangeSteps';
8
- import { diffChangeSteps } from '../change-steps/diffChangeSteps';
9
9
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
10
10
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
11
11
  export function trackTransaction(tr, oldState, newTr, authorID) {
@@ -15,6 +15,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
15
15
  reviewedByID: null,
16
16
  createdAt: tr.time,
17
17
  updatedAt: tr.time,
18
+ statusUpdateAt: 0,
18
19
  status: CHANGE_STATUS.pending,
19
20
  };
20
21
  const wasNodeSelection = tr.selection instanceof NodeSelectionClass;
@@ -36,8 +37,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
36
37
  }
37
38
  else if (step instanceof ReplaceStep) {
38
39
  const { slice } = step;
39
- if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 &&
40
- isHighlightMarkerNode(slice.content.content[0])) {
40
+ if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
41
41
  continue;
42
42
  }
43
43
  const newStep = step.invert(tr.docs[i]);
@@ -1,4 +1,4 @@
1
- import { NodeChange, IncompleteChange, TextChange, TrackedAttrs, TrackedChange, NodeAttrChange } from './types/change';
1
+ import { IncompleteChange, NodeAttrChange, NodeChange, TextChange, TrackedAttrs, TrackedChange } from './types/change';
2
2
  export declare class ChangeSet {
3
3
  #private;
4
4
  constructor(changes?: (TrackedChange | IncompleteChange)[]);
@@ -1,8 +1,8 @@
1
1
  import { Fragment, Node as PMNode, Schema } from 'prosemirror-model';
2
2
  import type { Transaction } from 'prosemirror-state';
3
3
  import { ExposedSlice } from '../types/pm';
4
- import { NewEmptyAttrs } from '../types/track';
5
4
  import { ChangeStep } from '../types/step';
5
+ import { NewEmptyAttrs } from '../types/track';
6
6
  export declare function deleteAndMergeSplitNodes(from: number, to: number, gap: {
7
7
  start: number;
8
8
  end: number;
@@ -1,5 +1,5 @@
1
1
  import type { EditorState, Transaction } from 'prosemirror-state';
2
2
  import { ReplaceAroundStep } from 'prosemirror-transform';
3
- import { NewEmptyAttrs } from '../types/track';
4
3
  import { ChangeStep } from '../types/step';
4
+ import { NewEmptyAttrs } from '../types/track';
5
5
  export declare function trackReplaceAroundStep(step: ReplaceAroundStep, oldState: EditorState, tr: Transaction, newTr: Transaction, attrs: NewEmptyAttrs): ChangeStep[];
@@ -1,6 +1,6 @@
1
1
  import { Node as PMNode } from 'prosemirror-model';
2
2
  import type { EditorState, Transaction } from 'prosemirror-state';
3
3
  import { ReplaceStep, StepResult } from 'prosemirror-transform';
4
- import { NewEmptyAttrs } from '../types/track';
5
4
  import { ChangeStep } from '../types/step';
5
+ import { NewEmptyAttrs } from '../types/track';
6
6
  export declare function trackReplaceStep(step: ReplaceStep, oldState: EditorState, newTr: Transaction, attrs: NewEmptyAttrs, stepResult: StepResult, currentStepDoc: PMNode): [ChangeStep[], number];
@@ -14,6 +14,7 @@ type InsertDeleteAttrs = {
14
14
  reviewedByID: string | null;
15
15
  operation: CHANGE_OPERATION.insert | CHANGE_OPERATION.delete;
16
16
  status: CHANGE_STATUS;
17
+ statusUpdateAt: number;
17
18
  createdAt: number;
18
19
  updatedAt: number;
19
20
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manuscripts/track-changes-plugin",
3
- "version": "1.7.3",
3
+ "version": "1.7.4",
4
4
  "author": "Atypon Systems LLC",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/Atypon-OpenSource/manuscripts-track-changes-plugin",
@@ -15,27 +15,47 @@
15
15
  "build": "npm-run-all --parallel 'build:* --project tsconfig.json'",
16
16
  "build:cjs": "tsc --outDir dist/cjs --module commonjs",
17
17
  "build:es": "tsc --outDir dist/es --declarationDir dist/types --declaration",
18
- "dev": "npm-run-all --parallel 'build:* --project tsconfig.build.json --watch'",
18
+ "dev": "npm-run-all --parallel 'build:* --project tsconfig.json --watch'",
19
19
  "test": "jest --runInBand",
20
+ "test-rs": "jest -i test/diff/diff.test.ts",
20
21
  "format": "prettier --write \"*.+(js|json|yml|yaml|ts|md|graphql|mdx)\" src/ test/",
21
22
  "typecheck": "tsc --project tsconfig.test.json --noEmit",
22
23
  "lint": "eslint --cache --ext .js,.ts, ./src ./test",
23
- "lint:fix": "eslint --fix --ext .js,.ts, ./src ./test"
24
+ "lint:fix": "eslint --fix --ext .js,.ts, ./src ./test",
25
+ "prepare": "husky install"
24
26
  },
25
27
  "devDependencies": {
28
+ "@manuscripts/eslint-config": "^0.5.1",
26
29
  "@manuscripts/transform": "^1.5.1",
27
30
  "@types/debug": "^4.1.7",
28
31
  "@types/jest": "27.5.1",
29
32
  "@types/node": "^18.7.18",
33
+ "@typescript-eslint/eslint-plugin": "^5.47.0",
34
+ "@typescript-eslint/parser": "^5.47.0",
35
+ "eslint": "^8.46.0",
36
+ "eslint-config-prettier": "^8.5.0",
37
+ "eslint-plugin-header": "^3.1.1",
38
+ "eslint-plugin-import": "^2.26.0",
39
+ "eslint-plugin-jest": "^27.1.7",
40
+ "eslint-plugin-jsx-a11y": "^6.6.1",
41
+ "eslint-plugin-mdx": "2.0.4",
42
+ "eslint-plugin-prettier": "^4.2.1",
43
+ "eslint-plugin-promise": "^6.1.1",
44
+ "eslint-plugin-react": "^7.31.11",
45
+ "eslint-plugin-react-hooks": "^4.6.0",
46
+ "eslint-plugin-simple-import-sort": "^8.0.0",
47
+ "husky": "^8.0.1",
30
48
  "jest": "27.5.1",
31
49
  "jest-environment-jsdom": "27.5.1",
32
50
  "jsdom": "^20.0.0",
33
51
  "npm-run-all": "^4.1.5",
52
+ "prettier": "^2.8.1",
34
53
  "ts-jest": "27.1.4",
35
54
  "tslib": "^2.4.0",
36
55
  "typescript": "^4.8.3"
37
56
  },
38
57
  "dependencies": {
58
+ "debug": "^4.3.4",
39
59
  "prosemirror-commands": "^1.5.0",
40
60
  "prosemirror-example-setup": "^1.2.1",
41
61
  "prosemirror-history": "^1.3.0",
@@ -44,7 +64,9 @@
44
64
  "prosemirror-schema-list": "^1.2.2",
45
65
  "prosemirror-state": "^1.4.2",
46
66
  "prosemirror-transform": "^1.7.0",
47
- "prosemirror-view": "^1.29.1",
48
- "debug": "^4.3.4"
67
+ "prosemirror-view": "^1.29.1"
68
+ },
69
+ "resolutions": {
70
+ "eslint-mdx": "2.0.5"
49
71
  }
50
72
  }