@manuscripts/track-changes-plugin 2.0.9 → 2.0.11

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 (46) hide show
  1. package/dist/cjs/actions.js +6 -5
  2. package/dist/cjs/change-steps/diffChangeSteps.js +1 -2
  3. package/dist/cjs/change-steps/matchInserted.js +1 -2
  4. package/dist/cjs/change-steps/processChangeSteps.js +22 -10
  5. package/dist/cjs/changes/applyChanges.js +53 -12
  6. package/dist/cjs/changes/findChanges.js +1 -2
  7. package/dist/cjs/changes/fixInconsistentChanges.js +1 -2
  8. package/dist/cjs/changes/revertChange.js +2 -3
  9. package/dist/cjs/changes/updateChangeAttrs.js +9 -3
  10. package/dist/cjs/changes/updateChangesStatus.js +1 -2
  11. package/dist/cjs/compute/nodeHelpers.js +7 -8
  12. package/dist/cjs/compute/setFragmentAsInserted.js +23 -14
  13. package/dist/cjs/compute/splitSliceIntoMergedParts.js +1 -2
  14. package/dist/cjs/index.js +20 -8
  15. package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +18 -9
  16. package/dist/cjs/mutate/deleteNode.js +4 -4
  17. package/dist/cjs/mutate/deleteText.js +1 -2
  18. package/dist/cjs/mutate/mergeNode.js +1 -2
  19. package/dist/cjs/mutate/mergeTrackedMarks.js +1 -2
  20. package/dist/cjs/steps/trackReplaceAroundStep.js +18 -9
  21. package/dist/cjs/steps/trackReplaceStep.js +25 -14
  22. package/dist/cjs/steps/trackTransaction.js +17 -7
  23. package/dist/cjs/types/change.js +2 -2
  24. package/dist/cjs/types/track.js +1 -1
  25. package/dist/cjs/utils/mapChangeStep.js +1 -2
  26. package/dist/cjs/utils/track-utils.js +11 -11
  27. package/dist/cjs/utils/uuidv4.js +1 -2
  28. package/dist/es/actions.js +1 -0
  29. package/dist/es/change-steps/processChangeSteps.js +4 -1
  30. package/dist/es/changes/applyChanges.js +52 -10
  31. package/dist/es/changes/updateChangeAttrs.js +6 -0
  32. package/dist/es/compute/setFragmentAsInserted.js +2 -2
  33. package/dist/es/index.js +1 -1
  34. package/dist/es/mutate/deleteNode.js +2 -1
  35. package/dist/es/steps/trackReplaceStep.js +7 -5
  36. package/dist/es/steps/trackTransaction.js +16 -5
  37. package/dist/es/utils/track-utils.js +2 -2
  38. package/dist/types/ChangeSet.d.ts +4 -4
  39. package/dist/types/actions.d.ts +5 -1
  40. package/dist/types/changes/updateChangeAttrs.d.ts +1 -0
  41. package/dist/types/compute/setFragmentAsInserted.d.ts +2 -2
  42. package/dist/types/index.d.ts +1 -1
  43. package/dist/types/types/change.d.ts +1 -0
  44. package/dist/types/types/track.d.ts +6 -2
  45. package/dist/types/utils/track-utils.d.ts +2 -2
  46. package/package.json +8 -8
@@ -15,15 +15,25 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.trackReplaceAroundStep = void 0;
36
+ exports.trackReplaceAroundStep = trackReplaceAroundStep;
27
37
  const prosemirror_model_1 = require("prosemirror-model");
28
38
  const actions_1 = require("../actions");
29
39
  const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
@@ -121,4 +131,3 @@ function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, currentStepDoc
121
131
  }
122
132
  return steps;
123
133
  }
124
- exports.trackReplaceAroundStep = trackReplaceAroundStep;
@@ -15,16 +15,27 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.trackReplaceStep = void 0;
36
+ exports.trackReplaceStep = trackReplaceStep;
27
37
  const prosemirror_model_1 = require("prosemirror-model");
38
+ const actions_1 = require("../actions");
28
39
  const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
29
40
  const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
30
41
  const logger_1 = require("../utils/logger");
@@ -40,7 +51,7 @@ function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResult, curr
40
51
  attrs.moveNodeId = moveID;
41
52
  }
