@manuscripts/track-changes-plugin 1.10.5-LEAN-4160.6 → 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.
- package/dist/cjs/ChangeSet.js +8 -5
- package/dist/cjs/changes/applyChanges.js +8 -45
- package/dist/cjs/changes/updateChangesStatus.js +1 -19
- package/dist/cjs/compute/setFragmentAsInserted.js +1 -9
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/steps/trackReplaceStep.js +1 -3
- package/dist/cjs/steps/trackTransaction.js +1 -19
- package/dist/cjs/types/change.js +0 -1
- package/dist/cjs/utils/track-utils.js +1 -50
- package/dist/es/ChangeSet.js +8 -5
- package/dist/es/changes/applyChanges.js +8 -45
- package/dist/es/changes/updateChangesStatus.js +1 -19
- package/dist/es/compute/setFragmentAsInserted.js +0 -7
- package/dist/es/plugin.js +1 -1
- package/dist/es/steps/trackReplaceStep.js +2 -4
- package/dist/es/steps/trackTransaction.js +2 -20
- package/dist/es/types/change.js +0 -1
- package/dist/es/utils/track-utils.js +1 -47
- package/dist/types/compute/setFragmentAsInserted.d.ts +0 -1
- package/dist/types/steps/trackTransaction.d.ts +1 -2
- package/dist/types/types/change.d.ts +2 -7
- package/dist/types/types/track.d.ts +1 -1
- package/dist/types/utils/track-utils.d.ts +0 -3
- package/package.json +2 -2
package/dist/cjs/ChangeSet.js
CHANGED
|
@@ -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
|
|
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,8 +20,13 @@ 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.
|
|
24
|
-
|
|
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
|
+
}
|
|
25
30
|
}
|
|
26
31
|
const { pos: from, deleted } = deleteMap.mapResult(change.from);
|
|
27
32
|
const node = tr.doc.nodeAt(from);
|
|
@@ -30,17 +35,9 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
|
|
|
30
35
|
return;
|
|
31
36
|
}
|
|
32
37
|
if (!node) {
|
|
33
|
-
!deleted && logger_1.log.warn('
|
|
38
|
+
!deleted && logger_1.log.warn('no node found to update for change', change);
|
|
34
39
|
return;
|
|
35
40
|
}
|
|
36
|
-
if (change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
|
|
37
|
-
if (change.dataTracked.operation === change_1.CHANGE_OPERATION.node_split) {
|
|
38
|
-
return (0, revertChange_1.revertSplitNodeChange)(tr, change, changeSet);
|
|
39
|
-
}
|
|
40
|
-
if (change.dataTracked.operation === change_1.CHANGE_OPERATION.wrap_with_node) {
|
|
41
|
-
return (0, revertChange_1.revertWrapNodeChange)(tr, change);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
41
|
if (ChangeSet_1.ChangeSet.isTextChange(change) && noChangeNeeded) {
|
|
45
42
|
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_insert);
|
|
46
43
|
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_delete);
|
|
@@ -75,40 +72,6 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
|
|
|
75
72
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
76
73
|
}
|
|
77
74
|
});
|
|
78
|
-
changes.forEach((change) => {
|
|
79
|
-
if (change.dataTracked.operation !== change_1.CHANGE_OPERATION.move) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
const { pos: from, deleted } = deleteMap.mapResult(change.from);
|
|
83
|
-
const node = tr.doc.nodeAt(from);
|
|
84
|
-
if (deleted || !node) {
|
|
85
|
-
if (!deleted && !node) {
|
|
86
|
-
logger_1.log.warn('No node found for move change', { change });
|
|
87
|
-
}
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
if (change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
|
|
91
|
-
const originalChange = changeSet.changes.find((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
|
|
92
|
-
c.dataTracked.operation === change_1.CHANGE_OPERATION.delete);
|
|
93
|
-
if (originalChange) {
|
|
94
|
-
const { pos: originalFrom } = deleteMap.mapResult(originalChange.from);
|
|
95
|
-
const originalNode = tr.doc.nodeAt(originalFrom);
|
|
96
|
-
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
|
|
97
|
-
tr.setNodeMarkup(from, undefined, attrs, node.marks);
|
|
98
|
-
if (originalNode) {
|
|
99
|
-
tr.delete(originalFrom, originalFrom + originalNode.nodeSize);
|
|
100
|
-
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
logger_1.log.warn('No original change found for move operation', { change });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
else if (change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
|
|
108
|
-
tr.delete(from, from + node.nodeSize);
|
|
109
|
-
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
75
|
return deleteMap;
|
|
113
76
|
}
|
|
114
77
|
exports.applyAcceptedRejectedChanges = applyAcceptedRejectedChanges;
|
|
@@ -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.
|
|
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)();
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -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
|
|
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
|
|
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);
|
package/dist/cjs/types/change.js
CHANGED
|
@@ -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.
|
|
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;
|
package/dist/es/ChangeSet.js
CHANGED
|
@@ -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
|
|
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,8 +16,13 @@ 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.
|
|
20
|
-
|
|
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
|
+
}
|
|
21
26
|
}
|
|
22
27
|
const { pos: from, deleted } = deleteMap.mapResult(change.from);
|
|
23
28
|
const node = tr.doc.nodeAt(from);
|
|
@@ -26,17 +31,9 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, del
|
|
|
26
31
|
return;
|
|
27
32
|
}
|
|
28
33
|
if (!node) {
|
|
29
|
-
!deleted && log.warn('
|
|
34
|
+
!deleted && log.warn('no node found to update for change', change);
|
|
30
35
|
return;
|
|
31
36
|
}
|
|
32
|
-
if (change.dataTracked.status === CHANGE_STATUS.rejected) {
|
|
33
|
-
if (change.dataTracked.operation === CHANGE_OPERATION.node_split) {
|
|
34
|
-
return revertSplitNodeChange(tr, change, changeSet);
|
|
35
|
-
}
|
|
36
|
-
if (change.dataTracked.operation === CHANGE_OPERATION.wrap_with_node) {
|
|
37
|
-
return revertWrapNodeChange(tr, change);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
37
|
if (ChangeSet.isTextChange(change) && noChangeNeeded) {
|
|
41
38
|
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_insert);
|
|
42
39
|
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_delete);
|
|
@@ -71,39 +68,5 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, del
|
|
|
71
68
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
72
69
|
}
|
|
73
70
|
});
|
|
74
|
-
changes.forEach((change) => {
|
|
75
|
-
if (change.dataTracked.operation !== CHANGE_OPERATION.move) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const { pos: from, deleted } = deleteMap.mapResult(change.from);
|
|
79
|
-
const node = tr.doc.nodeAt(from);
|
|
80
|
-
if (deleted || !node) {
|
|
81
|
-
if (!deleted && !node) {
|
|
82
|
-
log.warn('No node found for move change', { change });
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (change.dataTracked.status === CHANGE_STATUS.accepted) {
|
|
87
|
-
const originalChange = changeSet.changes.find((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
|
|
88
|
-
c.dataTracked.operation === CHANGE_OPERATION.delete);
|
|
89
|
-
if (originalChange) {
|
|
90
|
-
const { pos: originalFrom } = deleteMap.mapResult(originalChange.from);
|
|
91
|
-
const originalNode = tr.doc.nodeAt(originalFrom);
|
|
92
|
-
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) });
|
|
93
|
-
tr.setNodeMarkup(from, undefined, attrs, node.marks);
|
|
94
|
-
if (originalNode) {
|
|
95
|
-
tr.delete(originalFrom, originalFrom + originalNode.nodeSize);
|
|
96
|
-
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
log.warn('No original change found for move operation', { change });
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else if (change.dataTracked.status === CHANGE_STATUS.rejected) {
|
|
104
|
-
tr.delete(from, from + node.nodeSize);
|
|
105
|
-
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
71
|
return deleteMap;
|
|
109
72
|
}
|
|
@@ -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
|
|
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,
|
|
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 {
|
|
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
|
|
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);
|
package/dist/es/types/change.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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",
|