@manuscripts/track-changes-plugin 2.1.1 → 2.2.1
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 +23 -9
- package/dist/cjs/actions.js +3 -1
- package/dist/cjs/{changes/applyChanges.js → applyChanges.js} +16 -16
- package/dist/cjs/{changes → changeHelpers}/revertChange.js +3 -4
- package/dist/cjs/{mutate/dropStructureChange.js → changeHelpers/structureChange.js} +23 -17
- package/dist/cjs/{changes → changeHelpers}/updateChangeAttrs.js +4 -5
- package/dist/cjs/{changes → changeHelpers}/updateChangesStatus.js +5 -5
- package/dist/cjs/{changes/findChanges.js → findChanges.js} +5 -5
- package/dist/cjs/helpers/attributes.js +157 -0
- package/dist/cjs/{compute/setFragmentAsInserted.js → helpers/fragment.js} +71 -79
- package/dist/cjs/helpers/mark.js +19 -0
- package/dist/cjs/plugin.js +13 -22
- package/dist/cjs/trackChanges.js +47 -0
- package/dist/cjs/{change-steps → tracking/change-step}/diffChangeSteps.js +23 -28
- package/dist/cjs/{utils/mapChangeStep.js → tracking/change-step/mapChangeSteps.js} +1 -1
- package/dist/cjs/{change-steps → tracking/change-step}/processChangeSteps.js +14 -48
- package/dist/cjs/tracking/fixAndHandleSelection.js +54 -0
- package/dist/cjs/{mutate → tracking/lib}/deleteAndMergeSplitNodes.js +7 -40
- package/dist/cjs/{mutate → tracking/lib}/deleteNode.js +8 -9
- package/dist/cjs/{mutate/deleteText.js → tracking/lib/deleteTextIfInserted.js} +4 -4
- package/dist/cjs/{change-steps → tracking/lib}/matchInserted.js +15 -23
- package/dist/cjs/{mutate → tracking/lib}/mergeTrackedMarks.js +3 -3
- package/dist/cjs/tracking/lib/processStepsBeforeTracking.js +17 -0
- package/dist/cjs/{steps/utils.js → tracking/steps-trackers/qualifiers.js} +37 -10
- package/dist/cjs/{steps/trackAttrsChange.js → tracking/steps-trackers/trackAttrsChangeStep.js} +3 -3
- package/dist/cjs/{steps → tracking/steps-trackers}/trackMarkSteps.js +14 -11
- package/dist/cjs/{steps → tracking/steps-trackers}/trackReplaceAroundStep.js +12 -46
- package/dist/cjs/tracking/steps-trackers/trackReplaceStep.js +85 -0
- package/dist/cjs/tracking/trackTransaction.js +93 -0
- package/dist/cjs/tracking/transactionProcessing.js +164 -0
- package/dist/cjs/tracking/types.js +17 -0
- package/dist/es/ChangeSet.js +23 -9
- package/dist/es/actions.js +1 -0
- package/dist/es/{changes/applyChanges.js → applyChanges.js} +10 -10
- package/dist/es/{changes → changeHelpers}/revertChange.js +1 -2
- package/dist/es/{mutate/dropStructureChange.js → changeHelpers/structureChange.js} +10 -5
- package/dist/es/{changes → changeHelpers}/updateChangeAttrs.js +2 -3
- package/dist/es/{changes → changeHelpers}/updateChangesStatus.js +4 -4
- package/dist/es/{changes/findChanges.js → findChanges.js} +3 -3
- package/dist/es/helpers/attributes.js +136 -0
- package/dist/es/{compute/setFragmentAsInserted.js → helpers/fragment.js} +66 -42
- package/dist/es/helpers/mark.js +15 -0
- package/dist/es/plugin.js +12 -21
- package/dist/es/trackChanges.js +44 -0
- package/dist/es/{change-steps → tracking/change-step}/diffChangeSteps.js +23 -28
- package/dist/es/{utils/mapChangeStep.js → tracking/change-step/mapChangeSteps.js} +1 -1
- package/dist/es/{change-steps → tracking/change-step}/processChangeSteps.js +10 -11
- package/dist/es/tracking/fixAndHandleSelection.js +49 -0
- package/dist/es/{mutate → tracking/lib}/deleteAndMergeSplitNodes.js +7 -7
- package/dist/es/{mutate → tracking/lib}/deleteNode.js +4 -5
- package/dist/es/{mutate/deleteText.js → tracking/lib/deleteTextIfInserted.js} +1 -1
- package/dist/es/{change-steps → tracking/lib}/matchInserted.js +15 -23
- package/dist/es/{mutate → tracking/lib}/mergeTrackedMarks.js +2 -2
- package/dist/es/tracking/lib/processStepsBeforeTracking.js +14 -0
- package/dist/es/{steps/utils.js → tracking/steps-trackers/qualifiers.js} +32 -7
- package/dist/es/{steps/trackAttrsChange.js → tracking/steps-trackers/trackAttrsChangeStep.js} +3 -3
- package/dist/es/{steps → tracking/steps-trackers}/trackMarkSteps.js +6 -3
- package/dist/es/{steps → tracking/steps-trackers}/trackReplaceAroundStep.js +9 -10
- package/dist/es/{steps → tracking/steps-trackers}/trackReplaceStep.js +34 -26
- package/dist/es/tracking/trackTransaction.js +87 -0
- package/dist/es/tracking/transactionProcessing.js +153 -0
- package/dist/es/tracking/types.js +16 -0
- package/dist/types/ChangeSet.d.ts +4 -1
- package/dist/types/actions.d.ts +1 -0
- package/dist/types/applyChanges.d.ts +6 -0
- package/dist/types/{mutate/dropStructureChange.d.ts → changeHelpers/structureChange.d.ts} +2 -1
- package/dist/types/{changes/findChanges.d.ts → findChanges.d.ts} +1 -1
- package/dist/types/helpers/attributes.d.ts +47 -0
- package/dist/types/{compute/setFragmentAsInserted.d.ts → helpers/fragment.d.ts} +3 -1
- package/dist/types/helpers/mark.d.ts +3 -0
- package/dist/types/trackChanges.d.ts +17 -0
- package/dist/types/tracking/change-step/diffChangeSteps.d.ts +17 -0
- package/dist/types/{utils/mapChangeStep.d.ts → tracking/change-step/mapChangeSteps.d.ts} +2 -2
- package/dist/types/tracking/change-step/processChangeSteps.d.ts +6 -0
- package/dist/types/tracking/fixAndHandleSelection.d.ts +20 -0
- package/dist/types/{mutate → tracking/lib}/deleteAndMergeSplitNodes.d.ts +4 -5
- package/dist/types/{mutate → tracking/lib}/deleteNode.d.ts +2 -2
- package/dist/types/{mutate/deleteText.d.ts → tracking/lib/deleteTextIfInserted.d.ts} +1 -1
- package/dist/types/tracking/lib/matchInserted.d.ts +18 -0
- package/dist/types/tracking/lib/processStepsBeforeTracking.d.ts +4 -0
- package/dist/types/{compute → tracking/lib}/splitSliceIntoMergedParts.d.ts +1 -1
- package/dist/types/{steps/utils.d.ts → tracking/steps-trackers/qualifiers.d.ts} +5 -3
- package/dist/types/{steps/trackAttrsChange.d.ts → tracking/steps-trackers/trackAttrsChangeStep.d.ts} +4 -4
- package/dist/types/{steps → tracking/steps-trackers}/trackMarkSteps.d.ts +1 -1
- package/dist/types/{steps → tracking/steps-trackers}/trackReplaceAroundStep.d.ts +2 -2
- package/dist/types/tracking/steps-trackers/trackReplaceStep.d.ts +5 -0
- package/dist/types/tracking/trackTransaction.d.ts +4 -0
- package/dist/types/tracking/transactionProcessing.d.ts +12 -0
- package/dist/types/tracking/types.d.ts +65 -0
- package/dist/types/types/change.d.ts +1 -1
- package/dist/types/types/track.d.ts +0 -30
- package/package.json +17 -14
- package/dist/cjs/compute/nodeHelpers.js +0 -83
- package/dist/cjs/steps/trackReplaceStep.js +0 -110
- package/dist/cjs/steps/trackTransaction.js +0 -162
- package/dist/cjs/types/step.js +0 -2
- package/dist/cjs/utils/track-utils.js +0 -239
- package/dist/es/compute/nodeHelpers.js +0 -73
- package/dist/es/steps/trackTransaction.js +0 -156
- package/dist/es/types/step.js +0 -1
- package/dist/es/utils/track-utils.js +0 -217
- package/dist/types/change-steps/diffChangeSteps.d.ts +0 -2
- package/dist/types/change-steps/matchInserted.d.ts +0 -3
- package/dist/types/change-steps/processChangeSteps.d.ts +0 -6
- package/dist/types/changes/applyChanges.d.ts +0 -6
- package/dist/types/compute/nodeHelpers.d.ts +0 -14
- package/dist/types/steps/trackReplaceStep.d.ts +0 -6
- package/dist/types/steps/trackTransaction.d.ts +0 -3
- package/dist/types/types/step.d.ts +0 -40
- package/dist/types/utils/track-utils.d.ts +0 -24
- /package/dist/cjs/{changes → changeHelpers}/fixInconsistentChanges.js +0 -0
- /package/dist/cjs/{mutate → tracking/lib}/mergeNode.js +0 -0
- /package/dist/cjs/{compute → tracking/lib}/splitSliceIntoMergedParts.js +0 -0
- /package/dist/es/{changes → changeHelpers}/fixInconsistentChanges.js +0 -0
- /package/dist/es/{mutate → tracking/lib}/mergeNode.js +0 -0
- /package/dist/es/{compute → tracking/lib}/splitSliceIntoMergedParts.js +0 -0
- /package/dist/types/{changes → changeHelpers}/fixInconsistentChanges.d.ts +0 -0
- /package/dist/types/{changes → changeHelpers}/revertChange.d.ts +0 -0
- /package/dist/types/{changes → changeHelpers}/updateChangeAttrs.d.ts +0 -0
- /package/dist/types/{changes → changeHelpers}/updateChangesStatus.d.ts +0 -0
- /package/dist/types/{mutate → tracking/lib}/mergeNode.d.ts +0 -0
- /package/dist/types/{mutate → tracking/lib}/mergeTrackedMarks.d.ts +0 -0
package/dist/cjs/ChangeSet.js
CHANGED
|
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.ChangeSet = void 0;
|
|
16
16
|
const change_1 = require("./types/change");
|
|
17
17
|
const logger_1 = require("./utils/logger");
|
|
18
|
-
const track_utils_1 = require("./utils/track-utils");
|
|
19
18
|
class ChangeSet {
|
|
20
19
|
constructor(changes = []) {
|
|
21
20
|
_ChangeSet_instances.add(this);
|
|
@@ -172,9 +171,8 @@ class ChangeSet {
|
|
|
172
171
|
if (!nextChange) {
|
|
173
172
|
return false;
|
|
174
173
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
isInline(nextChange) &&
|
|
174
|
+
return (ChangeSet.isInline(change) &&
|
|
175
|
+
ChangeSet.isInline(nextChange) &&
|
|
178
176
|
change.to === nextChange.from &&
|
|
179
177
|
(change.dataTracked.operation === nextChange.dataTracked.operation ||
|
|
180
178
|
this.areMatchingWrapOperations(change, nextChange) ||
|
|
@@ -199,11 +197,13 @@ class ChangeSet {
|
|
|
199
197
|
}
|
|
200
198
|
static shouldDeleteChange(change) {
|
|
201
199
|
const { status, operation } = change.dataTracked;
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
200
|
+
const allowedRejectedForDeletion = [
|
|
201
|
+
change_1.CHANGE_OPERATION.insert,
|
|
202
|
+
change_1.CHANGE_OPERATION.node_split,
|
|
203
|
+
change_1.CHANGE_OPERATION.wrap_with_node,
|
|
204
|
+
change_1.CHANGE_OPERATION.move,
|
|
205
|
+
];
|
|
206
|
+
return ((allowedRejectedForDeletion.includes(operation) && status === change_1.CHANGE_STATUS.rejected) ||
|
|
207
207
|
(operation === change_1.CHANGE_OPERATION.delete && status === change_1.CHANGE_STATUS.accepted));
|
|
208
208
|
}
|
|
209
209
|
static isValidDataTracked(dataTracked = {}) {
|
|
@@ -226,6 +226,17 @@ class ChangeSet {
|
|
|
226
226
|
optionalEntries.every(([key, val]) => optionalKeys.includes(key) && val !== undefined) &&
|
|
227
227
|
(dataTracked.id || '').length > 0);
|
|
228
228
|
}
|
|
229
|
+
static isInlineMarkChange(change) {
|
|
230
|
+
if (ChangeSet.isMarkChange(change)) {
|
|
231
|
+
return change.nodeType.isInline || change.nodeType.isText;
|
|
232
|
+
}
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
static isInline(c) {
|
|
236
|
+
return (c.type === 'text-change' ||
|
|
237
|
+
(c.type === 'node-change' && c.node.isInline) ||
|
|
238
|
+
ChangeSet.isInlineMarkChange(c));
|
|
239
|
+
}
|
|
229
240
|
static isTextChange(change) {
|
|
230
241
|
return change.type === 'text-change';
|
|
231
242
|
}
|
|
@@ -241,6 +252,9 @@ class ChangeSet {
|
|
|
241
252
|
static isReferenceChange(change) {
|
|
242
253
|
return change.type === 'reference-change';
|
|
243
254
|
}
|
|
255
|
+
static isPendingChange(trackedAttrs, operation) {
|
|
256
|
+
return !!(trackedAttrs === null || trackedAttrs === void 0 ? void 0 : trackedAttrs.some((t) => t.operation === operation));
|
|
257
|
+
}
|
|
244
258
|
}
|
|
245
259
|
exports.ChangeSet = ChangeSet;
|
|
246
260
|
_ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
|
package/dist/cjs/actions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.skipTracking = exports.TrackChangesAction = void 0;
|
|
3
|
+
exports.isIndentationAction = exports.skipTracking = exports.TrackChangesAction = void 0;
|
|
4
4
|
exports.hasAction = hasAction;
|
|
5
5
|
exports.getAction = getAction;
|
|
6
6
|
exports.setAction = setAction;
|
|
@@ -26,3 +26,5 @@ function setAction(tr, action, payload) {
|
|
|
26
26
|
}
|
|
27
27
|
const skipTracking = (tr) => setAction(tr, TrackChangesAction.skipTrack, true);
|
|
28
28
|
exports.skipTracking = skipTracking;
|
|
29
|
+
const isIndentationAction = (action) => action === 'indent' || action === 'unindent';
|
|
30
|
+
exports.isIndentationAction = isIndentationAction;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.applyChanges = applyChanges;
|
|
4
4
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
5
|
+
const revertChange_1 = require("./changeHelpers/revertChange");
|
|
6
|
+
const updateChangeAttrs_1 = require("./changeHelpers/updateChangeAttrs");
|
|
7
|
+
const ChangeSet_1 = require("./ChangeSet");
|
|
8
|
+
const attributes_1 = require("./helpers/attributes");
|
|
9
|
+
const deleteNode_1 = require("./tracking/lib/deleteNode");
|
|
10
|
+
const mergeNode_1 = require("./tracking/lib/mergeNode");
|
|
11
|
+
const change_1 = require("./types/change");
|
|
12
|
+
const logger_1 = require("./utils/logger");
|
|
13
13
|
function collectMoveNodeIds(containerNode, primaryMoveNodeId) {
|
|
14
14
|
const moveNodeIds = new Set();
|
|
15
15
|
moveNodeIds.add(primaryMoveNodeId);
|
|
@@ -25,7 +25,7 @@ function collectMoveNodeIds(containerNode, primaryMoveNodeId) {
|
|
|
25
25
|
});
|
|
26
26
|
return moveNodeIds;
|
|
27
27
|
}
|
|
28
|
-
function
|
|
28
|
+
function applyChanges(tr, schema, changes, changeSet, deleteMap = new prosemirror_transform_1.Mapping()) {
|
|
29
29
|
changes.sort((c1, c2) => {
|
|
30
30
|
if ((c1.type === 'node-change' && c1.node.type === schema.nodes.list) ||
|
|
31
31
|
(c2.type === 'node-change' && c2.node.type === schema.nodes.list)) {
|
|
@@ -84,23 +84,23 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
|
|
|
84
84
|
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
85
85
|
}
|
|
86
86
|
else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
|
|
87
|
-
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.newAttrs), { dataTracked: (0,
|
|
87
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.newAttrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
|
|
88
88
|
}
|
|
89
89
|
else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
|
|
90
|
-
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: (0,
|
|
90
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
|
|
91
91
|
}
|
|
92
92
|
else if (ChangeSet_1.ChangeSet.isReferenceChange(change)) {
|
|
93
|
-
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: (0,
|
|
93
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
|
|
94
94
|
}
|
|
95
95
|
else if (ChangeSet_1.ChangeSet.isMarkChange(change)) {
|
|
96
96
|
const newMark = change.mark.type.create({
|
|
97
|
-
dataTracked: (0,
|
|
97
|
+
dataTracked: (0, attributes_1.excludeFromTracked)(change.mark.attrs.dataTracked, change.id),
|
|
98
98
|
});
|
|
99
99
|
const isInsert = change.dataTracked.operation === change_1.CHANGE_OPERATION.insert;
|
|
100
100
|
const isDelete = change.dataTracked.operation === change_1.CHANGE_OPERATION.delete;
|
|
101
101
|
const toBeRestored = (change.dataTracked.status === change_1.CHANGE_STATUS.accepted && isInsert) ||
|
|
102
102
|
(change.dataTracked.status === change_1.CHANGE_STATUS.rejected && isDelete);
|
|
103
|
-
if (
|
|
103
|
+
if (ChangeSet_1.ChangeSet.isInlineMarkChange(change)) {
|
|
104
104
|
tr.removeMark(change.from, change.to, change.mark);
|
|
105
105
|
if (toBeRestored) {
|
|
106
106
|
tr.addMark(change.from, change.to, newMark);
|
|
@@ -128,7 +128,7 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
|
|
|
128
128
|
return;
|
|
129
129
|
}
|
|
130
130
|
if (change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
|
|
131
|
-
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: (0,
|
|
131
|
+
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) });
|
|
132
132
|
tr.setNodeMarkup(from, undefined, attrs, node.marks);
|
|
133
133
|
const originalChanges = changeSet.changes.filter((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
|
|
134
134
|
c.dataTracked.operation === change_1.CHANGE_OPERATION.delete);
|
|
@@ -4,8 +4,7 @@ exports.revertSplitNodeChange = revertSplitNodeChange;
|
|
|
4
4
|
exports.revertWrapNodeChange = revertWrapNodeChange;
|
|
5
5
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
6
6
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
7
|
-
const
|
|
8
|
-
const track_utils_1 = require("../utils/track-utils");
|
|
7
|
+
const attributes_1 = require("../helpers/attributes");
|
|
9
8
|
function revertSplitNodeChange(tr, change, changeSet) {
|
|
10
9
|
const sourceChange = changeSet.changes.find((c) => c.dataTracked.operation === 'reference' && c.dataTracked.referenceId === change.id);
|
|
11
10
|
const node = tr.doc.nodeAt(tr.mapping.map(change.from));
|
|
@@ -17,14 +16,14 @@ function revertSplitNodeChange(tr, change, changeSet) {
|
|
|
17
16
|
const childSource = changeSet.changes.find((c) => c.from === change.from && c.dataTracked.operation === 'reference');
|
|
18
17
|
if (childSource) {
|
|
19
18
|
const node = tr.doc.nodeAt(tr.mapping.map(sourceChange.from));
|
|
20
|
-
const data = (0,
|
|
19
|
+
const data = (0, attributes_1.getBlockInlineTrackedData)(node) || [];
|
|
21
20
|
const dataTracked = data.map((c) => (c.operation === 'reference' ? childSource.dataTracked : c));
|
|
22
21
|
tr.setNodeMarkup(tr.mapping.map(sourceChange.from), undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked }), node.marks);
|
|
23
22
|
}
|
|
24
23
|
const deleteChange = changeSet.changes.find((c) => c.dataTracked.operation == 'delete' && c.from === sourceChange.from);
|
|
25
24
|
if (deleteChange) {
|
|
26
25
|
const node = tr.doc.nodeAt(tr.mapping.map(deleteChange.from));
|
|
27
|
-
tr.setNodeMarkup(tr.mapping.map(deleteChange.from), undefined, (0,
|
|
26
|
+
tr.setNodeMarkup(tr.mapping.map(deleteChange.from), undefined, (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, deleteChange.id));
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
29
|
function revertWrapNodeChange(tr, change, deleteMap) {
|
|
@@ -11,15 +11,16 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.joinStructureChanges = exports.dropOrphanChanges = exports.dropStructuralChangeShadow = void 0;
|
|
14
|
+
exports.isStructuralChange = exports.joinStructureChanges = exports.dropOrphanChanges = exports.dropStructuralChangeShadow = void 0;
|
|
15
15
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
16
16
|
const prosemirror_state_1 = require("prosemirror-state");
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
17
|
+
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
18
|
+
const actions_1 = require("../actions");
|
|
19
|
+
const findChanges_1 = require("../findChanges");
|
|
20
|
+
const attributes_1 = require("../helpers/attributes");
|
|
21
|
+
const fragment_1 = require("../helpers/fragment");
|
|
21
22
|
const change_1 = require("../types/change");
|
|
22
|
-
const
|
|
23
|
+
const updateChangeAttrs_1 = require("./updateChangeAttrs");
|
|
23
24
|
const dropStructuralChangeShadow = (moveNodeId, tr) => {
|
|
24
25
|
const changeSet = (0, findChanges_1.findChanges)(prosemirror_state_1.EditorState.create({ doc: tr.doc }));
|
|
25
26
|
const changes = changeSet.changes.filter((c) => c.type === 'node-change' && c.dataTracked.moveNodeId === moveNodeId);
|
|
@@ -61,18 +62,18 @@ const dropOrphanChanges = (newTr) => {
|
|
|
61
62
|
if (c.dataTracked.operation === change_1.CHANGE_OPERATION.reference &&
|
|
62
63
|
!changesIds.has(c.dataTracked.referenceId)) {
|
|
63
64
|
const node = newTr.doc.nodeAt(c.from);
|
|
64
|
-
const dataTracked = node && ((0,
|
|
65
|
+
const dataTracked = node && ((0, attributes_1.getBlockInlineTrackedData)(node) || []).filter((d) => d.id !== c.id);
|
|
65
66
|
newTr.setNodeMarkup(c.from, undefined, Object.assign(Object.assign({}, node === null || node === void 0 ? void 0 : node.attrs), { dataTracked }));
|
|
66
67
|
}
|
|
67
68
|
if (c.type === 'node-change' &&
|
|
68
69
|
c.dataTracked.operation === change_1.CHANGE_OPERATION.node_split &&
|
|
69
70
|
!referenceIds.has(c.id)) {
|
|
70
71
|
const _a = c.dataTracked, { id } = _a, attrs = __rest(_a, ["id"]);
|
|
71
|
-
newTr.replaceWith(c.from, c.to, (0,
|
|
72
|
-
const referenceChanges = ((0,
|
|
72
|
+
newTr.replaceWith(c.from, c.to, (0, fragment_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
|
|
73
|
+
const referenceChanges = ((0, attributes_1.getBlockInlineTrackedData)(c.node) || []).filter((d) => d.operation === change_1.CHANGE_OPERATION.reference);
|
|
73
74
|
if (referenceChanges.length) {
|
|
74
75
|
const node = newTr.doc.nodeAt(c.from);
|
|
75
|
-
const dataTracked = (node && (0,
|
|
76
|
+
const dataTracked = (node && (0, attributes_1.getBlockInlineTrackedData)(node)) || [];
|
|
76
77
|
newTr.setNodeMarkup(c.from, undefined, Object.assign(Object.assign({}, node === null || node === void 0 ? void 0 : node.attrs), { dataTracked: [...dataTracked, ...referenceChanges] }));
|
|
77
78
|
}
|
|
78
79
|
}
|
|
@@ -88,7 +89,7 @@ const dropOrphanChanges = (newTr) => {
|
|
|
88
89
|
}
|
|
89
90
|
else if (c.type === 'node-change') {
|
|
90
91
|
const _b = c.dataTracked, { id, moveNodeId } = _b, attrs = __rest(_b, ["id", "moveNodeId"]);
|
|
91
|
-
newTr.replaceWith(c.from, c.to, (0,
|
|
92
|
+
newTr.replaceWith(c.from, c.to, (0, fragment_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
});
|
|
@@ -104,7 +105,7 @@ const groupStructureChanges = (tr, toNode) => {
|
|
|
104
105
|
.append(fromNodes)
|
|
105
106
|
.descendants((node) => {
|
|
106
107
|
var _a;
|
|
107
|
-
const moveNodeId = (_a = ((0,
|
|
108
|
+
const moveNodeId = (_a = ((0, attributes_1.getBlockInlineTrackedData)(node) || []).find((c) => c.operation === change_1.CHANGE_OPERATION.structure)) === null || _a === void 0 ? void 0 : _a.moveNodeId;
|
|
108
109
|
moveNodeId && moveNodeIds.add(moveNodeId);
|
|
109
110
|
});
|
|
110
111
|
return moveNodeIds;
|
|
@@ -118,14 +119,19 @@ const joinStructureChanges = (attrs, sliceContent, content, tr, newTr) => {
|
|
|
118
119
|
const changeSet = (0, findChanges_1.findChanges)(prosemirror_state_1.EditorState.create({ doc: newTr.doc }));
|
|
119
120
|
const relatedChanges = changeSet.changes.filter((c) => c.dataTracked.moveNodeId && idsSet.has(c.dataTracked.moveNodeId));
|
|
120
121
|
relatedChanges.map((c) => (0, updateChangeAttrs_1.updateChangeAttrs)(newTr, c, Object.assign(Object.assign({}, c.dataTracked), { moveNodeId }), newTr.doc.type.schema));
|
|
121
|
-
const toInsertChange = toNode && ((_b = (0,
|
|
122
|
+
const toInsertChange = toNode && ((_b = (0, attributes_1.getBlockInlineTrackedData)(toNode)) === null || _b === void 0 ? void 0 : _b.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
|
|
122
123
|
const fromInsertChange = sliceContent.firstChild &&
|
|
123
|
-
((_c = (0,
|
|
124
|
+
((_c = (0, attributes_1.getBlockInlineTrackedData)(sliceContent.firstChild)) === null || _c === void 0 ? void 0 : _c.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
|
|
124
125
|
if (toInsertChange || fromInsertChange) {
|
|
125
|
-
return (0,
|
|
126
|
+
return (0, fragment_1.setFragmentAsInserted)(content, (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema);
|
|
126
127
|
}
|
|
127
|
-
return (0,
|
|
128
|
-
return Object.assign(Object.assign({}, _), { dataTracked: [(0,
|
|
128
|
+
return (0, attributes_1.updateBlockNodesAttrs)(sliceContent, (_, node) => {
|
|
129
|
+
return Object.assign(Object.assign({}, _), { dataTracked: [(0, attributes_1.addTrackIdIfDoesntExist)((0, attributes_1.createNewStructureAttrs)(Object.assign(Object.assign({}, attrs), { moveNodeId })))] });
|
|
129
130
|
});
|
|
130
131
|
};
|
|
131
132
|
exports.joinStructureChanges = joinStructureChanges;
|
|
133
|
+
const isStructuralChange = (tr) => tr.getMeta(actions_1.TrackChangesAction.structuralChangeAction) &&
|
|
134
|
+
tr.steps.length === 2 &&
|
|
135
|
+
tr.steps[0] instanceof prosemirror_transform_1.ReplaceStep &&
|
|
136
|
+
tr.steps[1] instanceof prosemirror_transform_1.ReplaceStep;
|
|
137
|
+
exports.isStructuralChange = isStructuralChange;
|
|
@@ -4,10 +4,9 @@ exports.updateChangeAttrs = updateChangeAttrs;
|
|
|
4
4
|
exports.updateChangeChildrenAttributes = updateChangeChildrenAttributes;
|
|
5
5
|
exports.restoreNode = restoreNode;
|
|
6
6
|
const ChangeSet_1 = require("../ChangeSet");
|
|
7
|
-
const
|
|
7
|
+
const attributes_1 = require("../helpers/attributes");
|
|
8
8
|
const change_1 = require("../types/change");
|
|
9
9
|
const logger_1 = require("../utils/logger");
|
|
10
|
-
const track_utils_1 = require("../utils/track-utils");
|
|
11
10
|
function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
12
11
|
const node = tr.doc.nodeAt(change.from);
|
|
13
12
|
if (!node) {
|
|
@@ -15,7 +14,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
|
15
14
|
return tr;
|
|
16
15
|
}
|
|
17
16
|
const { operation } = trackedAttrs;
|
|
18
|
-
const oldTrackData = change.type === 'text-change' ? (0,
|
|
17
|
+
const oldTrackData = change.type === 'text-change' ? (0, attributes_1.getTextNodeTrackedMarkData)(node, schema) : (0, attributes_1.getBlockInlineTrackedData)(node);
|
|
19
18
|
if (!operation) {
|
|
20
19
|
logger_1.log.warn('updateChangeAttrs: unable to determine operation of change ', change);
|
|
21
20
|
}
|
|
@@ -44,7 +43,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
|
44
43
|
trackedAttrs.status === change_1.CHANGE_STATUS.rejected) {
|
|
45
44
|
restoredAttrs = trackedAttrs.oldAttrs;
|
|
46
45
|
}
|
|
47
|
-
const trackedDataSource = (0,
|
|
46
|
+
const trackedDataSource = (0, attributes_1.getBlockInlineTrackedData)(node) || [];
|
|
48
47
|
const targetDataTracked = trackedDataSource.find((t) => change.id === t.id);
|
|
49
48
|
const newDataTracked = trackedDataSource
|
|
50
49
|
.map((oldTrack) => {
|
|
@@ -83,7 +82,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
|
83
82
|
return dt;
|
|
84
83
|
});
|
|
85
84
|
const newMark = markChange.mark.type.create(Object.assign(Object.assign({}, markChange.mark.attrs), { dataTracked: newDT }));
|
|
86
|
-
if (
|
|
85
|
+
if (ChangeSet_1.ChangeSet.isInlineMarkChange(markChange)) {
|
|
87
86
|
tr.removeMark(markChange.from, markChange.to, markChange.mark);
|
|
88
87
|
tr.addMark(markChange.from, markChange.to, newMark);
|
|
89
88
|
}
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.updateChangesStatus = updateChangesStatus;
|
|
19
19
|
const prosemirror_history_1 = require("prosemirror-history");
|
|
20
|
+
const applyChanges_1 = require("../applyChanges");
|
|
20
21
|
const ChangeSet_1 = require("../ChangeSet");
|
|
21
|
-
const dropStructureChange_1 = require("../mutate/dropStructureChange");
|
|
22
22
|
const change_1 = require("../types/change");
|
|
23
|
-
const
|
|
23
|
+
const structureChange_1 = require("./structureChange");
|
|
24
24
|
const updateChangeAttrs_1 = require("./updateChangeAttrs");
|
|
25
25
|
function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState) {
|
|
26
26
|
const change = changeSet.get(ids[0]);
|
|
@@ -61,9 +61,9 @@ function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
});
|
|
64
|
-
const mapping = (0, applyChanges_1.
|
|
65
|
-
(0, applyChanges_1.
|
|
66
|
-
(0,
|
|
64
|
+
const mapping = (0, applyChanges_1.applyChanges)(createdTr, oldState.schema, nonTextChanges, changeSet);
|
|
65
|
+
(0, applyChanges_1.applyChanges)(createdTr, oldState.schema, textChanges, changeSet, mapping);
|
|
66
|
+
(0, structureChange_1.dropOrphanChanges)(createdTr);
|
|
67
67
|
}
|
|
68
68
|
else {
|
|
69
69
|
ids.forEach((changeId) => {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findChanges = findChanges;
|
|
4
|
-
const ChangeSet_1 = require("
|
|
5
|
-
const
|
|
6
|
-
const change_1 = require("
|
|
4
|
+
const ChangeSet_1 = require("./ChangeSet");
|
|
5
|
+
const attributes_1 = require("./helpers/attributes");
|
|
6
|
+
const change_1 = require("./types/change");
|
|
7
7
|
function findChanges(state) {
|
|
8
8
|
const changes = [];
|
|
9
9
|
let current;
|
|
10
10
|
state.doc.descendants((node, pos) => {
|
|
11
|
-
const tracked = (0,
|
|
12
|
-
const marksWithTrackChanges = (0,
|
|
11
|
+
const tracked = (0, attributes_1.getNodeTrackedData)(node, state.schema) || [];
|
|
12
|
+
const marksWithTrackChanges = (0, attributes_1.getMarkTrackedData)(node);
|
|
13
13
|
marksWithTrackChanges === null || marksWithTrackChanges === void 0 ? void 0 : marksWithTrackChanges.forEach((trackAttrs, mark) => {
|
|
14
14
|
trackAttrs.forEach((c) => {
|
|
15
15
|
const ch = {
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.updateBlockNodesAttrs = void 0;
|
|
15
|
+
exports.createNewInsertAttrs = createNewInsertAttrs;
|
|
16
|
+
exports.createNewWrapAttrs = createNewWrapAttrs;
|
|
17
|
+
exports.createNewSplitAttrs = createNewSplitAttrs;
|
|
18
|
+
exports.createNewReferenceAttrs = createNewReferenceAttrs;
|
|
19
|
+
exports.createNewDeleteAttrs = createNewDeleteAttrs;
|
|
20
|
+
exports.createNewMoveAttrs = createNewMoveAttrs;
|
|
21
|
+
exports.createNewUpdateAttrs = createNewUpdateAttrs;
|
|
22
|
+
exports.createNewStructureAttrs = createNewStructureAttrs;
|
|
23
|
+
exports.createNewPendingAttrs = createNewPendingAttrs;
|
|
24
|
+
exports.addTrackIdIfDoesntExist = addTrackIdIfDoesntExist;
|
|
25
|
+
exports.getTextNodeTrackedMarkData = getTextNodeTrackedMarkData;
|
|
26
|
+
exports.getBlockInlineTrackedData = getBlockInlineTrackedData;
|
|
27
|
+
exports.getMarkTrackedData = getMarkTrackedData;
|
|
28
|
+
exports.getNodeTrackedData = getNodeTrackedData;
|
|
29
|
+
exports.shouldMergeTrackedAttributes = shouldMergeTrackedAttributes;
|
|
30
|
+
exports.getMergeableMarkTrackedAttrs = getMergeableMarkTrackedAttrs;
|
|
31
|
+
exports.excludeFromTracked = excludeFromTracked;
|
|
32
|
+
const prosemirror_model_1 = require("prosemirror-model");
|
|
33
|
+
const change_1 = require("../types/change");
|
|
34
|
+
const logger_1 = require("../utils/logger");
|
|
35
|
+
const uuidv4_1 = require("../utils/uuidv4");
|
|
36
|
+
const mark_1 = require("./mark");
|
|
37
|
+
function createNewInsertAttrs(attrs) {
|
|
38
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
|
|
39
|
+
}
|
|
40
|
+
function createNewWrapAttrs(attrs) {
|
|
41
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.wrap_with_node });
|
|
42
|
+
}
|
|
43
|
+
function createNewSplitAttrs(attrs) {
|
|
44
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.node_split });
|
|
45
|
+
}
|
|
46
|
+
function createNewReferenceAttrs(attrs, id) {
|
|
47
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.reference, referenceId: id });
|
|
48
|
+
}
|
|
49
|
+
function createNewDeleteAttrs(attrs) {
|
|
50
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
|
|
51
|
+
}
|
|
52
|
+
function createNewMoveAttrs(attrs, indentationType) {
|
|
53
|
+
return Object.assign(Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.move }), (indentationType && { indentationType }));
|
|
54
|
+
}
|
|
55
|
+
function createNewUpdateAttrs(attrs, oldAttrs) {
|
|
56
|
+
const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
|
|
57
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
|
|
58
|
+
}
|
|
59
|
+
function createNewStructureAttrs(attrs) {
|
|
60
|
+
return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.structure });
|
|
61
|
+
}
|
|
62
|
+
function createNewPendingAttrs(time, authorID) {
|
|
63
|
+
return {
|
|
64
|
+
authorID,
|
|
65
|
+
reviewedByID: null,
|
|
66
|
+
createdAt: time,
|
|
67
|
+
updatedAt: time,
|
|
68
|
+
statusUpdateAt: 0,
|
|
69
|
+
status: change_1.CHANGE_STATUS.pending,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function addTrackIdIfDoesntExist(attrs) {
|
|
73
|
+
if (!attrs.id) {
|
|
74
|
+
return Object.assign({ id: (0, uuidv4_1.uuidv4)() }, attrs);
|
|
75
|
+
}
|
|
76
|
+
return attrs;
|
|
77
|
+
}
|
|
78
|
+
function getTextNodeTrackedMarkData(node, schema) {
|
|
79
|
+
if (!node || !node.isText) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const marksTrackedData = [];
|
|
83
|
+
node.marks.forEach((mark) => {
|
|
84
|
+
if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
|
|
85
|
+
const operation = mark.type === schema.marks.tracked_insert ? change_1.CHANGE_OPERATION.insert : change_1.CHANGE_OPERATION.delete;
|
|
86
|
+
marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
if (marksTrackedData.length > 1) {
|
|
90
|
+
logger_1.log.warn('inline node with more than 1 of tracked marks', marksTrackedData);
|
|
91
|
+
}
|
|
92
|
+
return marksTrackedData[0] || undefined;
|
|
93
|
+
}
|
|
94
|
+
function getBlockInlineTrackedData(node) {
|
|
95
|
+
const { dataTracked } = node.attrs;
|
|
96
|
+
if (dataTracked && !Array.isArray(dataTracked)) {
|
|
97
|
+
return [dataTracked];
|
|
98
|
+
}
|
|
99
|
+
return dataTracked || [];
|
|
100
|
+
}
|
|
101
|
+
function getMarkTrackedData(node) {
|
|
102
|
+
const tracked = node === null || node === void 0 ? void 0 : node.marks.reduce((acc, current) => {
|
|
103
|
+
if ((0, mark_1.isValidTrackableMark)(current) && current.attrs.dataTracked) {
|
|
104
|
+
acc.set(current, current.attrs.dataTracked);
|
|
105
|
+
}
|
|
106
|
+
return acc;
|
|
107
|
+
}, new Map());
|
|
108
|
+
return tracked || new Map();
|
|
109
|
+
}
|
|
110
|
+
function getNodeTrackedData(node, schema) {
|
|
111
|
+
let tracked;
|
|
112
|
+
if (node && !node.isText) {
|
|
113
|
+
tracked = getBlockInlineTrackedData(node);
|
|
114
|
+
}
|
|
115
|
+
else if (node === null || node === void 0 ? void 0 : node.isText) {
|
|
116
|
+
tracked = getTextNodeTrackedMarkData(node, schema);
|
|
117
|
+
}
|
|
118
|
+
if (tracked && !Array.isArray(tracked)) {
|
|
119
|
+
tracked = [tracked];
|
|
120
|
+
}
|
|
121
|
+
return tracked;
|
|
122
|
+
}
|
|
123
|
+
function shouldMergeTrackedAttributes(left, right) {
|
|
124
|
+
if (!left || !right) {
|
|
125
|
+
logger_1.log.warn('passed undefined dataTracked attributes to shouldMergeTrackedAttributes', {
|
|
126
|
+
left,
|
|
127
|
+
right,
|
|
128
|
+
});
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
|
|
132
|
+
}
|
|
133
|
+
function getMergeableMarkTrackedAttrs(node, attrs, schema) {
|
|
134
|
+
const nodeAttrs = getTextNodeTrackedMarkData(node, schema);
|
|
135
|
+
return nodeAttrs && shouldMergeTrackedAttributes(nodeAttrs, attrs) ? nodeAttrs : null;
|
|
136
|
+
}
|
|
137
|
+
const updateBlockNodesAttrs = (fragment, predicate) => {
|
|
138
|
+
const updatedNodes = [];
|
|
139
|
+
fragment.forEach((child) => {
|
|
140
|
+
if (!child.isBlock) {
|
|
141
|
+
updatedNodes.push(child);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const newContent = child.content.size ? (0, exports.updateBlockNodesAttrs)(child.content, predicate) : child.content;
|
|
145
|
+
const newAttrs = predicate(child.attrs, child);
|
|
146
|
+
updatedNodes.push(child.type.create(newAttrs, newContent, child.marks));
|
|
147
|
+
});
|
|
148
|
+
return prosemirror_model_1.Fragment.fromArray(updatedNodes);
|
|
149
|
+
};
|
|
150
|
+
exports.updateBlockNodesAttrs = updateBlockNodesAttrs;
|
|
151
|
+
function excludeFromTracked(dataTracked, changeIdToExclude) {
|
|
152
|
+
if (!dataTracked) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const newDataTracked = dataTracked.filter((c) => c.id !== changeIdToExclude);
|
|
156
|
+
return newDataTracked.length ? newDataTracked : null;
|
|
157
|
+
}
|