42
53
  step.getMap().forEach((fromA, toA, fromB, toB) => {
43
- var _a, _b, _c;
54
+ var _a, _b, _c, _d;
44
55
  logger_1.log.info(`changed ranges: ${fromA} ${toA} ${fromB} ${toB}`);
45
56
  const { slice } = step;
46
57
  logger_1.log.info('TR: steps before applying delete', [...newTr.steps]);
@@ -71,12 +82,13 @@ function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResult, curr
71
82
  fragment = (0, setFragmentAsInserted_1.setFragmentAsNodeSplit)(newTr.doc.resolve(step.from), newTr, fragment, attrs);
72
83
  }
73
84
  if (moveID) {
74
- fragment = (0, setFragmentAsInserted_1.setFragmentAsMoveChange)(newSliceContent, trackUtils.createNewMoveAttrs(attrs));
85
+ const indentationType = (_a = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.indentationAction)) === null || _a === void 0 ? void 0 : _a.action;
86
+ fragment = (0, setFragmentAsInserted_1.setFragmentAsMoveChange)(newSliceContent, trackUtils.createNewMoveAttrs(attrs, indentationType));
75
87
  }
76
88
  const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
77
89
  const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
78
90
  const textWasDeleted = !!changeSteps.length && !(fromA === fromB);
79
- const isBlock = !!((_a = fragment.firstChild) === null || _a === void 0 ? void 0 : _a.isBlock);
91
+ const isBlock = !!((_b = fragment.firstChild) === null || _b === void 0 ? void 0 : _b.isBlock);
80
92
  changeSteps.push({
81
93
  type: 'insert-slice',
82
94
  from: textWasDeleted ? fromB : isBlock ? toA : fromA,
@@ -86,11 +98,10 @@ function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResult, curr
86
98
  });
87
99
  }
88
100
  else {
89
- const isDeleteEvent = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.code) === 'Delete';
90
- const isDeleteContentForward = ((_c = window.event) === null || _c === void 0 ? void 0 : _c.inputType) === 'deleteContentForward';
101
+ const isDeleteEvent = ((_c = window.event) === null || _c === void 0 ? void 0 : _c.code) === 'Delete';
102
+ const isDeleteContentForward = ((_d = window.event) === null || _d === void 0 ? void 0 : _d.inputType) === 'deleteContentForward';
91
103
  selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
92
104
  }
93
105
  });
94
106
  return [changeSteps, selectionPos];
95
107
  }
96
- exports.trackReplaceStep = trackReplaceStep;
@@ -3,9 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.trackTransaction = void 0;
6
+ exports.trackTransaction = trackTransaction;
7
7
  const prosemirror_state_1 = require("prosemirror-state");
8
8
  const prosemirror_transform_1 = require("prosemirror-transform");
9
+ const actions_1 = require("../actions");
9
10
  const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
10
11
  const processChangeSteps_1 = require("../change-steps/processChangeSteps");
11
12
  const updateChangeAttrs_1 = require("../changes/updateChangeAttrs");
@@ -21,7 +22,7 @@ const trackReplaceStep_1 = require("./trackReplaceStep");
21
22
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
22
23
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
23
24
  function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
24
- var _a, _b, _c, _d, _e;
25
+ var _a, _b, _c, _d, _e, _f;
25
26
  const emptyAttrs = {
26
27
  authorID,
27
28
  reviewedByID: null,
@@ -30,13 +31,23 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
30
31
  statusUpdateAt: 0,
31
32
  status: change_1.CHANGE_STATUS.pending,
32
33
  };
34
+ const action = (_a = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.indentationAction)) === null || _a === void 0 ? void 0 : _a.action;
35
+ const isIndentation = action === 'indent' || action === 'unindent';
33
36
  const wasNodeSelection = tr.selection instanceof prosemirror_state_1.NodeSelection;
34
37
  const setsNewSelection = tr.selectionSet;
35
38
  const deletedNodeMapping = new prosemirror_transform_1.Mapping();
36
39
  let iters = 0;
37
40
  logger_1.log.info('ORIGINAL transaction', tr);
38
41
  let trContext = {};
39
- const movingStepsAssociated = (0, track_utils_1.HasMoveOperations)(tr);
42
+ let movingStepsAssociated = (0, track_utils_1.HasMoveOperations)(tr);
43
+ if (isIndentation) {
44
+ const moveId = (0, uuidv4_1.uuidv4)();
45
+ tr.steps.forEach((step) => {
46
+ if (step instanceof prosemirror_transform_1.ReplaceStep) {
47
+ movingStepsAssociated.set(step, moveId);
48
+ }
49
+ });
50
+ }
40
51
  (0, track_utils_1.handleDirectPendingMoveDeletions)(tr, newTr, movingStepsAssociated);
41
52
  const cleanSteps = (0, track_utils_1.filterMeaninglessMoveSteps)(tr, movingStepsAssociated);
