@manuscripts/track-changes-plugin 1.7.21 → 1.7.23-LEAN-3893.2
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 -2
- package/dist/cjs/change-steps/processChangeSteps.js +2 -1
- package/dist/cjs/changes/applyChanges.js +6 -1
- package/dist/cjs/changes/findChanges.js +13 -2
- package/dist/cjs/changes/revertChange.js +51 -0
- package/dist/cjs/compute/setFragmentAsInserted.js +51 -1
- package/dist/cjs/mutate/deleteNode.js +2 -2
- package/dist/cjs/plugin.js +2 -0
- package/dist/cjs/steps/trackReplaceAroundStep.js +9 -1
- package/dist/cjs/steps/trackReplaceStep.js +7 -2
- package/dist/cjs/steps/trackTransaction.js +1 -1
- package/dist/cjs/types/change.js +18 -0
- package/dist/cjs/utils/track-utils.js +43 -1
- package/dist/es/ChangeSet.js +8 -2
- package/dist/es/change-steps/processChangeSteps.js +2 -1
- package/dist/es/changes/applyChanges.js +5 -1
- package/dist/es/changes/findChanges.js +13 -2
- package/dist/es/changes/revertChange.js +47 -0
- package/dist/es/compute/setFragmentAsInserted.js +27 -2
- package/dist/es/mutate/deleteNode.js +2 -2
- package/dist/es/plugin.js +2 -0
- package/dist/es/steps/trackReplaceAroundStep.js +10 -2
- package/dist/es/steps/trackReplaceStep.js +8 -3
- package/dist/es/steps/trackTransaction.js +1 -1
- package/dist/es/types/change.js +18 -0
- package/dist/es/utils/track-utils.js +37 -0
- package/dist/types/ChangeSet.d.ts +2 -1
- package/dist/types/changes/applyChanges.d.ts +2 -1
- package/dist/types/changes/revertChange.d.ts +5 -0
- package/dist/types/compute/setFragmentAsInserted.d.ts +5 -2
- package/dist/types/steps/trackReplaceStep.d.ts +1 -1
- package/dist/types/types/change.d.ts +39 -5
- package/dist/types/types/track.d.ts +8 -1
- package/dist/types/utils/track-utils.d.ts +8 -1
- package/package.json +1 -1
package/dist/cjs/ChangeSet.js
CHANGED
|
@@ -95,7 +95,7 @@ class ChangeSet {
|
|
|
95
95
|
return this.changes.filter((c) => c.type === 'node-attr-change');
|
|
96
96
|
}
|
|
97
97
|
get bothNodeChanges() {
|
|
98
|
-
return this.changes.filter((c) => c.type === 'node-change' || c.type === 'node-attr-change');
|
|
98
|
+
return this.changes.filter((c) => c.type === 'node-change' || c.type === 'reference-change' || c.type === 'node-attr-change');
|
|
99
99
|
}
|
|
100
100
|
get isEmpty() {
|
|
101
101
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").length === 0;
|
|
@@ -140,7 +140,10 @@ class ChangeSet {
|
|
|
140
140
|
}
|
|
141
141
|
static shouldDeleteChange(change) {
|
|
142
142
|
const { status, operation } = change.dataTracked;
|
|
143
|
-
return ((operation === change_1.CHANGE_OPERATION.insert
|
|
143
|
+
return (((operation === change_1.CHANGE_OPERATION.insert ||
|
|
144
|
+
operation === change_1.CHANGE_OPERATION.node_split ||
|
|
145
|
+
operation === change_1.CHANGE_OPERATION.wrap_with_node) &&
|
|
146
|
+
status === change_1.CHANGE_STATUS.rejected) ||
|
|
144
147
|
(operation === change_1.CHANGE_OPERATION.delete && status === change_1.CHANGE_STATUS.accepted));
|
|
145
148
|
}
|
|
146
149
|
static isValidDataTracked(dataTracked = {}) {
|
|
@@ -172,6 +175,9 @@ class ChangeSet {
|
|
|
172
175
|
static isNodeAttrChange(change) {
|
|
173
176
|
return change.type === 'node-attr-change';
|
|
174
177
|
}
|
|
178
|
+
static isReferenceChange(change) {
|
|
179
|
+
return change.type === 'reference-change';
|
|
180
|
+
}
|
|
175
181
|
}
|
|
176
182
|
exports.ChangeSet = ChangeSet;
|
|
177
183
|
_ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
|
|
@@ -128,7 +128,8 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
128
128
|
? Object.assign(Object.assign({}, oldUpdate), { updatedAt: emptyAttrs.updatedAt }) : (0, nodeHelpers_1.addTrackIdIfDoesntExist)(trackUtils.createNewUpdateAttrs(emptyAttrs, lastChangeRejected ? oldAttrs : c.node.attrs));
|
|
129
129
|
if ((JSON.stringify(oldAttrs) !== JSON.stringify(c.newAttrs) ||
|
|
130
130
|
c.node.type === c.node.type.schema.nodes.citation) &&
|
|
131
|
-
!oldDataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert
|
|
131
|
+
!oldDataTracked.find((d) => (d.operation === change_1.CHANGE_OPERATION.insert || d.operation === change_1.CHANGE_OPERATION.wrap_with_node) &&
|
|
132
|
+
d.status === change_1.CHANGE_STATUS.pending)) {
|
|
132
133
|
newDataTracked.push(newUpdate);
|
|
133
134
|
}
|
|
134
135
|
newTr.setNodeMarkup(mapping.map(c.pos), undefined, Object.assign(Object.assign({}, c.newAttrs), { dataTracked: newDataTracked.length > 0 ? newDataTracked : null }), c.node.marks);
|
|
@@ -11,7 +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.applyAcceptedRejectedChanges = void 0;
|
|
14
|
+
exports.applyAcceptedRejectedChanges = exports.getUpdatedDataTracked = void 0;
|
|
15
15
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
16
16
|
const ChangeSet_1 = require("../ChangeSet");
|
|
17
17
|
const deleteNode_1 = require("../mutate/deleteNode");
|
|
@@ -26,6 +26,7 @@ function getUpdatedDataTracked(dataTracked, changeId) {
|
|
|
26
26
|
const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
|
|
27
27
|
return newDataTracked.length ? newDataTracked : null;
|
|
28
28
|
}
|
|
29
|
+
exports.getUpdatedDataTracked = getUpdatedDataTracked;
|
|
29
30
|
function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prosemirror_transform_1.Mapping()) {
|
|
30
31
|
const attrsChangesLog = new Map();
|
|
31
32
|
function addAttrLog(nodeId, changeId) {
|
|
@@ -79,6 +80,10 @@ function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prose
|
|
|
79
80
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
80
81
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
81
82
|
}
|
|
83
|
+
else if (ChangeSet_1.ChangeSet.isReferenceChange(change)) {
|
|
84
|
+
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
|
|
85
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
86
|
+
}
|
|
82
87
|
});
|
|
83
88
|
return deleteMap;
|
|
84
89
|
}
|
|
@@ -31,6 +31,7 @@ function findChanges(state) {
|
|
|
31
31
|
to: pos + node.nodeSize,
|
|
32
32
|
dataTracked,
|
|
33
33
|
text: node.text,
|
|
34
|
+
nodeType: node.type,
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
else if (dataTracked.operation === change_1.CHANGE_OPERATION.set_node_attributes) {
|
|
@@ -40,11 +41,20 @@ function findChanges(state) {
|
|
|
40
41
|
from: pos,
|
|
41
42
|
to: pos + node.nodeSize,
|
|
42
43
|
dataTracked,
|
|
43
|
-
|
|
44
|
+
node: node,
|
|
44
45
|
newAttrs: node.attrs,
|
|
45
46
|
oldAttrs: dataTracked.oldAttrs,
|
|
46
47
|
};
|
|
47
48
|
}
|
|
49
|
+
else if (dataTracked.operation === change_1.CHANGE_OPERATION.reference) {
|
|
50
|
+
change = {
|
|
51
|
+
id,
|
|
52
|
+
type: 'reference-change',
|
|
53
|
+
from: pos,
|
|
54
|
+
to: pos + node.nodeSize,
|
|
55
|
+
dataTracked,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
48
58
|
else {
|
|
49
59
|
change = {
|
|
50
60
|
id,
|
|
@@ -52,8 +62,9 @@ function findChanges(state) {
|
|
|
52
62
|
from: pos,
|
|
53
63
|
to: pos + node.nodeSize,
|
|
54
64
|
dataTracked,
|
|
55
|
-
|
|
65
|
+
node: node,
|
|
56
66
|
children: [],
|
|
67
|
+
attrs: node.attrs,
|
|
57
68
|
};
|
|
58
69
|
}
|
|
59
70
|
current = {
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.revertRejectedChanges = void 0;
|
|
4
|
+
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
|
+
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
6
|
+
const change_1 = require("../types/change");
|
|
7
|
+
const applyChanges_1 = require("./applyChanges");
|
|
8
|
+
function revertSplitNodeChange(tr, change, changeSet) {
|
|
9
|
+
let sourceChange = changeSet.changes.find((c) => c.dataTracked.operation === 'reference' && c.dataTracked.referenceId === change.id);
|
|
10
|
+
const node = tr.doc.nodeAt(change.from);
|
|
11
|
+
tr.replaceWith(change.from, change.to, prosemirror_model_1.Fragment.empty);
|
|
12
|
+
tr.replaceWith(sourceChange.to - 1, sourceChange.to, node.content);
|
|
13
|
+
if (change.node.type.name === 'list_item') {
|
|
14
|
+
tr.join(sourceChange.to - 1);
|
|
15
|
+
}
|
|
16
|
+
const childSource = changeSet.changes.find((c) => c.from === change.from && c.dataTracked.operation === 'reference');
|
|
17
|
+
if (childSource) {
|
|
18
|
+
const node = tr.doc.nodeAt(sourceChange.from);
|
|
19
|
+
const dataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(node).map((c) => c.operation === 'reference' ? childSource.dataTracked : c);
|
|
20
|
+
tr.setNodeMarkup(sourceChange.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked }), node.marks);
|
|
21
|
+
}
|
|
22
|
+
const deleteChange = changeSet.changes.find((c) => c.dataTracked.operation == 'delete' && c.from === sourceChange.from);
|
|
23
|
+
if (deleteChange) {
|
|
24
|
+
const node = tr.doc.nodeAt(deleteChange.from);
|
|
25
|
+
tr.setNodeMarkup(deleteChange.from, undefined, (0, applyChanges_1.getUpdatedDataTracked)(node.attrs.dataTracked, deleteChange.id));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function revertWrapNodeChange(tr, change) {
|
|
29
|
+
let content = prosemirror_model_1.Fragment.from();
|
|
30
|
+
const node = tr.doc.nodeAt(change.from);
|
|
31
|
+
node.content.forEach((node) => {
|
|
32
|
+
content = content.append(node.content);
|
|
33
|
+
});
|
|
34
|
+
tr.replaceWith(change.from, change.to, prosemirror_model_1.Fragment.empty);
|
|
35
|
+
tr.insert(tr.mapping.map(change.to), content);
|
|
36
|
+
}
|
|
37
|
+
function revertRejectedChanges(tr, schema, ids, changeSet, status) {
|
|
38
|
+
if (status !== change_1.CHANGE_STATUS.rejected) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
ids.forEach((id) => {
|
|
42
|
+
const change = changeSet.get(id);
|
|
43
|
+
if (change.dataTracked.operation === change_1.CHANGE_OPERATION.node_split) {
|
|
44
|
+
revertSplitNodeChange(tr, change, changeSet);
|
|
45
|
+
}
|
|
46
|
+
if (change.dataTracked.operation === change_1.CHANGE_OPERATION.wrap_with_node) {
|
|
47
|
+
revertWrapNodeChange(tr, change);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
exports.revertRejectedChanges = revertRejectedChanges;
|
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
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
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setFragmentAsInserted = void 0;
|
|
26
|
+
exports.setFragmentAsNodeSplit = exports.setFragmentAsWrapChange = exports.setFragmentAsInserted = void 0;
|
|
4
27
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
28
|
const change_1 = require("../types/change");
|
|
6
29
|
const logger_1 = require("../utils/logger");
|
|
30
|
+
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
31
|
+
const uuidv4_1 = require("../utils/uuidv4");
|
|
7
32
|
const nodeHelpers_1 = require("./nodeHelpers");
|
|
8
33
|
function markInlineNodeChange(node, newTrackAttrs, schema) {
|
|
9
34
|
const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
|
|
@@ -51,3 +76,28 @@ function setFragmentAsInserted(inserted, insertAttrs, schema) {
|
|
|
51
76
|
return updatedInserted.length === 0 ? prosemirror_model_1.Fragment.empty : prosemirror_model_1.Fragment.fromArray(updatedInserted);
|
|
52
77
|
}
|
|
53
78
|
exports.setFragmentAsInserted = setFragmentAsInserted;
|
|
79
|
+
function setFragmentAsWrapChange(inserted, attrs, schema) {
|
|
80
|
+
const content = [];
|
|
81
|
+
inserted.forEach((node) => {
|
|
82
|
+
content.push(node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [(0, nodeHelpers_1.addTrackIdIfDoesntExist)(trackUtils.createNewWrapAttrs(attrs))] }), setFragmentAsInserted(node.content, trackUtils.createNewInsertAttrs(attrs), schema), node.marks));
|
|
83
|
+
});
|
|
84
|
+
return prosemirror_model_1.Fragment.from(content);
|
|
85
|
+
}
|
|
86
|
+
exports.setFragmentAsWrapChange = setFragmentAsWrapChange;
|
|
87
|
+
function setFragmentAsNodeSplit($pos, newTr, inserted, attrs) {
|
|
88
|
+
const lastChild = inserted.lastChild;
|
|
89
|
+
const referenceId = (0, uuidv4_1.uuidv4)();
|
|
90
|
+
const listItemSplit = lastChild.type.name === 'list_item' ? 1 : 0;
|
|
91
|
+
const parentPos = $pos.before($pos.depth - listItemSplit);
|
|
92
|
+
const parent = $pos.node($pos.depth - listItemSplit);
|
|
93
|
+
const oldDataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(parent) || [];
|
|
94
|
+
newTr.setNodeMarkup(parentPos, undefined, Object.assign(Object.assign({}, parent.attrs), { dataTracked: [
|
|
95
|
+
...oldDataTracked.filter((c) => c.operation !== 'reference'),
|
|
96
|
+
Object.assign({}, (0, nodeHelpers_1.addTrackIdIfDoesntExist)(trackUtils.createNewSplitSourceAttrs(Object.assign(Object.assign({}, attrs), { status: change_1.CHANGE_STATUS.rejected }), referenceId))),
|
|
97
|
+
] }));
|
|
98
|
+
const splitSource = oldDataTracked.find((c) => c.operation === 'reference');
|
|
99
|
+
const dataTracked = Object.assign(Object.assign({}, trackUtils.createNewSplitAttrs(Object.assign({}, attrs))), { id: referenceId });
|
|
100
|
+
inserted = inserted.replaceChild(inserted.childCount - 1, lastChild.type.create(Object.assign(Object.assign({}, lastChild.attrs), { dataTracked: splitSource ? [dataTracked, splitSource] : [dataTracked] }), lastChild.content));
|
|
101
|
+
return inserted;
|
|
102
|
+
}
|
|
103
|
+
exports.setFragmentAsNodeSplit = setFragmentAsNodeSplit;
|
|
@@ -20,9 +20,9 @@ function deleteNode(node, pos, tr) {
|
|
|
20
20
|
exports.deleteNode = deleteNode;
|
|
21
21
|
function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
|
|
22
22
|
const dataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(node);
|
|
23
|
-
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert &&
|
|
23
|
+
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => (d.operation === change_1.CHANGE_OPERATION.insert || d.operation === change_1.CHANGE_OPERATION.wrap_with_node) &&
|
|
24
24
|
(d.status === change_1.CHANGE_STATUS.pending || d.status === change_1.CHANGE_STATUS.accepted));
|
|
25
|
-
const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.set_node_attributes);
|
|
25
|
+
const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.set_node_attributes || d.operation === change_1.CHANGE_OPERATION.reference);
|
|
26
26
|
if (inserted) {
|
|
27
27
|
return deleteNode(node, pos, newTr);
|
|
28
28
|
}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -17,6 +17,7 @@ const actions_1 = require("./actions");
|
|
|
17
17
|
const applyChanges_1 = require("./changes/applyChanges");
|
|
18
18
|
const findChanges_1 = require("./changes/findChanges");
|
|
19
19
|
const fixInconsistentChanges_1 = require("./changes/fixInconsistentChanges");
|
|
20
|
+
const revertChange_1 = require("./changes/revertChange");
|
|
20
21
|
const updateChangeAttrs_1 = require("./changes/updateChangeAttrs");
|
|
21
22
|
const ChangeSet_1 = require("./ChangeSet");
|
|
22
23
|
const trackTransaction_1 = require("./steps/trackTransaction");
|
|
@@ -111,6 +112,7 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous', initialStatu
|
|
|
111
112
|
createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
|
|
112
113
|
}
|
|
113
114
|
});
|
|
115
|
+
(0, revertChange_1.revertRejectedChanges)(createdTr, oldState.schema, ids, changeSet, status);
|
|
114
116
|
}
|
|
115
117
|
else if ((0, actions_1.getAction)(tr, actions_1.TrackChangesAction.applyAndRemoveChanges)) {
|
|
116
118
|
const mapping = (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, changeSet.bothNodeChanges);
|
|
@@ -30,6 +30,7 @@ const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
|
|
|
30
30
|
const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
|
|
31
31
|
const logger_1 = require("../utils/logger");
|
|
32
32
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
33
|
+
const track_utils_1 = require("../utils/track-utils");
|
|
33
34
|
function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, currentStepDoc) {
|
|
34
35
|
logger_1.log.info('###### ReplaceAroundStep ######');
|
|
35
36
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -42,6 +43,13 @@ function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, currentStepDoc
|
|
|
42
43
|
const gap = currentStepDoc.slice(gapFrom, gapTo);
|
|
43
44
|
logger_1.log.info('RETAINED GAP CONTENT', gap);
|
|
44
45
|
const { sliceWasSplit, newSliceContent, steps: deleteSteps, } = (0, deleteAndMergeSplitNodes_1.deleteAndMergeSplitNodes)(from, to, { start: gapFrom, end: gapTo }, newTr.doc, newTr, oldState.schema, attrs, slice);
|
|
46
|
+
let fragment;
|
|
47
|
+
if ((0, track_utils_1.isWrapStep)(step)) {
|
|
48
|
+
fragment = (0, setFragmentAsInserted_1.setFragmentAsWrapChange)(newSliceContent, attrs, oldState.schema);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
fragment = (0, setFragmentAsInserted_1.setFragmentAsInserted)(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
|
|
52
|
+
}
|
|
45
53
|
const steps = deleteSteps;
|
|
46
54
|
logger_1.log.info('TR: new steps after applying delete', [...newTr.steps]);
|
|
47
55
|
logger_1.log.info('DELETE STEPS: ', deleteSteps);
|
|
@@ -51,7 +59,7 @@ function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, currentStepDoc
|
|
|
51
59
|
logger_1.log.info('newSliceContent', newSliceContent);
|
|
52
60
|
const openStart = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openStart;
|
|
53
61
|
const openEnd = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openEnd;
|
|
54
|
-
let insertedSlice = new prosemirror_model_1.Slice(
|
|
62
|
+
let insertedSlice = new prosemirror_model_1.Slice(fragment, openStart, openEnd);
|
|
55
63
|
if (gap.size > 0 || tr.getMeta(actions_1.TrackChangesAction.updateMetaNode)) {
|
|
56
64
|
logger_1.log.info('insertedSlice before inserted gap', insertedSlice);
|
|
57
65
|
insertedSlice = insertedSlice.insertAt(insertedSlice.size === 0 ? 0 : insert, gap.content);
|
|
@@ -29,7 +29,8 @@ const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
|
|
|
29
29
|
const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
|
|
30
30
|
const logger_1 = require("../utils/logger");
|
|
31
31
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
32
|
-
|
|
32
|
+
const track_utils_1 = require("../utils/track-utils");
|
|
33
|
+
function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc, tr) {
|
|
33
34
|
logger_1.log.info('###### ReplaceStep ######');
|
|
34
35
|
let selectionPos = 0;
|
|
35
36
|
const changeSteps = [];
|
|
@@ -60,6 +61,10 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
60
61
|
const textWasDeleted = !!changeSteps.length;
|
|
61
62
|
if (!backSpacedText && newSliceContent.size > 0) {
|
|
62
63
|
logger_1.log.info('newSliceContent', newSliceContent);
|
|
64
|
+
let fragment = (0, setFragmentAsInserted_1.setFragmentAsInserted)(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
|
|
65
|
+
if ((0, track_utils_1.isSplitStep)(step, oldState.selection, tr.getMeta('uiEvent'))) {
|
|
66
|
+
fragment = (0, setFragmentAsInserted_1.setFragmentAsNodeSplit)(newTr.doc.resolve(step.from), newTr, fragment, attrs);
|
|
67
|
+
}
|
|
63
68
|
const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
|
|
64
69
|
const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
|
|
65
70
|
changeSteps.push({
|
|
@@ -67,7 +72,7 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
67
72
|
from: textWasDeleted ? fromB : toA,
|
|
68
73
|
to: textWasDeleted ? toB - 1 : toA,
|
|
69
74
|
sliceWasSplit,
|
|
70
|
-
slice: new prosemirror_model_1.Slice(
|
|
75
|
+
slice: new prosemirror_model_1.Slice(fragment, openStart, openEnd),
|
|
71
76
|
});
|
|
72
77
|
}
|
|
73
78
|
else {
|
|
@@ -55,7 +55,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
55
55
|
const thisStepMapping = tr.mapping.slice(i + 1);
|
|
56
56
|
const newStep = new prosemirror_transform_1.ReplaceStep(thisStepMapping.map(invertedStep.from), thisStepMapping.map(invertedStep.to), invertedStep.slice);
|
|
57
57
|
const stepResult = newTr.maybeStep(isDelete ? invertedStep : newStep);
|
|
58
|
-
let [steps, startPos] = (0, trackReplaceStep_1.trackReplaceStep)(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i]);
|
|
58
|
+
let [steps, startPos] = (0, trackReplaceStep_1.trackReplaceStep)(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr);
|
|
59
59
|
if (steps.length === 1) {
|
|
60
60
|
const step = steps[0];
|
|
61
61
|
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]))) {
|
package/dist/cjs/types/change.js
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* © 2023 Atypon Systems LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
2
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
18
|
exports.CHANGE_STATUS = exports.CHANGE_OPERATION = void 0;
|
|
4
19
|
var CHANGE_OPERATION;
|
|
@@ -6,6 +21,9 @@ var CHANGE_OPERATION;
|
|
|
6
21
|
CHANGE_OPERATION["insert"] = "insert";
|
|
7
22
|
CHANGE_OPERATION["delete"] = "delete";
|
|
8
23
|
CHANGE_OPERATION["set_node_attributes"] = "set_attrs";
|
|
24
|
+
CHANGE_OPERATION["wrap_with_node"] = "wrap_with_node";
|
|
25
|
+
CHANGE_OPERATION["node_split"] = "node_split";
|
|
26
|
+
CHANGE_OPERATION["reference"] = "reference";
|
|
9
27
|
})(CHANGE_OPERATION = exports.CHANGE_OPERATION || (exports.CHANGE_OPERATION = {}));
|
|
10
28
|
var CHANGE_STATUS;
|
|
11
29
|
(function (CHANGE_STATUS) {
|
|
@@ -11,12 +11,24 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.createNewUpdateAttrs = exports.createNewDeleteAttrs = exports.createNewInsertAttrs = void 0;
|
|
14
|
+
exports.isWrapStep = exports.isSplitStep = exports.createNewUpdateAttrs = exports.createNewDeleteAttrs = exports.createNewSplitSourceAttrs = exports.createNewSplitAttrs = exports.createNewWrapAttrs = exports.createNewInsertAttrs = void 0;
|
|
15
15
|
const change_1 = require("../types/change");
|
|
16
16
|
function createNewInsertAttrs(attrs) {
|
|
17
17
|
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
|
|
18
18
|
}
|
|
19
19
|
exports.createNewInsertAttrs = createNewInsertAttrs;
|
|
20
|
+
function createNewWrapAttrs(attrs) {
|
|
21
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.wrap_with_node });
|
|
22
|
+
}
|
|
23
|
+
exports.createNewWrapAttrs = createNewWrapAttrs;
|
|
24
|
+
function createNewSplitAttrs(attrs) {
|
|
25
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.node_split });
|
|
26
|
+
}
|
|
27
|
+
exports.createNewSplitAttrs = createNewSplitAttrs;
|
|
28
|
+
function createNewSplitSourceAttrs(attrs, id) {
|
|
29
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.reference, referenceId: id });
|
|
30
|
+
}
|
|
31
|
+
exports.createNewSplitSourceAttrs = createNewSplitSourceAttrs;
|
|
20
32
|
function createNewDeleteAttrs(attrs) {
|
|
21
33
|
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
|
|
22
34
|
}
|
|
@@ -26,3 +38,33 @@ function createNewUpdateAttrs(attrs, oldAttrs) {
|
|
|
26
38
|
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
|
|
27
39
|
}
|
|
28
40
|
exports.createNewUpdateAttrs = createNewUpdateAttrs;
|
|
41
|
+
const isSplitStep = (step, selection, uiEvent) => {
|
|
42
|
+
var _a, _b, _c, _d;
|
|
43
|
+
const { from, to, slice } = step;
|
|
44
|
+
if (from !== to ||
|
|
45
|
+
slice.content.childCount < 2 ||
|
|
46
|
+
(((_a = slice.content.firstChild) === null || _a === void 0 ? void 0 : _a.isInline) && ((_b = slice.content.lastChild) === null || _b === void 0 ? void 0 : _b.isInline))) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const { $anchor: { parentOffset: startOffset }, $head: { parentOffset: endOffset }, $from, } = selection;
|
|
50
|
+
const parentSize = $from.node().content.size;
|
|
51
|
+
if (uiEvent === 'paste') {
|
|
52
|
+
return !((startOffset === 0 && endOffset === 0) ||
|
|
53
|
+
(startOffset === parentSize && endOffset === parentSize));
|
|
54
|
+
}
|
|
55
|
+
const { content: { firstChild, lastChild }, openStart, openEnd, } = slice;
|
|
56
|
+
if ((((_c = window.event) === null || _c === void 0 ? void 0 : _c.code) === 'Enter' || ((_d = window.event) === null || _d === void 0 ? void 0 : _d.code) === 'NumpadEnter') &&
|
|
57
|
+
(firstChild === null || firstChild === void 0 ? void 0 : firstChild.type.name) === 'list_item') {
|
|
58
|
+
return !(parentSize === startOffset && parentSize === endOffset) && (lastChild === null || lastChild === void 0 ? void 0 : lastChild.type.name) === 'list_item';
|
|
59
|
+
}
|
|
60
|
+
return (openStart === openEnd &&
|
|
61
|
+
firstChild.type === lastChild.type &&
|
|
62
|
+
firstChild.inlineContent &&
|
|
63
|
+
lastChild.inlineContent);
|
|
64
|
+
};
|
|
65
|
+
exports.isSplitStep = isSplitStep;
|
|
66
|
+
const isWrapStep = (step) => step.from === step.gapFrom &&
|
|
67
|
+
step.to === step.gapTo &&
|
|
68
|
+
step.slice.openStart === 0 &&
|
|
69
|
+
step.slice.openEnd === 0;
|
|
70
|
+
exports.isWrapStep = isWrapStep;
|
package/dist/es/ChangeSet.js
CHANGED
|
@@ -92,7 +92,7 @@ export class ChangeSet {
|
|
|
92
92
|
return this.changes.filter((c) => c.type === 'node-attr-change');
|
|
93
93
|
}
|
|
94
94
|
get bothNodeChanges() {
|
|
95
|
-
return this.changes.filter((c) => c.type === 'node-change' || c.type === 'node-attr-change');
|
|
95
|
+
return this.changes.filter((c) => c.type === 'node-change' || c.type === 'reference-change' || c.type === 'node-attr-change');
|
|
96
96
|
}
|
|
97
97
|
get isEmpty() {
|
|
98
98
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").length === 0;
|
|
@@ -137,7 +137,10 @@ export class ChangeSet {
|
|
|
137
137
|
}
|
|
138
138
|
static shouldDeleteChange(change) {
|
|
139
139
|
const { status, operation } = change.dataTracked;
|
|
140
|
-
return ((operation === CHANGE_OPERATION.insert
|
|
140
|
+
return (((operation === CHANGE_OPERATION.insert ||
|
|
141
|
+
operation === CHANGE_OPERATION.node_split ||
|
|
142
|
+
operation === CHANGE_OPERATION.wrap_with_node) &&
|
|
143
|
+
status === CHANGE_STATUS.rejected) ||
|
|
141
144
|
(operation === CHANGE_OPERATION.delete && status === CHANGE_STATUS.accepted));
|
|
142
145
|
}
|
|
143
146
|
static isValidDataTracked(dataTracked = {}) {
|
|
@@ -169,6 +172,9 @@ export class ChangeSet {
|
|
|
169
172
|
static isNodeAttrChange(change) {
|
|
170
173
|
return change.type === 'node-attr-change';
|
|
171
174
|
}
|
|
175
|
+
static isReferenceChange(change) {
|
|
176
|
+
return change.type === 'reference-change';
|
|
177
|
+
}
|
|
172
178
|
}
|
|
173
179
|
_ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
|
|
174
180
|
return currentChange.from === nextChange.from && currentChange.to === nextChange.to;
|
|
@@ -102,7 +102,8 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
102
102
|
? Object.assign(Object.assign({}, oldUpdate), { updatedAt: emptyAttrs.updatedAt }) : addTrackIdIfDoesntExist(trackUtils.createNewUpdateAttrs(emptyAttrs, lastChangeRejected ? oldAttrs : c.node.attrs));
|
|
103
103
|
if ((JSON.stringify(oldAttrs) !== JSON.stringify(c.newAttrs) ||
|
|
104
104
|
c.node.type === c.node.type.schema.nodes.citation) &&
|
|
105
|
-
!oldDataTracked.find((d) => d.operation === CHANGE_OPERATION.insert
|
|
105
|
+
!oldDataTracked.find((d) => (d.operation === CHANGE_OPERATION.insert || d.operation === CHANGE_OPERATION.wrap_with_node) &&
|
|
106
|
+
d.status === CHANGE_STATUS.pending)) {
|
|
106
107
|
newDataTracked.push(newUpdate);
|
|
107
108
|
}
|
|
108
109
|
newTr.setNodeMarkup(mapping.map(c.pos), undefined, Object.assign(Object.assign({}, c.newAttrs), { dataTracked: newDataTracked.length > 0 ? newDataTracked : null }), c.node.marks);
|
|
@@ -16,7 +16,7 @@ import { mergeNode } from '../mutate/mergeNode';
|
|
|
16
16
|
import { CHANGE_STATUS } from '../types/change';
|
|
17
17
|
import { log } from '../utils/logger';
|
|
18
18
|
import { updateChangeChildrenAttributes } from './updateChangeAttrs';
|
|
19
|
-
function getUpdatedDataTracked(dataTracked, changeId) {
|
|
19
|
+
export function getUpdatedDataTracked(dataTracked, changeId) {
|
|
20
20
|
if (!dataTracked) {
|
|
21
21
|
return null;
|
|
22
22
|
}
|
|
@@ -76,6 +76,10 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = ne
|
|
|
76
76
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
77
77
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
78
78
|
}
|
|
79
|
+
else if (ChangeSet.isReferenceChange(change)) {
|
|
80
|
+
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
|
|
81
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
82
|
+
}
|
|
79
83
|
});
|
|
80
84
|
return deleteMap;
|
|
81
85
|
}
|
|
@@ -28,6 +28,7 @@ export function findChanges(state) {
|
|
|
28
28
|
to: pos + node.nodeSize,
|
|
29
29
|
dataTracked,
|
|
30
30
|
text: node.text,
|
|
31
|
+
nodeType: node.type,
|
|
31
32
|
};
|
|
32
33
|
}
|
|
33
34
|
else if (dataTracked.operation === CHANGE_OPERATION.set_node_attributes) {
|
|
@@ -37,11 +38,20 @@ export function findChanges(state) {
|
|
|
37
38
|
from: pos,
|
|
38
39
|
to: pos + node.nodeSize,
|
|
39
40
|
dataTracked,
|
|
40
|
-
|
|
41
|
+
node: node,
|
|
41
42
|
newAttrs: node.attrs,
|
|
42
43
|
oldAttrs: dataTracked.oldAttrs,
|
|
43
44
|
};
|
|
44
45
|
}
|
|
46
|
+
else if (dataTracked.operation === CHANGE_OPERATION.reference) {
|
|
47
|
+
change = {
|
|
48
|
+
id,
|
|
49
|
+
type: 'reference-change',
|
|
50
|
+
from: pos,
|
|
51
|
+
to: pos + node.nodeSize,
|
|
52
|
+
dataTracked,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
45
55
|
else {
|
|
46
56
|
change = {
|
|
47
57
|
id,
|
|
@@ -49,8 +59,9 @@ export function findChanges(state) {
|
|
|
49
59
|
from: pos,
|
|
50
60
|
to: pos + node.nodeSize,
|
|
51
61
|
dataTracked,
|
|
52
|
-
|
|
62
|
+
node: node,
|
|
53
63
|
children: [],
|
|
64
|
+
attrs: node.attrs,
|
|
54
65
|
};
|
|
55
66
|
}
|
|
56
67
|
current = {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Fragment } from 'prosemirror-model';
|
|
2
|
+
import { getBlockInlineTrackedData } from '../compute/nodeHelpers';
|
|
3
|
+
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
4
|
+
import { getUpdatedDataTracked } from './applyChanges';
|
|
5
|
+
function revertSplitNodeChange(tr, change, changeSet) {
|
|
6
|
+
let sourceChange = changeSet.changes.find((c) => c.dataTracked.operation === 'reference' && c.dataTracked.referenceId === change.id);
|
|
7
|
+
const node = tr.doc.nodeAt(change.from);
|
|
8
|
+
tr.replaceWith(change.from, change.to, Fragment.empty);
|
|
9
|
+
tr.replaceWith(sourceChange.to - 1, sourceChange.to, node.content);
|
|
10
|
+
if (change.node.type.name === 'list_item') {
|
|
11
|
+
tr.join(sourceChange.to - 1);
|
|
12
|
+
}
|
|
13
|
+
const childSource = changeSet.changes.find((c) => c.from === change.from && c.dataTracked.operation === 'reference');
|
|
14
|
+
if (childSource) {
|
|
15
|
+
const node = tr.doc.nodeAt(sourceChange.from);
|
|
16
|
+
const dataTracked = getBlockInlineTrackedData(node).map((c) => c.operation === 'reference' ? childSource.dataTracked : c);
|
|
17
|
+
tr.setNodeMarkup(sourceChange.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked }), node.marks);
|
|
18
|
+
}
|
|
19
|
+
const deleteChange = changeSet.changes.find((c) => c.dataTracked.operation == 'delete' && c.from === sourceChange.from);
|
|
20
|
+
if (deleteChange) {
|
|
21
|
+
const node = tr.doc.nodeAt(deleteChange.from);
|
|
22
|
+
tr.setNodeMarkup(deleteChange.from, undefined, getUpdatedDataTracked(node.attrs.dataTracked, deleteChange.id));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function revertWrapNodeChange(tr, change) {
|
|
26
|
+
let content = Fragment.from();
|
|
27
|
+
const node = tr.doc.nodeAt(change.from);
|
|
28
|
+
node.content.forEach((node) => {
|
|
29
|
+
content = content.append(node.content);
|
|
30
|
+
});
|
|
31
|
+
tr.replaceWith(change.from, change.to, Fragment.empty);
|
|
32
|
+
tr.insert(tr.mapping.map(change.to), content);
|
|
33
|
+
}
|
|
34
|
+
export function revertRejectedChanges(tr, schema, ids, changeSet, status) {
|
|
35
|
+
if (status !== CHANGE_STATUS.rejected) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
ids.forEach((id) => {
|
|
39
|
+
const change = changeSet.get(id);
|
|
40
|
+
if (change.dataTracked.operation === CHANGE_OPERATION.node_split) {
|
|
41
|
+
revertSplitNodeChange(tr, change, changeSet);
|
|
42
|
+
}
|
|
43
|
+
if (change.dataTracked.operation === CHANGE_OPERATION.wrap_with_node) {
|
|
44
|
+
revertWrapNodeChange(tr, change);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Fragment } from 'prosemirror-model';
|
|
2
|
-
import { CHANGE_OPERATION } from '../types/change';
|
|
2
|
+
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
3
3
|
import { log } from '../utils/logger';
|
|
4
|
-
import
|
|
4
|
+
import * as trackUtils from '../utils/track-utils';
|
|
5
|
+
import { uuidv4 } from '../utils/uuidv4';
|
|
6
|
+
import { addTrackIdIfDoesntExist, equalMarks, getBlockInlineTrackedData, getTextNodeTrackedMarkData, } from './nodeHelpers';
|
|
5
7
|
function markInlineNodeChange(node, newTrackAttrs, schema) {
|
|
6
8
|
const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
|
|
7
9
|
const mark = newTrackAttrs.operation === CHANGE_OPERATION.insert
|
|
@@ -47,3 +49,26 @@ export function setFragmentAsInserted(inserted, insertAttrs, schema) {
|
|
|
47
49
|
const updatedInserted = loopContentAndMergeText(inserted, insertAttrs, schema);
|
|
48
50
|
return updatedInserted.length === 0 ? Fragment.empty : Fragment.fromArray(updatedInserted);
|
|
49
51
|
}
|
|
52
|
+
export function setFragmentAsWrapChange(inserted, attrs, schema) {
|
|
53
|
+
const content = [];
|
|
54
|
+
inserted.forEach((node) => {
|
|
55
|
+
content.push(node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [addTrackIdIfDoesntExist(trackUtils.createNewWrapAttrs(attrs))] }), setFragmentAsInserted(node.content, trackUtils.createNewInsertAttrs(attrs), schema), node.marks));
|
|
56
|
+
});
|
|
57
|
+
return Fragment.from(content);
|
|
58
|
+
}
|
|
59
|
+
export function setFragmentAsNodeSplit($pos, newTr, inserted, attrs) {
|
|
60
|
+
const lastChild = inserted.lastChild;
|
|
61
|
+
const referenceId = uuidv4();
|
|
62
|
+
const listItemSplit = lastChild.type.name === 'list_item' ? 1 : 0;
|
|
63
|
+
const parentPos = $pos.before($pos.depth - listItemSplit);
|
|
64
|
+
const parent = $pos.node($pos.depth - listItemSplit);
|
|
65
|
+
const oldDataTracked = getBlockInlineTrackedData(parent) || [];
|
|
66
|
+
newTr.setNodeMarkup(parentPos, undefined, Object.assign(Object.assign({}, parent.attrs), { dataTracked: [
|
|
67
|
+
...oldDataTracked.filter((c) => c.operation !== 'reference'),
|
|
68
|
+
Object.assign({}, addTrackIdIfDoesntExist(trackUtils.createNewSplitSourceAttrs(Object.assign(Object.assign({}, attrs), { status: CHANGE_STATUS.rejected }), referenceId))),
|
|
69
|
+
] }));
|
|
70
|
+
const splitSource = oldDataTracked.find((c) => c.operation === 'reference');
|
|
71
|
+
const dataTracked = Object.assign(Object.assign({}, trackUtils.createNewSplitAttrs(Object.assign({}, attrs))), { id: referenceId });
|
|
72
|
+
inserted = inserted.replaceChild(inserted.childCount - 1, lastChild.type.create(Object.assign(Object.assign({}, lastChild.attrs), { dataTracked: splitSource ? [dataTracked, splitSource] : [dataTracked] }), lastChild.content));
|
|
73
|
+
return inserted;
|
|
74
|
+
}
|
|
@@ -16,9 +16,9 @@ export function deleteNode(node, pos, tr) {
|
|
|
16
16
|
}
|
|
17
17
|
export function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
|
|
18
18
|
const dataTracked = getBlockInlineTrackedData(node);
|
|
19
|
-
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.insert &&
|
|
19
|
+
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => (d.operation === CHANGE_OPERATION.insert || d.operation === CHANGE_OPERATION.wrap_with_node) &&
|
|
20
20
|
(d.status === CHANGE_STATUS.pending || d.status === CHANGE_STATUS.accepted));
|
|
21
|
-
const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.set_node_attributes);
|
|
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
22
|
if (inserted) {
|
|
23
23
|
return deleteNode(node, pos, newTr);
|
|
24
24
|
}
|
package/dist/es/plugin.js
CHANGED
|
@@ -14,6 +14,7 @@ import { getAction, hasAction, setAction, TrackChangesAction } from './actions';
|
|
|
14
14
|
import { applyAcceptedRejectedChanges } from './changes/applyChanges';
|
|
15
15
|
import { findChanges } from './changes/findChanges';
|
|
16
16
|
import { fixInconsistentChanges } from './changes/fixInconsistentChanges';
|
|
17
|
+
import { revertRejectedChanges } from './changes/revertChange';
|
|
17
18
|
import { updateChangeAttrs } from './changes/updateChangeAttrs';
|
|
18
19
|
import { ChangeSet } from './ChangeSet';
|
|
19
20
|
import { trackTransaction } from './steps/trackTransaction';
|
|
@@ -108,6 +109,7 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous', initi
|
|
|
108
109
|
createdTr = updateChangeAttrs(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
|
|
109
110
|
}
|
|
110
111
|
});
|
|
112
|
+
revertRejectedChanges(createdTr, oldState.schema, ids, changeSet, status);
|
|
111
113
|
}
|
|
112
114
|
else if (getAction(tr, TrackChangesAction.applyAndRemoveChanges)) {
|
|
113
115
|
const mapping = applyAcceptedRejectedChanges(createdTr, oldState.schema, changeSet.bothNodeChanges);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Slice } from 'prosemirror-model';
|
|
2
2
|
import { TrackChangesAction } from '../actions';
|
|
3
|
-
import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
|
|
3
|
+
import { setFragmentAsInserted, setFragmentAsWrapChange } from '../compute/setFragmentAsInserted';
|
|
4
4
|
import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
|
|
5
5
|
import { log } from '../utils/logger';
|
|
6
6
|
import * as trackUtils from '../utils/track-utils';
|
|
7
|
+
import { isWrapStep } from '../utils/track-utils';
|
|
7
8
|
export function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, currentStepDoc) {
|
|
8
9
|
log.info('###### ReplaceAroundStep ######');
|
|
9
10
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -16,6 +17,13 @@ export function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, current
|
|
|
16
17
|
const gap = currentStepDoc.slice(gapFrom, gapTo);
|
|
17
18
|
log.info('RETAINED GAP CONTENT', gap);
|
|
18
19
|
const { sliceWasSplit, newSliceContent, steps: deleteSteps, } = deleteAndMergeSplitNodes(from, to, { start: gapFrom, end: gapTo }, newTr.doc, newTr, oldState.schema, attrs, slice);
|
|
20
|
+
let fragment;
|
|
21
|
+
if (isWrapStep(step)) {
|
|
22
|
+
fragment = setFragmentAsWrapChange(newSliceContent, attrs, oldState.schema);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
fragment = setFragmentAsInserted(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
|
|
26
|
+
}
|
|
19
27
|
const steps = deleteSteps;
|
|
20
28
|
log.info('TR: new steps after applying delete', [...newTr.steps]);
|
|
21
29
|
log.info('DELETE STEPS: ', deleteSteps);
|
|
@@ -25,7 +33,7 @@ export function trackReplaceAroundStep(step, oldState, tr, newTr, attrs, current
|
|
|
25
33
|
log.info('newSliceContent', newSliceContent);
|
|
26
34
|
const openStart = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openStart;
|
|
27
35
|
const openEnd = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openEnd;
|
|
28
|
-
let insertedSlice = new Slice(
|
|
36
|
+
let insertedSlice = new Slice(fragment, openStart, openEnd);
|
|
29
37
|
if (gap.size > 0 || tr.getMeta(TrackChangesAction.updateMetaNode)) {
|
|
30
38
|
log.info('insertedSlice before inserted gap', insertedSlice);
|
|
31
39
|
insertedSlice = insertedSlice.insertAt(insertedSlice.size === 0 ? 0 : insert, gap.content);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Slice } from 'prosemirror-model';
|
|
2
|
-
import { setFragmentAsInserted } 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';
|
|
6
|
-
|
|
6
|
+
import { isSplitStep } from '../utils/track-utils';
|
|
7
|
+
export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc, tr) {
|
|
7
8
|
log.info('###### ReplaceStep ######');
|
|
8
9
|
let selectionPos = 0;
|
|
9
10
|
const changeSteps = [];
|
|
@@ -34,6 +35,10 @@ export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, curre
|
|
|
34
35
|
const textWasDeleted = !!changeSteps.length;
|
|
35
36
|
if (!backSpacedText && newSliceContent.size > 0) {
|
|
36
37
|
log.info('newSliceContent', newSliceContent);
|
|
38
|
+
let fragment = setFragmentAsInserted(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema);
|
|
39
|
+
if (isSplitStep(step, oldState.selection, tr.getMeta('uiEvent'))) {
|
|
40
|
+
fragment = setFragmentAsNodeSplit(newTr.doc.resolve(step.from), newTr, fragment, attrs);
|
|
41
|
+
}
|
|
37
42
|
const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
|
|
38
43
|
const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
|
|
39
44
|
changeSteps.push({
|
|
@@ -41,7 +46,7 @@ export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, curre
|
|
|
41
46
|
from: textWasDeleted ? fromB : toA,
|
|
42
47
|
to: textWasDeleted ? toB - 1 : toA,
|
|
43
48
|
sliceWasSplit,
|
|
44
|
-
slice: new Slice(
|
|
49
|
+
slice: new Slice(fragment, openStart, openEnd),
|
|
45
50
|
});
|
|
46
51
|
}
|
|
47
52
|
else {
|
|
@@ -49,7 +49,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
49
49
|
const thisStepMapping = tr.mapping.slice(i + 1);
|
|
50
50
|
const newStep = new ReplaceStep(thisStepMapping.map(invertedStep.from), thisStepMapping.map(invertedStep.to), invertedStep.slice);
|
|
51
51
|
const stepResult = newTr.maybeStep(isDelete ? invertedStep : newStep);
|
|
52
|
-
let [steps, startPos] = trackReplaceStep(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i]);
|
|
52
|
+
let [steps, startPos] = trackReplaceStep(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr);
|
|
53
53
|
if (steps.length === 1) {
|
|
54
54
|
const step = steps[0];
|
|
55
55
|
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]))) {
|
package/dist/es/types/change.js
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* © 2023 Atypon Systems LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
1
16
|
export var CHANGE_OPERATION;
|
|
2
17
|
(function (CHANGE_OPERATION) {
|
|
3
18
|
CHANGE_OPERATION["insert"] = "insert";
|
|
4
19
|
CHANGE_OPERATION["delete"] = "delete";
|
|
5
20
|
CHANGE_OPERATION["set_node_attributes"] = "set_attrs";
|
|
21
|
+
CHANGE_OPERATION["wrap_with_node"] = "wrap_with_node";
|
|
22
|
+
CHANGE_OPERATION["node_split"] = "node_split";
|
|
23
|
+
CHANGE_OPERATION["reference"] = "reference";
|
|
6
24
|
})(CHANGE_OPERATION || (CHANGE_OPERATION = {}));
|
|
7
25
|
export var CHANGE_STATUS;
|
|
8
26
|
(function (CHANGE_STATUS) {
|
|
@@ -13,6 +13,15 @@ import { CHANGE_OPERATION } from '../types/change';
|
|
|
13
13
|
export function createNewInsertAttrs(attrs) {
|
|
14
14
|
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.insert });
|
|
15
15
|
}
|
|
16
|
+
export function createNewWrapAttrs(attrs) {
|
|
17
|
+
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.wrap_with_node });
|
|
18
|
+
}
|
|
19
|
+
export function createNewSplitAttrs(attrs) {
|
|
20
|
+
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.node_split });
|
|
21
|
+
}
|
|
22
|
+
export function createNewSplitSourceAttrs(attrs, id) {
|
|
23
|
+
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.reference, referenceId: id });
|
|
24
|
+
}
|
|
16
25
|
export function createNewDeleteAttrs(attrs) {
|
|
17
26
|
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.delete });
|
|
18
27
|
}
|
|
@@ -20,3 +29,31 @@ export function createNewUpdateAttrs(attrs, oldAttrs) {
|
|
|
20
29
|
const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
|
|
21
30
|
return Object.assign(Object.assign({}, attrs), { operation: CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
|
|
22
31
|
}
|
|
32
|
+
export const isSplitStep = (step, selection, uiEvent) => {
|
|
33
|
+
var _a, _b, _c, _d;
|
|
34
|
+
const { from, to, slice } = step;
|
|
35
|
+
if (from !== to ||
|
|
36
|
+
slice.content.childCount < 2 ||
|
|
37
|
+
(((_a = slice.content.firstChild) === null || _a === void 0 ? void 0 : _a.isInline) && ((_b = slice.content.lastChild) === null || _b === void 0 ? void 0 : _b.isInline))) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const { $anchor: { parentOffset: startOffset }, $head: { parentOffset: endOffset }, $from, } = selection;
|
|
41
|
+
const parentSize = $from.node().content.size;
|
|
42
|
+
if (uiEvent === 'paste') {
|
|
43
|
+
return !((startOffset === 0 && endOffset === 0) ||
|
|
44
|
+
(startOffset === parentSize && endOffset === parentSize));
|
|
45
|
+
}
|
|
46
|
+
const { content: { firstChild, lastChild }, openStart, openEnd, } = slice;
|
|
47
|
+
if ((((_c = window.event) === null || _c === void 0 ? void 0 : _c.code) === 'Enter' || ((_d = window.event) === null || _d === void 0 ? void 0 : _d.code) === 'NumpadEnter') &&
|
|
48
|
+
(firstChild === null || firstChild === void 0 ? void 0 : firstChild.type.name) === 'list_item') {
|
|
49
|
+
return !(parentSize === startOffset && parentSize === endOffset) && (lastChild === null || lastChild === void 0 ? void 0 : lastChild.type.name) === 'list_item';
|
|
50
|
+
}
|
|
51
|
+
return (openStart === openEnd &&
|
|
52
|
+
firstChild.type === lastChild.type &&
|
|
53
|
+
firstChild.inlineContent &&
|
|
54
|
+
lastChild.inlineContent);
|
|
55
|
+
};
|
|
56
|
+
export const isWrapStep = (step) => step.from === step.gapFrom &&
|
|
57
|
+
step.to === step.gapTo &&
|
|
58
|
+
step.slice.openStart === 0 &&
|
|
59
|
+
step.slice.openEnd === 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IncompleteChange, NodeAttrChange, NodeChange, TextChange, TrackedAttrs, TrackedChange } from './types/change';
|
|
1
|
+
import { IncompleteChange, NodeAttrChange, NodeChange, ReferenceChange, TextChange, TrackedAttrs, TrackedChange } from './types/change';
|
|
2
2
|
export declare class ChangeSet {
|
|
3
3
|
#private;
|
|
4
4
|
constructor(changes?: (TrackedChange | IncompleteChange)[]);
|
|
@@ -29,4 +29,5 @@ export declare class ChangeSet {
|
|
|
29
29
|
static isTextChange(change: TrackedChange): change is TextChange;
|
|
30
30
|
static isNodeChange(change: TrackedChange): change is NodeChange;
|
|
31
31
|
static isNodeAttrChange(change: TrackedChange): change is NodeAttrChange;
|
|
32
|
+
static isReferenceChange(change: TrackedChange): change is ReferenceChange;
|
|
32
33
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Schema } from 'prosemirror-model';
|
|
2
2
|
import { Transaction } from 'prosemirror-state';
|
|
3
3
|
import { Mapping } from 'prosemirror-transform';
|
|
4
|
-
import { TrackedChange } from '../types/change';
|
|
4
|
+
import { TrackedAttrs, TrackedChange } from '../types/change';
|
|
5
|
+
export declare function getUpdatedDataTracked(dataTracked: TrackedAttrs[] | null, changeId: string): TrackedAttrs[] | null;
|
|
5
6
|
export declare function applyAcceptedRejectedChanges(tr: Transaction, schema: Schema, changes: TrackedChange[], deleteMap?: Mapping): Mapping;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Schema } from 'prosemirror-model';
|
|
2
|
+
import { Transaction } from 'prosemirror-state';
|
|
3
|
+
import { ChangeSet } from '../ChangeSet';
|
|
4
|
+
import { CHANGE_STATUS } from '../types/change';
|
|
5
|
+
export declare function revertRejectedChanges(tr: Transaction, schema: Schema, ids: string[], changeSet: ChangeSet, status: CHANGE_STATUS): void;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { Fragment, Schema } from 'prosemirror-model';
|
|
2
|
-
import {
|
|
1
|
+
import { Fragment, ResolvedPos, Schema } from 'prosemirror-model';
|
|
2
|
+
import { Transaction } from 'prosemirror-state';
|
|
3
|
+
import { NewEmptyAttrs, NewInsertAttrs } from '../types/track';
|
|
3
4
|
export declare function setFragmentAsInserted(inserted: Fragment, insertAttrs: NewInsertAttrs, schema: Schema): Fragment;
|
|
5
|
+
export declare function setFragmentAsWrapChange(inserted: Fragment, attrs: NewEmptyAttrs, schema: Schema): Fragment;
|
|
6
|
+
export declare function setFragmentAsNodeSplit($pos: ResolvedPos, newTr: Transaction, inserted: Fragment, attrs: NewEmptyAttrs): Fragment;
|
|
@@ -3,4 +3,4 @@ import type { EditorState, Transaction } from 'prosemirror-state';
|
|
|
3
3
|
import { ReplaceStep, StepResult } from 'prosemirror-transform';
|
|
4
4
|
import { ChangeStep } from '../types/step';
|
|
5
5
|
import { NewEmptyAttrs } from '../types/track';
|
|
6
|
-
export declare function trackReplaceStep(step: ReplaceStep, oldState: EditorState, newTr: Transaction, attrs: NewEmptyAttrs, stepResult: StepResult, currentStepDoc: PMNode): [ChangeStep[], number];
|
|
6
|
+
export declare function trackReplaceStep(step: ReplaceStep, oldState: EditorState, newTr: Transaction, attrs: NewEmptyAttrs, stepResult: StepResult, currentStepDoc: PMNode, tr: Transaction): [ChangeStep[], number];
|
|
@@ -1,7 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* © 2023 Atypon Systems LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Node, NodeType } from 'prosemirror-model';
|
|
1
17
|
export declare enum CHANGE_OPERATION {
|
|
2
18
|
insert = "insert",
|
|
3
19
|
delete = "delete",
|
|
4
|
-
set_node_attributes = "set_attrs"
|
|
20
|
+
set_node_attributes = "set_attrs",
|
|
21
|
+
wrap_with_node = "wrap_with_node",
|
|
22
|
+
node_split = "node_split",
|
|
23
|
+
reference = "reference"
|
|
5
24
|
}
|
|
6
25
|
export declare enum CHANGE_STATUS {
|
|
7
26
|
accepted = "accepted",
|
|
@@ -22,7 +41,17 @@ export type UpdateAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
|
|
|
22
41
|
operation: CHANGE_OPERATION.set_node_attributes;
|
|
23
42
|
oldAttrs: Record<string, any>;
|
|
24
43
|
};
|
|
25
|
-
export type
|
|
44
|
+
export type WrapAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
|
|
45
|
+
operation: CHANGE_OPERATION.wrap_with_node;
|
|
46
|
+
};
|
|
47
|
+
export type NodeSplitAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
|
|
48
|
+
operation: CHANGE_OPERATION.node_split;
|
|
49
|
+
};
|
|
50
|
+
export type ReferenceAttrs = Omit<InsertDeleteAttrs, 'operation'> & {
|
|
51
|
+
operation: CHANGE_OPERATION.reference;
|
|
52
|
+
referenceId: string;
|
|
53
|
+
};
|
|
54
|
+
export type TrackedAttrs = InsertDeleteAttrs | UpdateAttrs | WrapAttrs | NodeSplitAttrs | ReferenceAttrs;
|
|
26
55
|
type Change = {
|
|
27
56
|
id: string;
|
|
28
57
|
from: number;
|
|
@@ -32,15 +61,17 @@ type Change = {
|
|
|
32
61
|
export type TextChange = Change & {
|
|
33
62
|
type: 'text-change';
|
|
34
63
|
text: string;
|
|
64
|
+
nodeType: NodeType;
|
|
35
65
|
};
|
|
36
66
|
export type NodeChange = Change & {
|
|
37
67
|
type: 'node-change';
|
|
38
|
-
|
|
68
|
+
node: Node;
|
|
69
|
+
attrs: Record<string, any>;
|
|
39
70
|
children: TrackedChange[];
|
|
40
71
|
};
|
|
41
72
|
export type NodeAttrChange = Change & {
|
|
42
73
|
type: 'node-attr-change';
|
|
43
|
-
|
|
74
|
+
node: Node;
|
|
44
75
|
oldAttrs: Record<string, any>;
|
|
45
76
|
newAttrs: Record<string, any>;
|
|
46
77
|
};
|
|
@@ -48,10 +79,13 @@ export type WrapChange = Change & {
|
|
|
48
79
|
type: 'wrap-change';
|
|
49
80
|
wrapperNode: string;
|
|
50
81
|
};
|
|
82
|
+
export type ReferenceChange = Change & {
|
|
83
|
+
type: 'reference-change';
|
|
84
|
+
};
|
|
51
85
|
export type MarkChange = Change & {
|
|
52
86
|
type: 'mark-change';
|
|
53
87
|
};
|
|
54
|
-
export type TrackedChange = TextChange | NodeChange | NodeAttrChange | WrapChange | MarkChange;
|
|
88
|
+
export type TrackedChange = TextChange | NodeChange | NodeAttrChange | WrapChange | ReferenceChange | MarkChange;
|
|
55
89
|
export type PartialChange<T extends TrackedChange> = Omit<T, 'dataTracked'> & {
|
|
56
90
|
dataTracked: Partial<TrackedAttrs>;
|
|
57
91
|
};
|
|
@@ -14,7 +14,7 @@ export interface TrackChangesState {
|
|
|
14
14
|
}
|
|
15
15
|
export type NewEmptyAttrs = Omit<TrackedAttrs, 'id' | 'operation'>;
|
|
16
16
|
export type NewInsertAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
|
|
17
|
-
operation: CHANGE_OPERATION.insert;
|
|
17
|
+
operation: CHANGE_OPERATION.insert | CHANGE_OPERATION.wrap_with_node;
|
|
18
18
|
};
|
|
19
19
|
export type NewDeleteAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
|
|
20
20
|
operation: CHANGE_OPERATION.delete;
|
|
@@ -23,6 +23,13 @@ export type NewUpdateAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
|
|
|
23
23
|
operation: CHANGE_OPERATION.set_node_attributes;
|
|
24
24
|
oldAttrs: Record<string, any>;
|
|
25
25
|
};
|
|
26
|
+
export type NewSplitNodeAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
|
|
27
|
+
operation: CHANGE_OPERATION.node_split;
|
|
28
|
+
};
|
|
29
|
+
export type NewReferenceAttrs = Omit<TrackedAttrs, 'id' | 'operation'> & {
|
|
30
|
+
operation: CHANGE_OPERATION.reference;
|
|
31
|
+
referenceId: string;
|
|
32
|
+
};
|
|
26
33
|
export type NewTrackedAttrs = NewInsertAttrs | NewDeleteAttrs | NewUpdateAttrs;
|
|
27
34
|
export declare enum TrackChangesStatus {
|
|
28
35
|
enabled = "enabled",
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Selection } from 'prosemirror-state';
|
|
2
|
+
import { ReplaceAroundStep, ReplaceStep } from 'prosemirror-transform';
|
|
3
|
+
import { NewDeleteAttrs, NewEmptyAttrs, NewInsertAttrs, NewReferenceAttrs, NewSplitNodeAttrs, NewUpdateAttrs } from '../types/track';
|
|
2
4
|
export declare function createNewInsertAttrs(attrs: NewEmptyAttrs): NewInsertAttrs;
|
|
5
|
+
export declare function createNewWrapAttrs(attrs: NewEmptyAttrs): NewInsertAttrs;
|
|
6
|
+
export declare function createNewSplitAttrs(attrs: NewEmptyAttrs): NewSplitNodeAttrs;
|
|
7
|
+
export declare function createNewSplitSourceAttrs(attrs: NewEmptyAttrs, id: string): NewReferenceAttrs;
|
|
3
8
|
export declare function createNewDeleteAttrs(attrs: NewEmptyAttrs): NewDeleteAttrs;
|
|
4
9
|
export declare function createNewUpdateAttrs(attrs: NewEmptyAttrs, oldAttrs: Record<string, any>): NewUpdateAttrs;
|
|
10
|
+
export declare const isSplitStep: (step: ReplaceStep, selection: Selection, uiEvent: string) => boolean;
|
|
11
|
+
export declare const isWrapStep: (step: ReplaceAroundStep) => boolean;
|
package/package.json
CHANGED