@manuscripts/track-changes-plugin 1.10.5-LEAN-4160.5 → 1.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -91,8 +91,7 @@ class ChangeSet {
91
91
  }
92
92
  rootNodes.push([change]);
93
93
  });
94
- return rootNodes.filter((changes) => changes.filter((c) => c.dataTracked.operation !== change_1.CHANGE_OPERATION.reference &&
95
- !(c.dataTracked.moveNodeId && c.dataTracked.operation === change_1.CHANGE_OPERATION.delete)).length);
94
+ return rootNodes.filter((changes) => changes.filter((c) => c.dataTracked.operation !== change_1.CHANGE_OPERATION.reference).length);
96
95
  }
97
96
  get pending() {
98
97
  return this.changes.filter((c) => c.dataTracked.status === change_1.CHANGE_STATUS.pending);
@@ -150,11 +149,16 @@ class ChangeSet {
150
149
  canJoinAdjacentInlineChanges(change, index) {
151
150
  const nextChange = this.changeTree.at(index + 1);
152
151
  const isInline = (c) => c.type === 'text-change' || (c.type === 'node-change' && c.node.isInline);
152
+ const hasMatchingOperation = (c1, c2) => c1.dataTracked.operation === c2.dataTracked.operation ||
153
+ (c1.dataTracked.operation === 'wrap_with_node' &&
154
+ (c2.dataTracked.operation === 'insert' || c2.dataTracked.operation === 'set_attrs')) ||
155
+ (c2.dataTracked.operation === 'wrap_with_node' &&
156
+ (c1.dataTracked.operation === 'insert' || c1.dataTracked.operation === 'set_attrs'));
153
157
  return (isInline(change) &&
154
158
  nextChange &&
155
159
  isInline(nextChange) &&
156
160
  change.to === nextChange.from &&
157
- change.dataTracked.operation === nextChange.dataTracked.operation);
161
+ hasMatchingOperation(change, nextChange));
158
162
  }
159
163
  static flattenTreeToIds(changes) {
160
164
  return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
@@ -163,8 +167,7 @@ class ChangeSet {
163
167
  const { status, operation } = change.dataTracked;
164
168
  return (((operation === change_1.CHANGE_OPERATION.insert ||
165
169
  operation === change_1.CHANGE_OPERATION.node_split ||
166
- operation === change_1.CHANGE_OPERATION.wrap_with_node ||
167
- operation === change_1.CHANGE_OPERATION.move) &&
170
+ operation === change_1.CHANGE_OPERATION.wrap_with_node) &&
168
171
  status === change_1.CHANGE_STATUS.rejected) ||
169
172
  (operation === change_1.CHANGE_OPERATION.delete && status === change_1.CHANGE_STATUS.accepted));
170
173
  }
@@ -20,6 +20,14 @@ exports.getUpdatedDataTracked = getUpdatedDataTracked;
20
20
  function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap = new prosemirror_transform_1.Mapping()) {
21
21
  changes.sort((c1, c2) => c1.dataTracked.updatedAt - c2.dataTracked.updatedAt);
22
22
  changes.forEach((change) => {
23
+ if (change.dataTracked.status == change_1.CHANGE_STATUS.rejected) {
24
+ if (change.dataTracked.operation === change_1.CHANGE_OPERATION.node_split) {
25
+ return (0, revertChange_1.revertSplitNodeChange)(tr, change, changeSet);
26
+ }
27
+ if (change.dataTracked.operation === change_1.CHANGE_OPERATION.wrap_with_node) {
28
+ return (0, revertChange_1.revertWrapNodeChange)(tr, change);
29
+ }
30
+ }
23
31
  const { pos: from, deleted } = deleteMap.mapResult(change.from);
24
32
  const node = tr.doc.nodeAt(from);
25
33
  const noChangeNeeded = !ChangeSet_1.ChangeSet.shouldDeleteChange(change);
@@ -27,45 +35,9 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
27
35
  return;
28
36
  }
29
37
  if (!node) {
30
- !deleted && logger_1.log.warn('No node found to update for change', change);
38
+ !deleted && logger_1.log.warn('no node found to update for change', change);
31
39
  return;
32
40
  }
33
- if (change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
34
- if (change.dataTracked.operation === change_1.CHANGE_OPERATION.node_split) {
35
- return (0, revertChange_1.revertSplitNodeChange)(tr, change, changeSet);
36
- }
37
- if (change.dataTracked.operation === change_1.CHANGE_OPERATION.wrap_with_node) {
38
- return (0, revertChange_1.revertWrapNodeChange)(tr, change);
39
- }
40
- if (change.dataTracked.operation === change_1.CHANGE_OPERATION.move) {
41
- tr.delete(from, from + node.nodeSize);
42
- return deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
43
- }
44
- }
45
- else if (change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
46
- if (change.dataTracked.operation === change_1.CHANGE_OPERATION.move) {
47
- const originalNodeChange = changeSet.changes.find((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
48
- c.dataTracked.operation === change_1.CHANGE_OPERATION.delete);
49
- if (originalNodeChange) {
50
- const { pos: originalFrom, deleted: originalDeleted } = deleteMap.mapResult(originalNodeChange.from);
51
- const originalNode = tr.doc.nodeAt(originalFrom);
52
- if (originalDeleted) {
53
- return;
54
- }
55
- if (!originalNode) {
56
- return;
57
- }
58
- tr.delete(originalFrom, originalFrom + originalNode.nodeSize);
59
- deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
60
- }
61
- else {
62
- logger_1.log.warn('No original node change found for move', { change });
63
- }
64
- const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
65
- tr.setNodeMarkup(from, undefined, attrs, node.marks);
66
- return;
67
- }
68
- }
69
41
  if (ChangeSet_1.ChangeSet.isTextChange(change) && noChangeNeeded) {
70
42
  tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_insert);
71
43
  tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_delete);
@@ -23,7 +23,6 @@ const applyChanges_1 = require("./applyChanges");
23
23
  const updateChangeAttrs_1 = require("./updateChangeAttrs");
24
24
  function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState) {
25
25
  const change = changeSet.get(ids[0]);
26
- const changeTime = new Date().getTime();
27
26
  if (change && status !== change_1.CHANGE_STATUS.pending) {
28
27
  const textChanges = [];
29
28
  const nonTextChanges = [];
@@ -41,24 +40,6 @@ function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState
41
40
  nonTextChanges.push(relatedRefChange);
42
41
  }
43
42
  }
44
- if (c.dataTracked.operation === change_1.CHANGE_OPERATION.move) {
45
- const oldChange = changeSet.changeTree.find((c) => ChangeSet_1.ChangeSet.isNodeChange(c) &&
46
- c.dataTracked.operation === 'delete' &&
47
- c.dataTracked.moveNodeId === change.dataTracked.moveNodeId);
48
- if (oldChange && ChangeSet_1.ChangeSet.isNodeChange(oldChange)) {
49
- createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, oldChange, Object.assign(Object.assign({}, oldChange.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
50
- oldChange.children.forEach((child) => {
51
- createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, child, Object.assign(Object.assign({}, child.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
52
- if (ChangeSet_1.ChangeSet.isTextChange(child)) {
53
- textChanges.push(child);
54
- }
55
- else {
56
- nonTextChanges.push(child);
57
- }
58
- });
59
- nonTextChanges.push(oldChange);
60
- }
61
- }
62
43
  }
63
44
  }
64
45
  });
@@ -66,6 +47,7 @@ function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState
66
47
  (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, textChanges, changeSet, mapping);
67
48
  }