42
53
  for (let i = cleanSteps.length - 1; i >= 0; i--) {
@@ -57,7 +68,7 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
57
68
  }
58
69
  else if (step instanceof prosemirror_transform_1.ReplaceStep) {
59
70
  const { slice } = step;
60
- 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])) {
71
+ if (((_c = (_b = slice === null || slice === void 0 ? void 0 : slice.content) === null || _b === void 0 ? void 0 : _b.content) === null || _c === void 0 ? void 0 : _c.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
61
72
  continue;
62
73
  }
63
74
  const invertedStep = step.invert(tr.docs[i]);
@@ -71,7 +82,7 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
71
82
  let [steps, startPos] = (0, trackReplaceStep_1.trackReplaceStep)(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr, movingStepsAssociated.get(step));
72
83
  if (steps.length === 1) {
73
84
  const step = steps[0];
74
- if (isHighlightMarkerNode((step === null || step === void 0 ? void 0 : step.node) || ((_d = (_c = step === null || step === void 0 ? void 0 : step.slice) === null || _c === void 0 ? void 0 : _c.content) === null || _d === void 0 ? void 0 : _d.content[0]))) {
85
+ if (isHighlightMarkerNode((step === null || step === void 0 ? void 0 : step.node) || ((_e = (_d = step === null || step === void 0 ? void 0 : step.slice) === null || _d === void 0 ? void 0 : _d.content) === null || _e === void 0 ? void 0 : _e.content[0]))) {
75
86
  continue;
76
87
  }
77
88
  }
@@ -104,7 +115,7 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
104
115
  const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
105
116
  }
106
117
  else if (step instanceof prosemirror_transform_1.AddMarkStep) {
107
- const dataTracked = (_e = (0, nodeHelpers_1.getNodeTrackedData)(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _e === void 0 ? void 0 : _e.pop();
118
+ const dataTracked = (_f = (0, nodeHelpers_1.getNodeTrackedData)(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _f === void 0 ? void 0 : _f.pop();
108
119
  if (dataTracked) {
109
120
  (0, updateChangeAttrs_1.updateChangeAttrs)(newTr, { id: dataTracked.id, from: step.from, to: step.to, type: 'text-change', dataTracked }, Object.assign(Object.assign({}, dataTracked), { id: (0, uuidv4_1.uuidv4)() }), oldState.schema);
110
121
  }
@@ -125,4 +136,3 @@ function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
125
136
  logger_1.log.info('NEW transaction', newTr);
126
137
  return newTr;
127
138
  }
128
- exports.trackTransaction = trackTransaction;
@@ -25,10 +25,10 @@ var CHANGE_OPERATION;
25
25
  CHANGE_OPERATION["node_split"] = "node_split";
26
26
  CHANGE_OPERATION["reference"] = "reference";
27
27
  CHANGE_OPERATION["move"] = "move";
28
- })(CHANGE_OPERATION = exports.CHANGE_OPERATION || (exports.CHANGE_OPERATION = {}));
28
+ })(CHANGE_OPERATION || (exports.CHANGE_OPERATION = CHANGE_OPERATION = {}));
29
29
  var CHANGE_STATUS;
30
30
  (function (CHANGE_STATUS) {
31
31
  CHANGE_STATUS["accepted"] = "accepted";
32
32
  CHANGE_STATUS["rejected"] = "rejected";
33
33
  CHANGE_STATUS["pending"] = "pending";
34
- })(CHANGE_STATUS = exports.CHANGE_STATUS || (exports.CHANGE_STATUS = {}));
34
+ })(CHANGE_STATUS || (exports.CHANGE_STATUS = CHANGE_STATUS = {}));
@@ -6,4 +6,4 @@ var TrackChangesStatus;
6
6
  TrackChangesStatus["enabled"] = "enabled";
7
7
  TrackChangesStatus["viewSnapshots"] = "view-snapshots";
8
8
  TrackChangesStatus["disabled"] = "disabled";
9
- })(TrackChangesStatus = exports.TrackChangesStatus || (exports.TrackChangesStatus = {}));
9
+ })(TrackChangesStatus || (exports.TrackChangesStatus = TrackChangesStatus = {}));
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.mapChangeSteps = void 0;
18
+ exports.mapChangeSteps = mapChangeSteps;
19
19
  function mapChangeSteps(steps, mapping) {
20
20
  steps.forEach((step) => {
21
21
  if ('from' in step) {
@@ -36,4 +36,3 @@ function mapChangeSteps(steps, mapping) {
36
36
  });
37
37
  return steps;
38
38
  }
39
- exports.mapChangeSteps = mapChangeSteps;
@@ -11,39 +11,40 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.filterMeaninglessMoveSteps = exports.handleDirectPendingMoveDeletions = exports.isDirectPendingMoveDeletion = exports.isDeletingPendingMovedNode = exports.isPendingChange = exports.HasMoveOperations = 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;
14
+ exports.filterMeaninglessMoveSteps = exports.handleDirectPendingMoveDeletions = exports.isDirectPendingMoveDeletion = exports.isDeletingPendingMovedNode = exports.isPendingChange = exports.HasMoveOperations = exports.trFromHistory = exports.isLiftStep = exports.isWrapStep = exports.isSplitStep = void 0;
15
+ exports.createNewInsertAttrs = createNewInsertAttrs;
16
+ exports.createNewWrapAttrs = createNewWrapAttrs;
17
+ exports.createNewSplitAttrs = createNewSplitAttrs;
18
+ exports.createNewReferenceAttrs = createNewReferenceAttrs;
19
+ exports.createNewDeleteAttrs = createNewDeleteAttrs;
20
+ exports.createNewMoveAttrs = createNewMoveAttrs;
21
+ exports.createNewUpdateAttrs = createNewUpdateAttrs;
22
+ exports.stepIsLift = stepIsLift;
15
23
  const prosemirror_transform_1 = require("prosemirror-transform");
16
24
  const change_1 = require("../types/change");
17
25
  const uuidv4_1 = require("./uuidv4");
18
26
  function createNewInsertAttrs(attrs) {
19
27
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
20
28
  }
21
- exports.createNewInsertAttrs = createNewInsertAttrs;
22
29
  function createNewWrapAttrs(attrs) {
23
30
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.wrap_with_node });
24
31
  }
25
- exports.createNewWrapAttrs = createNewWrapAttrs;
26
32
  function createNewSplitAttrs(attrs) {
27
33
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.node_split });
28
34
  }
29
- exports.createNewSplitAttrs = createNewSplitAttrs;
30
35
  function createNewReferenceAttrs(attrs, id) {
31
36
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.reference, referenceId: id });
32
37
  }
33
- exports.createNewReferenceAttrs = createNewReferenceAttrs;
34
38
  function createNewDeleteAttrs(attrs) {
35
39
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
36
40
  }
37
- exports.createNewDeleteAttrs = createNewDeleteAttrs;
38
- function createNewMoveAttrs(attrs) {
39
- return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.move });
41
+ function createNewMoveAttrs(attrs, indentationType) {
42
+ return Object.assign(Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.move }), (indentationType && { indentationType }));
40
43
  }
41
- exports.createNewMoveAttrs = createNewMoveAttrs;
42
44
  function createNewUpdateAttrs(attrs, oldAttrs) {
43
45
  const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
44
46
  return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
45
47
  }
46
- exports.createNewUpdateAttrs = createNewUpdateAttrs;
47
48
  const isSplitStep = (step, selection, uiEvent) => {
48
49
  var _a, _b, _c, _d;
49
50
  const { from, to, slice } = step;
@@ -88,7 +89,6 @@ exports.isLiftStep = isLiftStep;
88
89
  function stepIsLift(gap, node, to) {
89
90
  return gap.start < gap.end && gap.insert === 0 && gap.end === to && !node.isText;
90
91
  }
91
- exports.stepIsLift = stepIsLift;
92
92
  const trFromHistory = (tr) => Object.keys(tr.meta).find((s) => s.startsWith('history$'));
93
93
  exports.trFromHistory = trFromHistory;
94
94
  const HasMoveOperations = (tr) => {
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uuidv4 = void 0;
3
+ exports.uuidv4 = uuidv4;
4
4
  function uuidv4() {
5
5
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
6
6
  const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
7
7
  return v.toString(16);
8
8
  });
9
9
  }
10
- exports.uuidv4 = uuidv4;
@@ -6,6 +6,7 @@ export var TrackChangesAction;
6
6
  TrackChangesAction["setChangeStatuses"] = "track-changes-set-change-statuses";
7
7
  TrackChangesAction["refreshChanges"] = "track-changes-refresh-changes";
8
8
  TrackChangesAction["updateMetaNode"] = "track-changes-update-meta-node";
9
+ TrackChangesAction["indentationAction"] = "track-changes-indentation-action";
9
10
  })(TrackChangesAction || (TrackChangesAction = {}));
10
11
  export function hasAction(tr) {
11
12
  return Object.values(TrackChangesAction).some((action) => !!tr.getMeta(action));
@@ -46,7 +46,10 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema,
46
46
  }
47
47
  const nodeAtMappedPos = newTr.doc.nodeAt(mapping.map(c.pos));