68
49
  else {
50
+ const changeTime = new Date().getTime();
69
51
  ids.forEach((changeId) => {
70
52
  const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
71
53
  if (change) {
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.setFragmentAsNodeSplit = exports.setFragmentAsMoveChange = exports.setFragmentAsWrapChange = exports.setFragmentAsInserted = void 0;
26
+ exports.setFragmentAsNodeSplit = exports.setFragmentAsWrapChange = exports.setFragmentAsInserted = void 0;
27
27
  const prosemirror_model_1 = require("prosemirror-model");
28
28
  const change_1 = require("../types/change");
29
29
  const logger_1 = require("../utils/logger");
@@ -84,14 +84,6 @@ function setFragmentAsWrapChange(inserted, attrs, schema) {
84
84
  return prosemirror_model_1.Fragment.from(content);
85
85
  }
86
86
  exports.setFragmentAsWrapChange = setFragmentAsWrapChange;
87
- function setFragmentAsMoveChange(fragment, attrs) {
88
- const content = [];
89
- fragment.forEach((node) => {
90
- content.push(node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [(0, nodeHelpers_1.addTrackIdIfDoesntExist)(trackUtils.createNewMoveAttrs(attrs))] }), node.content, node.marks));
91
- });
92
- return prosemirror_model_1.Fragment.from(content);
93
- }
94
- exports.setFragmentAsMoveChange = setFragmentAsMoveChange;
95
87
  function setFragmentAsNodeSplit($pos, newTr, inserted, attrs) {
96
88
  const lastChild = inserted.lastChild;
97
89
  const referenceId = (0, uuidv4_1.uuidv4)();
@@ -100,7 +100,7 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous', initialStatu
100
100
  !skipTrackUsed &&
101
101
  !(0, track_utils_1.trFromHistory)(tr) &&
102
102
  !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
103
- createdTr = (0, trackTransaction_1.trackTransaction)(tr, oldState, createdTr, userID, changeSet);
103
+ createdTr = (0, trackTransaction_1.trackTransaction)(tr, oldState, createdTr, userID);
104
104
  }
105
105
  docChanged = docChanged || tr.docChanged;
106
106
  if (setChangeStatuses) {
@@ -60,15 +60,13 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
60
60
  changeSteps.splice(changeSteps.indexOf(backSpacedText));
61
61
  }
62
62
  const textWasDeleted = !!changeSteps.length && !(fromA === fromB);
63
+ console.log(textWasDeleted);
63
64
  if (!backSpacedText && newSliceContent.size > 0) {
64
65
  logger_1.log.info('newSliceContent', newSliceContent);
65
66
  let fragment = (0, setFragmentAsInserted_1.setFragmentAsInserted)(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
66
67
  if ((0, track_utils_1.isSplitStep)(step, oldState.selection, tr.getMeta('uiEvent'))) {
67
68
  fragment = (0, setFragmentAsInserted_1.setFragmentAsNodeSplit)(newTr.doc.resolve(step.from), newTr, fragment, attrs);
68
69
  }
69
- if (attrs.moveNodeId) {
70
- fragment = (0, setFragmentAsInserted_1.setFragmentAsMoveChange)(newSliceContent, trackUtils.createNewMoveAttrs(attrs));
71
- }
72
70
  const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
73
71
  const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
74
72
  changeSteps.push({
@@ -13,14 +13,13 @@ const nodeHelpers_1 = require("../compute/nodeHelpers");
13
13
  const change_1 = require("../types/change");
14
14
  const logger_1 = require("../utils/logger");
15
15
  const mapChangeStep_1 = require("../utils/mapChangeStep");
16
- const track_utils_1 = require("../utils/track-utils");
17
16
  const uuidv4_1 = require("../utils/uuidv4");
18
17
  const trackAttrsChange_1 = __importDefault(require("./trackAttrsChange"));
19
18
  const trackReplaceAroundStep_1 = require("./trackReplaceAroundStep");
20
19
  const trackReplaceStep_1 = require("./trackReplaceStep");
21
20
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
22
21
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
23
- function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
22
+ function trackTransaction(tr, oldState, newTr, authorID) {
24
23
  var _a, _b, _c, _d, _e;
25
24
  const emptyAttrs = {
26
25
  authorID,
@@ -36,23 +35,6 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
36
35
  let iters = 0;
37
36
  logger_1.log.info('ORIGINAL transaction', tr);
38
37
  let trContext = {};
39
- tr.steps.forEach((step) => {
40
- var _a;
41
- if (step instanceof prosemirror_transform_1.ReplaceStep) {
42
- const doc = tr.docs[tr.steps.indexOf(step)];
43
- if ((0, track_utils_1.isDeletingPendingMovedNode)(step, doc)) {
44
- const node = doc.nodeAt(step.from);
45
- (_a = node === null || node === void 0 ? void 0 : node.attrs.dataTracked) === null || _a === void 0 ? void 0 : _a.forEach((tracked) => {
46
- if (tracked.operation === change_1.CHANGE_OPERATION.move && tracked.status === change_1.CHANGE_STATUS.pending) {
47
- newTr.setNodeMarkup(step.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: node.attrs.dataTracked.map((t) => t.id === tracked.id ? Object.assign(Object.assign({}, t), { status: change_1.CHANGE_STATUS.rejected }) : t) }));
48
- }
49
- });
50
- }
51
- }
52
- });
53
- if ((0, track_utils_1.isNodeMoveOperation)(tr)) {
54
- emptyAttrs.moveNodeId = (0, uuidv4_1.uuidv4)();
55
- }
56
38
  for (let i = tr.steps.length - 1; i >= 0; i--) {
57
39
  const step = tr.steps[i];
58
40
  logger_1.log.info('transaction step', step);
@@ -24,7 +24,6 @@ var CHANGE_OPERATION;
24
24
  CHANGE_OPERATION["wrap_with_node"] = "wrap_with_node";
25
25
  CHANGE_OPERATION["node_split"] = "node_split";
26
26
  CHANGE_OPERATION["reference"] = "reference";
27
- CHANGE_OPERATION["move"] = "move";
28
27
  })(CHANGE_OPERATION = exports.CHANGE_OPERATION || (exports.CHANGE_OPERATION = {}));
29
28
  var CHANGE_STATUS;
30
29
  (function (CHANGE_STATUS) {
@@ -11,8 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.isDeletingPendingMovedNode = exports.isNodeMoveOperation = exports.trFromHistory = exports.stepIsLift = exports.isLiftStep = exports.isWrapStep = exports.isSplitStep = exports.createNewUpdateAttrs = exports.createNewMoveAttrs = exports.createNewDeleteAttrs = exports.createNewReferenceAttrs = exports.createNewSplitAttrs = exports.createNewWrapAttrs = exports.createNewInsertAttrs = void 0;
15
- const prosemirror_transform_1 = require("prosemirror-transform");
14
+ exports.trFromHistory = exports.stepIsLift = exports.isLiftStep = exports.isWrapStep = exports.isSplitStep = exports.createNewUpdateAttrs = exports.createNewDeleteAttrs = exports.createNewReferenceAttrs = exports.createNewSplitAttrs = exports.createNewWrapAttrs = exports.createNewInsertAttrs = void 0;
16
15
  const change_1 = require("../types/change");
17
16
  function createNewInsertAttrs(attrs) {
18
17
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
@@ -34,10 +33,6 @@ function createNewDeleteAttrs(attrs) {
34
33
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
35
34
  }
36
35
  exports.createNewDeleteAttrs = createNewDeleteAttrs;
37
- function createNewMoveAttrs(attrs) {
38
- return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.move });
39
- }
40
- exports.createNewMoveAttrs = createNewMoveAttrs;
41
36
  function createNewUpdateAttrs(attrs, oldAttrs) {
42
37
  const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
43
38
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
@@ -89,47 +84,3 @@ function stepIsLift(gap, node, to) {
89
84
  exports.stepIsLift = stepIsLift;
90
85
  const trFromHistory = (tr) => Object.keys(tr.meta).find((s) => s.startsWith('history$'));
91
86
  exports.trFromHistory = trFromHistory;
92
- const isNodeMoveOperation = (tr) => {
93
- if (tr.steps.length < 2) {
94
- return false;
95
- }
96
- if (!tr.steps.every((step) => step instanceof prosemirror_transform_1.ReplaceStep)) {
97
- return false;
98
- }
99
- const deletedHashes = new Set();
100
- const insertedHashes = new Set();
101
- for (let i = 0; i < tr.steps.length; i++) {
102
- const step = tr.steps[i];
103
- const doc = tr.docs[i];
104
- const content = step.slice.size === 0 ? doc.slice(step.from, step.to) : step.slice;
105
- if (step.from !== step.to && step.slice.size === 0) {
106
- if (content.content.firstChild) {
107
- deletedHashes.add(content.content.firstChild.toString());
108
- }
109
- }
110
- else if (step.slice.size > 0) {
111
- if (content.content.firstChild) {
112
- insertedHashes.add(content.content.firstChild.toString());
113
- }
114
- }
115
- }
116
- if (deletedHashes.size !== insertedHashes.size) {
117
- return false;
118
- }
119
- for (const hash of insertedHashes) {
120
- if (!deletedHashes.has(hash)) {
121
- return false;
122
- }
123
- }
124
- return true;
125
- };
126
- exports.isNodeMoveOperation = isNodeMoveOperation;
127
- const isDeletingPendingMovedNode = (step, doc) => {
128
- var _a;
129
- if (step.from === step.to || step.slice.content.size > 0) {
130
- return false;
131
- }
132
- const node = doc.nodeAt(step.from);
133
- return !!((_a = node === null || node === void 0 ? void 0 : node.attrs.dataTracked) === null || _a === void 0 ? void 0 : _a.find((tracked) => tracked.operation === change_1.CHANGE_OPERATION.move && tracked.status === change_1.CHANGE_STATUS.pending));
134
- };
135
- exports.isDeletingPendingMovedNode = isDeletingPendingMovedNode;
@@ -88,8 +88,7 @@ export class ChangeSet {
88
88
  }
89
89
  rootNodes.push([change]);
90
90
  });
91
- return rootNodes.filter((changes) => changes.filter((c) => c.dataTracked.operation !== CHANGE_OPERATION.reference &&
92
- !(c.dataTracked.moveNodeId && c.dataTracked.operation === CHANGE_OPERATION.delete)).length);
91
+ return rootNodes.filter((changes) => changes.filter((c) => c.dataTracked.operation !== CHANGE_OPERATION.reference).length);
93
92
  }
94
93
  get pending() {
95
94
  return this.changes.filter((c) => c.dataTracked.status === CHANGE_STATUS.pending);
@@ -147,11 +146,16 @@ export class ChangeSet {
147
146
  canJoinAdjacentInlineChanges(change, index) {
148
147
  const nextChange = this.changeTree.at(index + 1);
149
148
  const isInline = (c) => c.type === 'text-change' || (c.type === 'node-change' && c.node.isInline);
149
+ const hasMatchingOperation = (c1, c2) => c1.dataTracked.operation === c2.dataTracked.operation ||
150
+ (c1.dataTracked.operation === 'wrap_with_node' &&
151
+ (c2.dataTracked.operation === 'insert' || c2.dataTracked.operation === 'set_attrs')) ||
152
+ (c2.dataTracked.operation === 'wrap_with_node' &&
153
+ (c1.dataTracked.operation === 'insert' || c1.dataTracked.operation === 'set_attrs'));
150
154
  return (isInline(change) &&
151
155
  nextChange &&
152
156
  isInline(nextChange) &&
153
157
  change.to === nextChange.from &&
154
- change.dataTracked.operation === nextChange.dataTracked.operation);
158
+ hasMatchingOperation(change, nextChange));
155
159
  }
156
160
  static flattenTreeToIds(changes) {
157
161
  return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
@@ -160,8 +164,7 @@ export class ChangeSet {
160
164
  const { status, operation } = change.dataTracked;
161
165
  return (((operation === CHANGE_OPERATION.insert ||
162
166
  operation === CHANGE_OPERATION.node_split ||
163
- operation === CHANGE_OPERATION.wrap_with_node ||
164
- operation === CHANGE_OPERATION.move) &&
167
+ operation === CHANGE_OPERATION.wrap_with_node) &&
165
168
  status === CHANGE_STATUS.rejected) ||
166
169
  (operation === CHANGE_OPERATION.delete && status === CHANGE_STATUS.accepted));
167
170
  }
@@ -16,6 +16,14 @@ export function getUpdatedDataTracked(dataTracked, changeId) {
16
16
  export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap = new Mapping()) {
17
17
  changes.sort((c1, c2) => c1.dataTracked.updatedAt - c2.dataTracked.updatedAt);
18
18
  changes.forEach((change) => {
19
+ if (change.dataTracked.status == CHANGE_STATUS.rejected) {
20
+ if (change.dataTracked.operation === CHANGE_OPERATION.node_split) {
21
+ return revertSplitNodeChange(tr, change, changeSet);
22
+ }
23
+ if (change.dataTracked.operation === CHANGE_OPERATION.wrap_with_node) {
24
+ return revertWrapNodeChange(tr, change);
25
+ }
26
+ }
19
27
  const { pos: from, deleted } = deleteMap.mapResult(change.from);
20
28
  const node = tr.doc.nodeAt(from);
21
29
  const noChangeNeeded = !ChangeSet.shouldDeleteChange(change);
@@ -23,45 +31,9 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, del
23
31
  return;
24
32
  }
25
33
  if (!node) {
26
- !deleted && log.warn('No node found to update for change', change);
34
+ !deleted && log.warn('no node found to update for change', change);
27
35
  return;
28
36
  }
29
- if (change.dataTracked.status === CHANGE_STATUS.rejected) {
30
- if (change.dataTracked.operation === CHANGE_OPERATION.node_split) {
31
- return revertSplitNodeChange(tr, change, changeSet);
32
- }
33
- if (change.dataTracked.operation === CHANGE_OPERATION.wrap_with_node) {
34
- return revertWrapNodeChange(tr, change);
35
- }
36
- if (change.dataTracked.operation === CHANGE_OPERATION.move) {
37
- tr.delete(from, from + node.nodeSize);
38
- return deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
39
- }
40
- }
41
- else if (change.dataTracked.status === CHANGE_STATUS.accepted) {
42
- if (change.dataTracked.operation === CHANGE_OPERATION.move) {
43
- const originalNodeChange = changeSet.changes.find((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
44
- c.dataTracked.operation === CHANGE_OPERATION.delete);
45
- if (originalNodeChange) {
46
- const { pos: originalFrom, deleted: originalDeleted } = deleteMap.mapResult(originalNodeChange.from);
47
- const originalNode = tr.doc.nodeAt(originalFrom);
48
- if (originalDeleted) {
49
- return;
50
- }
51
- if (!originalNode) {
52
- return;
53
- }
54
- tr.delete(originalFrom, originalFrom + originalNode.nodeSize);
55
- deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
56
- }
57
- else {
58
- log.warn('No original node change found for move', { change });
59
- }
60
- const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
61
- tr.setNodeMarkup(from, undefined, attrs, node.marks);
62
- return;
63
- }
64
- }
65
37
  if (ChangeSet.isTextChange(change) && noChangeNeeded) {
66
38
  tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_insert);
67
39
  tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_delete);
@@ -20,7 +20,6 @@ import { applyAcceptedRejectedChanges } from './applyChanges';
20
20
  import { updateChangeAttrs } from './updateChangeAttrs';
21
21
  export function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState) {
22
22
  const change = changeSet.get(ids[0]);
23
- const changeTime = new Date().getTime();
24
23
  if (change && status !== CHANGE_STATUS.pending) {
25
24
  const textChanges = [];
26
25
  const nonTextChanges = [];
@@ -38,24 +37,6 @@ export function updateChangesStatus(createdTr, changeSet, ids, status, userID, o
38
37
  nonTextChanges.push(relatedRefChange);
39
38
  }
40
39
  }
41
- if (c.dataTracked.operation === CHANGE_OPERATION.move) {
42
- const oldChange = changeSet.changeTree.find((c) => ChangeSet.isNodeChange(c) &&
43
- c.dataTracked.operation === 'delete' &&
44
- c.dataTracked.moveNodeId === change.dataTracked.moveNodeId);
45
- if (oldChange && ChangeSet.isNodeChange(oldChange)) {
46
- createdTr = updateChangeAttrs(createdTr, oldChange, Object.assign(Object.assign({}, oldChange.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
47
- oldChange.children.forEach((child) => {
48
- createdTr = updateChangeAttrs(createdTr, child, Object.assign(Object.assign({}, child.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
49
- if (ChangeSet.isTextChange(child)) {
50
- textChanges.push(child);
51
- }
52
- else {
53
- nonTextChanges.push(child);
54
- }
55
- });
56
- nonTextChanges.push(oldChange);
57
- }
58
- }
59
40
  }
60
41
  }
61
42
  });
@@ -63,6 +44,7 @@ export function updateChangesStatus(createdTr, changeSet, ids, status, userID, o
63
44
  applyAcceptedRejectedChanges(createdTr, oldState.schema, textChanges, changeSet, mapping);
64
45
  }
65
46
  else {
47
+ const changeTime = new Date().getTime();
66
48
  ids.forEach((changeId) => {
67
49
  const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
68
50
  if (change) {
@@ -56,13 +56,6 @@ export function setFragmentAsWrapChange(inserted, attrs, schema) {
56
56
  });
57
57
  return Fragment.from(content);
58
58
  }
59
- export function setFragmentAsMoveChange(fragment, attrs) {
60
- const content = [];
61
- fragment.forEach((node) => {
62
- content.push(node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [addTrackIdIfDoesntExist(trackUtils.createNewMoveAttrs(attrs))] }), node.content, node.marks));
63
- });
64
- return Fragment.from(content);
65
- }
66
59
  export function setFragmentAsNodeSplit($pos, newTr, inserted, attrs) {
67
60
  const lastChild = inserted.lastChild;
68
61
  const referenceId = uuidv4();
package/dist/es/plugin.js CHANGED
@@ -97,7 +97,7 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous', initi
97
97
  !skipTrackUsed &&
98
98
  !trFromHistory(tr) &&
99
99
  !(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
100
- createdTr = trackTransaction(tr, oldState, createdTr, userID, changeSet);
100
+ createdTr = trackTransaction(tr, oldState, createdTr, userID);
101
101
  }
102
102
  docChanged = docChanged || tr.docChanged;
103
103
  if (setChangeStatuses) {
@@ -1,5 +1,5 @@
1
1
  import { Slice } from 'prosemirror-model';
2
- import { setFragmentAsInserted, setFragmentAsMoveChange, setFragmentAsNodeSplit, } from '../compute/setFragmentAsInserted';
2
+ import { setFragmentAsInserted, setFragmentAsNodeSplit } from '../compute/setFragmentAsInserted';
3
3
  import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
4
4
  import { log } from '../utils/logger';
5
5
  import * as trackUtils from '../utils/track-utils';
@@ -34,15 +34,13 @@ export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, curre
34
34
  changeSteps.splice(changeSteps.indexOf(backSpacedText));
35
35
  }
36
36
  const textWasDeleted = !!changeSteps.length && !(fromA === fromB);
37
+ console.log(textWasDeleted);
37
38
  if (!backSpacedText && newSliceContent.size > 0) {
38
39
  log.info('newSliceContent', newSliceContent);
39
40
  let fragment = setFragmentAsInserted(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
40
41
  if (isSplitStep(step, oldState.selection, tr.getMeta('uiEvent'))) {
41
42
  fragment = setFragmentAsNodeSplit(newTr.doc.resolve(step.from), newTr, fragment, attrs);
42
43
  }
43
- if (attrs.moveNodeId) {
44
- fragment = setFragmentAsMoveChange(newSliceContent, trackUtils.createNewMoveAttrs(attrs));
45
- }
46
44
  const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
47
45
  const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
48
46
  changeSteps.push({
@@ -4,17 +4,16 @@ import { diffChangeSteps } from '../change-steps/diffChangeSteps';
4
4
  import { processChangeSteps } from '../change-steps/processChangeSteps';
5
5
  import { updateChangeAttrs } from '../changes/updateChangeAttrs';
6
6
  import { getNodeTrackedData } from '../compute/nodeHelpers';
7
- import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
7
+ import { CHANGE_STATUS } from '../types/change';
8
8
  import { log } from '../utils/logger';
9
9
  import { mapChangeSteps } from '../utils/mapChangeStep';
10
- import { isDeletingPendingMovedNode, isNodeMoveOperation } from '../utils/track-utils';
11
10
  import { uuidv4 } from '../utils/uuidv4';
12
11
  import trackAttrsChange from './trackAttrsChange';
13
12
  import { trackReplaceAroundStep } from './trackReplaceAroundStep';
14
13
  import { trackReplaceStep } from './trackReplaceStep';
15
14
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
16
15
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
17
- export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
16
+ export function trackTransaction(tr, oldState, newTr, authorID) {
18
17
  var _a, _b, _c, _d, _e;
19
18
  const emptyAttrs = {
20
19
  authorID,
@@ -30,23 +29,6 @@ export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
30
29
  let iters = 0;
31
30
  log.info('ORIGINAL transaction', tr);
32
31
  let trContext = {};
33
- tr.steps.forEach((step) => {
34
- var _a;
35
- if (step instanceof ReplaceStep) {
36
- const doc = tr.docs[tr.steps.indexOf(step)];
37
- if (isDeletingPendingMovedNode(step, doc)) {
38
- const node = doc.nodeAt(step.from);
39
- (_a = node === null || node === void 0 ? void 0 : node.attrs.dataTracked) === null || _a === void 0 ? void 0 : _a.forEach((tracked) => {
40
- if (tracked.operation === CHANGE_OPERATION.move && tracked.status === CHANGE_STATUS.pending) {
41
- newTr.setNodeMarkup(step.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: node.attrs.dataTracked.map((t) => t.id === tracked.id ? Object.assign(Object.assign({}, t), { status: CHANGE_STATUS.rejected }) : t) }));
42
- }
43
- });
44
- }
45
- }
46
- });
47
- if (isNodeMoveOperation(tr)) {
48
- emptyAttrs.moveNodeId = uuidv4();
49
- }
50
32
  for (let i = tr.steps.length - 1; i >= 0; i--) {
51
33
  const step = tr.steps[i];
52
34
  log.info('transaction step', step);
@@ -21,7 +21,6 @@ export var CHANGE_OPERATION;
21
21
  CHANGE_OPERATION["wrap_with_node"] = "wrap_with_node";
22
22
  CHANGE_OPERATION["node_split"] = "node_split";
23
23
  CHANGE_OPERATION["reference"] = "reference";
24
- CHANGE_OPERATION["move"] = "move";
25
24
  })(CHANGE_OPERATION || (CHANGE_OPERATION = {}));
26
25
  export var CHANGE_STATUS;
27
26
  (function (CHANGE_STATUS) {
@@ -9,8 +9,7 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import { ReplaceStep } from 'prosemirror-transform';
13
- import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
12
+ import { CHANGE_OPERATION } from '../types/change';
14
13
  export function createNewInsertAttrs(attrs) {
15
14
  return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.insert });
16
15
  }
@@ -26,9 +25,6 @@ export function createNewReferenceAttrs(attrs, id) {
26
25
  export function createNewDeleteAttrs(attrs) {
27
26
  return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.delete });
28
27
  }
29
- export function createNewMoveAttrs(attrs) {
30
- return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.move });
31
- }
32
28
  export function createNewUpdateAttrs(attrs, oldAttrs) {
33
29
  const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
34
30
  return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
@@ -74,45 +70,3 @@ export function stepIsLift(gap, node, to) {
74
70
  return gap.start < gap.end && gap.insert === 0 && gap.end === to && !node.isText;
75
71
  }
76
72
  export const trFromHistory = (tr) => Object.keys(tr.meta).find((s) => s.startsWith('history$'));
77
- export const isNodeMoveOperation = (tr) => {
78
- if (tr.steps.length < 2) {
79
- return false;
80
- }
81
- if (!tr.steps.every((step) => step instanceof ReplaceStep)) {
82
- return false;
83
- }
84
- const deletedHashes = new Set();
85
- const insertedHashes = new Set();
86
- for (let i = 0; i < tr.steps.length; i++) {
87
- const step = tr.steps[i];
88
- const doc = tr.docs[i];
89
- const content = step.slice.size === 0 ? doc.slice(step.from, step.to) : step.slice;
90
- if (step.from !== step.to && step.slice.size === 0) {
91
- if (content.content.firstChild) {
92
- deletedHashes.add(content.content.firstChild.toString());
93
- }
94
- }
95
- else if (step.slice.size > 0) {
96
- if (content.content.firstChild) {
97
- insertedHashes.add(content.content.firstChild.toString());
98
- }
99
- }
100
- }
101
- if (deletedHashes.size !== insertedHashes.size) {
102
- return false;
103
- }
104
- for (const hash of insertedHashes) {
105
- if (!deletedHashes.has(hash)) {
106
- return false;
107
- }
108
- }
109
- return true;
110
- };
111
- export const isDeletingPendingMovedNode = (step, doc) => {
112
- var _a;
113
- if (step.from === step.to || step.slice.content.size > 0) {
114
- return false;
115
- }
116
- const node = doc.nodeAt(step.from);
117
- return !!((_a = node === null || node === void 0 ? void 0 : node.attrs.dataTracked) === null || _a === void 0 ? void 0 : _a.find((tracked) => tracked.operation === CHANGE_OPERATION.move && tracked.status === CHANGE_STATUS.pending));
118
- };
@@ -3,5 +3,4 @@ import { Transaction } from 'prosemirror-state';
3
3
  import { NewEmptyAttrs, NewInsertAttrs } from '../types/track';
4
4
  export declare function setFragmentAsInserted(inserted: Fragment, insertAttrs: NewInsertAttrs, schema: Schema): Fragment;
5
5
  export declare function setFragmentAsWrapChange(inserted: Fragment, attrs: NewEmptyAttrs, schema: Schema): Fragment;
6
- export declare function setFragmentAsMoveChange(fragment: Fragment, attrs: NewEmptyAttrs): Fragment;
7
6
  export declare function setFragmentAsNodeSplit($pos: ResolvedPos, newTr: Transaction, inserted: Fragment, attrs: NewEmptyAttrs): Fragment;
@@ -1,3 +1,2 @@
1
1
  import { EditorState, Transaction } from 'prosemirror-state';
2
- import { ChangeSet } from '../ChangeSet';
3
- export declare function trackTransaction(tr: Transaction, oldState: EditorState, newTr: Transaction, authorID: string, changeSet: ChangeSet): Transaction;
2
+ export declare function trackTransaction(tr: Transaction, oldState: EditorState, newTr: Transaction, authorID: string): Transaction;
@@ -20,8 +20,7 @@ export declare enum CHANGE_OPERATION {
20
20
  set_node_attributes = "set_attrs",
21
21
  wrap_with_node = "wrap_with_node",
22
22
  node_split = "node_split",
23
- reference = "reference",
24
- move = "move"
23
+ reference = "reference"
25
24
  }
26
25
  export declare enum CHANGE_STATUS {
27
26
  accepted = "accepted",
@@ -37,7 +36,6 @@ type InsertDeleteAttrs = {
37
36
  statusUpdateAt: number;
38
37
  createdAt: number;
39
38
  updatedAt: number;
40
- moveNodeId?: string;
41
39
  };
42
40
  export type UpdateAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
43
41
  operation: CHANGE_OPERATION.set_node_attributes;
@@ -53,10 +51,7 @@ export type ReferenceAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
53
51
  operation: CHANGE_OPERATION.reference;
54
52
  referenceId: string;
55
53
  };
56
- export type NodeMoveAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
57
- operation: CHANGE_OPERATION.move;
58
- };
59
- export type TrackedAttrs = InsertDeleteAttrs | UpdateAttrs | WrapAttrs | NodeSplitAttrs | ReferenceAttrs | NodeMoveAttrs;
54
+ export type TrackedAttrs = InsertDeleteAttrs | UpdateAttrs | WrapAttrs | NodeSplitAttrs | ReferenceAttrs;
60
55
  type Change = {
61
56
  id: string;
62
57
  from: number;
@@ -16,7 +16,7 @@ export interface TrackChangesState {
16
16
  }
17
17
  export type NewEmptyAttrs = Omit<TrackedAttrs, 'id' | 'operation'>;
18
18
  export type NewInsertAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
19
- operation: CHANGE_OPERATION.insert | CHANGE_OPERATION.wrap_with_node | CHANGE_OPERATION.move;
19
+ operation: CHANGE_OPERATION.insert | CHANGE_OPERATION.wrap_with_node;
20
20
  };
21
21
  export type NewDeleteAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
22
22
  operation: CHANGE_OPERATION.delete;
@@ -7,7 +7,6 @@ export declare function createNewWrapAttrs(attrs: NewEmptyAttrs): NewInsertAttrs
7
7
  export declare function createNewSplitAttrs(attrs: NewEmptyAttrs): NewSplitNodeAttrs;
8
8
  export declare function createNewReferenceAttrs(attrs: NewEmptyAttrs, id: string): NewReferenceAttrs;
9
9
  export declare function createNewDeleteAttrs(attrs: NewEmptyAttrs): NewDeleteAttrs;
10
- export declare function createNewMoveAttrs(attrs: NewEmptyAttrs): NewInsertAttrs;
11
10
  export declare function createNewUpdateAttrs(attrs: NewEmptyAttrs, oldAttrs: Record<string, any>): NewUpdateAttrs;
12
11
  export declare const isSplitStep: (step: ReplaceStep, selection: Selection, uiEvent: string) => boolean;
13
12
  export declare const isWrapStep: (step: ReplaceAroundStep) => boolean;
@@ -19,5 +18,3 @@ export declare function stepIsLift(gap: {
19
18
  insert: number;
20
19
  }, node: PMNode, to: number): boolean;
21
20
  export declare const trFromHistory: (tr: Transaction) => string | undefined;
22
- export declare const isNodeMoveOperation: (tr: Transaction) => boolean;
23
- export declare const isDeletingPendingMovedNode: (step: ReplaceStep, doc: PMNode) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manuscripts/track-changes-plugin",
3
- "version": "1.10.5-LEAN-4160.5",
3
+ "version": "1.10.7",
4
4
  "author": "Atypon Systems LLC",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/Atypon-OpenSource/manuscripts-track-changes-plugin",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "devDependencies": {
28
28
  "@manuscripts/eslint-config": "^0.5.1",
29
- "@manuscripts/transform": "3.0.45",
29
+ "@manuscripts/transform": "3.0.48",
30
30
  "@types/debug": "^4.1.7",
31
31
  "@types/jest": "27.5.1",
32
32
  "@types/node": "^18.7.18",