48
48
  const nodeWasAlreadyDeleted = !nodeAtMappedPos || nodeAtMappedPos !== c.node;
49
- if ((isInserted && deletesCounter > 1) || (childOfDeleted && prevDeletedNodeInserted) || nodeWasAlreadyDeleted) {
49
+ const isMoveOperation = !!emptyAttrs.moveNodeId;
50
+ if ((isInserted && deletesCounter > 1 && !isMoveOperation) ||
51
+ (childOfDeleted && prevDeletedNodeInserted) ||
52
+ nodeWasAlreadyDeleted) {
50
53
  return false;
51
54
  }
52
55
  deleteOrSetNodeDeleted(c.node, mapping.map(c.pos), newTr, deleteAttrs);
@@ -5,7 +5,22 @@ import { mergeNode } from '../mutate/mergeNode';
5
5
  import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
6
6
  import { log } from '../utils/logger';
7
7
  import { revertSplitNodeChange, revertWrapNodeChange } from './revertChange';
8
- import { updateChangeChildrenAttributes } from './updateChangeAttrs';
8
+ import { restoreNode, updateChangeChildrenAttributes } from './updateChangeAttrs';
9
+ function collectMoveNodeIds(containerNode, primaryMoveNodeId) {
10
+ const moveNodeIds = new Set();
11
+ moveNodeIds.add(primaryMoveNodeId);
12
+ containerNode.descendants((childNode) => {
13
+ const dataTracked = childNode.attrs.dataTracked;
14
+ if (Array.isArray(dataTracked)) {
15
+ dataTracked.forEach((trackingData) => {
16
+ if (trackingData.moveNodeId) {
17
+ moveNodeIds.add(trackingData.moveNodeId);
18
+ }
19
+ });
20
+ }
21
+ });
22
+ return moveNodeIds;
23
+ }
9
24
  export function getUpdatedDataTracked(dataTracked, changeId) {
10
25
  if (!dataTracked) {
11
26
  return null;
@@ -25,6 +40,9 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, del
25
40
  if (change.dataTracked.operation === CHANGE_OPERATION.move) {
26
41
  return;
27
42
  }
43
+ if (change.dataTracked.operation === CHANGE_OPERATION.delete && change.dataTracked.moveNodeId) {
44
+ return;
45
+ }
28
46
  const { pos: from, deleted } = deleteMap.mapResult(change.from);
29
47
  const node = tr.doc.nodeAt(from);
30
48
  const noChangeNeeded = !ChangeSet.shouldDeleteChange(change);
@@ -90,25 +108,49 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, del
90
108
  return;
91
109
  }
92
110
  if (change.dataTracked.status === CHANGE_STATUS.accepted) {
93
- const originalChange = changeSet.changes.find((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
111
+ const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
112
+ tr.setNodeMarkup(from, undefined, attrs, node.marks);
113
+ const originalChanges = changeSet.changes.filter((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
94
114
  c.dataTracked.operation === CHANGE_OPERATION.delete);
95
- if (originalChange) {
96
- const { pos: originalFrom } = deleteMap.mapResult(originalChange.from);
115
+ if (originalChanges.length === 0) {
116
+ log.warn('No original change found for move operation', { change });
117
+ }
118
+ originalChanges.forEach((originalChange) => {
119
+ const { pos: originalFrom, deleted } = deleteMap.mapResult(originalChange.from);
120
+ if (deleted) {
121
+ return;
122
+ }
97
123
  const originalNode = tr.doc.nodeAt(originalFrom);
98
- const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
99
- tr.setNodeMarkup(from, undefined, attrs, node.marks);
100
124
  if (originalNode) {
101
125
  tr.delete(originalFrom, originalFrom + originalNode.nodeSize);
102
126
  deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
103
127
  }
104
- }
105
- else {
106
- log.warn('No original change found for move operation', { change });
107
- }
128
+ });
108
129
  }
109
130
  else if (change.dataTracked.status === CHANGE_STATUS.rejected) {
131
+ const moveNodeIdsToRestore = collectMoveNodeIds(node, change.dataTracked.moveNodeId);
110
132
  tr.delete(from, from + node.nodeSize);
111
133
  deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
134
+ changeSet.changes
135
+ .filter((c) => c.dataTracked.operation === CHANGE_OPERATION.delete &&
136
+ c.dataTracked.moveNodeId &&
137
+ moveNodeIdsToRestore.has(c.dataTracked.moveNodeId) &&
138
+ ChangeSet.isNodeChange(c))
139
+ .forEach((orig) => {
140
+ const { pos } = deleteMap.mapResult(orig.from);
141
+ const node = tr.doc.nodeAt(pos);
142
+ if (!node) {
143
+ return;
144
+ }
145
+ const dataTracked = node.attrs.dataTracked || [];
146
+ const hasMoved = dataTracked.some((d) => d.operation === CHANGE_OPERATION.move && d.status === CHANGE_STATUS.pending);
147
+ if (hasMoved) {
148
+ tr.delete(pos, pos + node.nodeSize);
149
+ deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
150
+ return;
151
+ }
152
+ restoreNode(tr, node, pos, schema);
153
+ });
112
154
  }
113
155
  });
114
156
  return deleteMap;
@@ -79,3 +79,9 @@ export function updateChangeChildrenAttributes(changes, tr, mapping) {
79
79
  }
80
80
  });
81
81
  }
82
+ export function restoreNode(tr, node, pos, schema) {
83
+ const updatedAttrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
84
+ tr.setNodeMarkup(pos, undefined, updatedAttrs, node.marks);
85
+ tr.removeMark(pos, pos + node.nodeSize, schema.marks.tracked_insert);
86
+ tr.removeMark(pos, pos + node.nodeSize, schema.marks.tracked_delete);
87
+ }
@@ -56,10 +56,10 @@ export function setFragmentAsWrapChange(inserted, attrs, schema) {
56
56
  });
57
57
  return Fragment.from(content);
58
58
  }
59
- export function setFragmentAsMoveChange(fragment, attrs) {
59
+ export function setFragmentAsMoveChange(fragment, moveAttrs) {
60
60
  const content = [];
61
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));
62
+ content.push(node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [addTrackIdIfDoesntExist(moveAttrs)] }), node.content, node.marks));
63
63
  });
64
64
  return Fragment.from(content);
65
65
  }
package/dist/es/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { trackChangesPluginKey, trackChangesPlugin } from './plugin';
2
- export { skipTracking } from './actions';
2
+ export { skipTracking, setAction, TrackChangesAction } from './actions';
3
3
  export * as trackCommands from './commands';
4
4
  export { enableDebug } from './utils/logger';
5
5
  export { ChangeSet } from './ChangeSet';
@@ -19,6 +19,7 @@ export function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
19
19
  const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => (d.operation === CHANGE_OPERATION.insert || d.operation === CHANGE_OPERATION.wrap_with_node) &&
20
20
  (d.status === CHANGE_STATUS.pending || d.status === CHANGE_STATUS.accepted));
21
21
  const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.set_node_attributes || d.operation === CHANGE_OPERATION.reference);
22
+ const moved = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.move && d.status === CHANGE_STATUS.pending);
22
23
  if (inserted) {
23
24
  return deleteNode(node, pos, newTr);
24
25
  }
@@ -31,5 +32,5 @@ export function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
31
32
  return;
32
33
  }
33
34
  const newDeleted = addTrackIdIfDoesntExist(deleteAttrs);
34
- newTr.setNodeMarkup(pos, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: updated ? [newDeleted, updated] : [newDeleted] }), node.marks);
35
+ newTr.setNodeMarkup(pos, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: updated ? [newDeleted, updated] : moved ? [newDeleted, moved] : [newDeleted] }), node.marks);
35
36
  }
@@ -1,4 +1,5 @@
1
1
  import { Slice } from 'prosemirror-model';
2
+ import { getAction, TrackChangesAction } from '../actions';
2
3
  import { setFragmentAsInserted, setFragmentAsMoveChange, setFragmentAsNodeSplit, } from '../compute/setFragmentAsInserted';
3
4
  import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
4
5
  import { log } from '../utils/logger';
@@ -14,7 +15,7 @@ export function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResul
14
15
  attrs.moveNodeId = moveID;
15
16
  }
16
17
  step.getMap().forEach((fromA, toA, fromB, toB) => {
17
- var _a, _b, _c;
18
+ var _a, _b, _c, _d;
18
19
  log.info(`changed ranges: ${fromA} ${toA} ${fromB} ${toB}`);
19
20
  const { slice } = step;
20
21
  log.info('TR: steps before applying delete', [...newTr.steps]);
@@ -45,12 +46,13 @@ export function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResul
45
46
  fragment = setFragmentAsNodeSplit(newTr.doc.resolve(step.from), newTr, fragment, attrs);
46
47
  }
47
48
  if (moveID) {
48
- fragment = setFragmentAsMoveChange(newSliceContent, trackUtils.createNewMoveAttrs(attrs));
49
+ const indentationType = (_a = getAction(tr, TrackChangesAction.indentationAction)) === null || _a === void 0 ? void 0 : _a.action;
50
+ fragment = setFragmentAsMoveChange(newSliceContent, trackUtils.createNewMoveAttrs(attrs, indentationType));
49
51
  }
50
52
  const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
51
53
  const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
52
54
  const textWasDeleted = !!changeSteps.length && !(fromA === fromB);
53
- const isBlock = !!((_a = fragment.firstChild) === null || _a === void 0 ? void 0 : _a.isBlock);
55
+ const isBlock = !!((_b = fragment.firstChild) === null || _b === void 0 ? void 0 : _b.isBlock);
54
56
  changeSteps.push({
55
57
  type: 'insert-slice',
56
58
  from: textWasDeleted ? fromB : isBlock ? toA : fromA,
@@ -60,8 +62,8 @@ export function trackReplaceStep(step, oldState, newTr, attrsTemplate, stepResul
60
62
  });
61
63
  }
62
64
  else {
63
- const isDeleteEvent = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.code) === 'Delete';
64
- const isDeleteContentForward = ((_c = window.event) === null || _c === void 0 ? void 0 : _c.inputType) === 'deleteContentForward';
65
+ const isDeleteEvent = ((_c = window.event) === null || _c === void 0 ? void 0 : _c.code) === 'Delete';
66
+ const isDeleteContentForward = ((_d = window.event) === null || _d === void 0 ? void 0 : _d.inputType) === 'deleteContentForward';
65
67
  selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
66
68
  }
67
69
  });
@@ -1,5 +1,6 @@
1
1
  import { NodeSelection as NodeSelectionClass, TextSelection, } from 'prosemirror-state';
2
2
  import { AddMarkStep, AttrStep, Mapping, ReplaceAroundStep, ReplaceStep, } from 'prosemirror-transform';
3
+ import { getAction, TrackChangesAction } from '../actions';
3
4
  import { diffChangeSteps } from '../change-steps/diffChangeSteps';
4
5
  import { processChangeSteps } from '../change-steps/processChangeSteps';
5
6
  import { updateChangeAttrs } from '../changes/updateChangeAttrs';
@@ -15,7 +16,7 @@ import { trackReplaceStep } from './trackReplaceStep';
15
16
  const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
16
17
  const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
17
18
  export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
18
- var _a, _b, _c, _d, _e;
19
+ var _a, _b, _c, _d, _e, _f;
19
20
  const emptyAttrs = {
20
21
  authorID,
21
22
  reviewedByID: null,
@@ -24,13 +25,23 @@ export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
24
25
  statusUpdateAt: 0,
25
26
  status: CHANGE_STATUS.pending,
26
27
  };
28
+ const action = (_a = getAction(tr, TrackChangesAction.indentationAction)) === null || _a === void 0 ? void 0 : _a.action;
29
+ const isIndentation = action === 'indent' || action === 'unindent';
27
30
  const wasNodeSelection = tr.selection instanceof NodeSelectionClass;
28
31
  const setsNewSelection = tr.selectionSet;
29
32
  const deletedNodeMapping = new Mapping();
30
33
  let iters = 0;
31
34
  log.info('ORIGINAL transaction', tr);
32
35
  let trContext = {};
33
- const movingStepsAssociated = HasMoveOperations(tr);
36
+ let movingStepsAssociated = HasMoveOperations(tr);
37
+ if (isIndentation) {
38
+ const moveId = uuidv4();
39
+ tr.steps.forEach((step) => {
40
+ if (step instanceof ReplaceStep) {
41
+ movingStepsAssociated.set(step, moveId);
42
+ }
43
+ });
44
+ }
34
45
  handleDirectPendingMoveDeletions(tr, newTr, movingStepsAssociated);
35
46
  const cleanSteps = filterMeaninglessMoveSteps(tr, movingStepsAssociated);
36
47
  for (let i = cleanSteps.length - 1; i >= 0; i--) {
@@ -51,7 +62,7 @@ export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
51
62
  }
52
63
  else if (step instanceof ReplaceStep) {
53
64
  const { slice } = step;
54
- 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])) {
65
+ if (((_c = (_b = slice === null || slice === void 0 ? void 0 : slice.content) === null || _b === void 0 ? void 0 : _b.content) === null || _c === void 0 ? void 0 : _c.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
55
66
  continue;
56
67
  }
57
68
  const invertedStep = step.invert(tr.docs[i]);
@@ -65,7 +76,7 @@ export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
65
76
  let [steps, startPos] = trackReplaceStep(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr, movingStepsAssociated.get(step));
66
77
  if (steps.length === 1) {
67
78
  const step = steps[0];
68
- if (isHighlightMarkerNode((step === null || step === void 0 ? void 0 : step.node) || ((_d = (_c = step === null || step === void 0 ? void 0 : step.slice) === null || _c === void 0 ? void 0 : _c.content) === null || _d === void 0 ? void 0 : _d.content[0]))) {
79
+ if (isHighlightMarkerNode((step === null || step === void 0 ? void 0 : step.node) || ((_e = (_d = step === null || step === void 0 ? void 0 : step.slice) === null || _d === void 0 ? void 0 : _d.content) === null || _e === void 0 ? void 0 : _e.content[0]))) {
69
80
  continue;
70
81
  }
71
82
  }
@@ -98,7 +109,7 @@ export function trackTransaction(tr, oldState, newTr, authorID, changeSet) {
98
109
  const [mapping, selectionPos] = processChangeSteps(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
99
110
  }
100
111
  else if (step instanceof AddMarkStep) {
101
- const dataTracked = (_e = getNodeTrackedData(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _e === void 0 ? void 0 : _e.pop();
112
+ const dataTracked = (_f = getNodeTrackedData(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _f === void 0 ? void 0 : _f.pop();
102
113
  if (dataTracked) {
103
114
  updateChangeAttrs(newTr, { id: dataTracked.id, from: step.from, to: step.to, type: 'text-change', dataTracked }, Object.assign(Object.assign({}, dataTracked), { id: uuidv4() }), oldState.schema);
104
115
  }
@@ -27,8 +27,8 @@ export function createNewReferenceAttrs(attrs, id) {
27
27
  export function createNewDeleteAttrs(attrs) {
28
28
  return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.delete });
29
29
  }
30
- export function createNewMoveAttrs(attrs) {
31
- return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.move });
30
+ export function createNewMoveAttrs(attrs, indentationType) {
31
+ return Object.assign(Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.move }), (indentationType && { indentationType }));
32
32
  }
33
33
  export function createNewUpdateAttrs(attrs, oldAttrs) {
34
34
  const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
@@ -7,10 +7,10 @@ export declare class ChangeSet {
7
7
  get changeTree(): TrackedChange[];
8
8
  get groupChanges(): TrackedChange[][];
9
9
  get pending(): TrackedChange[];
10
- get textChanges(): TrackedChange[];
11
- get nodeChanges(): TrackedChange[];
12
- get nodeAttrChanges(): TrackedChange[];
13
- get bothNodeChanges(): TrackedChange[];
10
+ get textChanges(): TextChange[];
11
+ get nodeChanges(): NodeChange[];
12
+ get nodeAttrChanges(): NodeAttrChange[];
13
+ get bothNodeChanges(): (NodeChange | NodeAttrChange | ReferenceChange)[];
14
14
  get isEmpty(): boolean;
15
15
  get hasInconsistentData(): boolean;
16
16
  get hasDuplicateIds(): boolean;
@@ -7,7 +7,8 @@ export declare enum TrackChangesAction {
7
7
  setPluginStatus = "track-changes-set-track-status",
8
8
  setChangeStatuses = "track-changes-set-change-statuses",
9
9
  refreshChanges = "track-changes-refresh-changes",
10
- updateMetaNode = "track-changes-update-meta-node"
10
+ updateMetaNode = "track-changes-update-meta-node",
11
+ indentationAction = "track-changes-indentation-action"
11
12
  }
12
13
  export type TrackChangesActionParams = {
13
14
  [TrackChangesAction.skipTrack]: boolean;
@@ -19,6 +20,9 @@ export type TrackChangesActionParams = {
19
20
  };
20
21
  [TrackChangesAction.refreshChanges]: boolean;
21
22
  [TrackChangesAction.updateMetaNode]: boolean;
23
+ [TrackChangesAction.indentationAction]: {
24
+ action: 'indent' | 'unindent';
25
+ };
22
26
  };
23
27
  export declare function hasAction(tr: Transaction): boolean;
24
28
  export declare function getAction<K extends keyof TrackChangesActionParams>(tr: Transaction, action: K): TrackChangesActionParams[K] | undefined;
@@ -4,3 +4,4 @@ import { Mapping } from 'prosemirror-transform';
4
4
  import { IncompleteChange, TrackedAttrs, TrackedChange } from '../types/change';
5
5
  export declare function updateChangeAttrs(tr: Transaction, change: IncompleteChange, trackedAttrs: Partial<TrackedAttrs>, schema: Schema): Transaction;
6
6
  export declare function updateChangeChildrenAttributes(changes: TrackedChange[], tr: Transaction, mapping: Mapping): void;
7
+ export declare function restoreNode(tr: Transaction, node: any, pos: number, schema: Schema): void;