@manuscripts/track-changes-plugin 1.6.0 → 1.6.1-LEAN-2737
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/actions.d.ts +3 -1
- package/dist/index.cjs +14 -8
- package/dist/index.js +14 -8
- package/dist/steps/trackReplaceAroundStep.d.ts +1 -1
- package/package.json +2 -1
package/dist/actions.d.ts
CHANGED
|
@@ -22,7 +22,8 @@ export declare enum TrackChangesAction {
|
|
|
22
22
|
setPluginStatus = "track-changes-set-track-status",
|
|
23
23
|
setChangeStatuses = "track-changes-set-change-statuses",
|
|
24
24
|
refreshChanges = "track-changes-refresh-changes",
|
|
25
|
-
applyAndRemoveChanges = "track-changes-apply-remove-changes"
|
|
25
|
+
applyAndRemoveChanges = "track-changes-apply-remove-changes",
|
|
26
|
+
updateMetaNode = "track-changes-update-meta-node"
|
|
26
27
|
}
|
|
27
28
|
export declare type TrackChangesActionParams = {
|
|
28
29
|
[TrackChangesAction.skipTrack]: boolean;
|
|
@@ -34,6 +35,7 @@ export declare type TrackChangesActionParams = {
|
|
|
34
35
|
};
|
|
35
36
|
[TrackChangesAction.refreshChanges]: boolean;
|
|
36
37
|
[TrackChangesAction.applyAndRemoveChanges]: boolean;
|
|
38
|
+
[TrackChangesAction.updateMetaNode]: boolean;
|
|
37
39
|
};
|
|
38
40
|
/**
|
|
39
41
|
* Gets the value of a meta field, action payload, of a defined track-changes action.
|
package/dist/index.cjs
CHANGED
|
@@ -19,6 +19,7 @@ var TrackChangesAction;
|
|
|
19
19
|
TrackChangesAction["setChangeStatuses"] = "track-changes-set-change-statuses";
|
|
20
20
|
TrackChangesAction["refreshChanges"] = "track-changes-refresh-changes";
|
|
21
21
|
TrackChangesAction["applyAndRemoveChanges"] = "track-changes-apply-remove-changes";
|
|
22
|
+
TrackChangesAction["updateMetaNode"] = "track-changes-update-meta-node";
|
|
22
23
|
})(TrackChangesAction || (TrackChangesAction = {}));
|
|
23
24
|
/**
|
|
24
25
|
* Gets the value of a meta field, action payload, of a defined track-changes action.
|
|
@@ -1137,7 +1138,7 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
|
|
|
1137
1138
|
* See the License for the specific language governing permissions and
|
|
1138
1139
|
* limitations under the License.
|
|
1139
1140
|
*/
|
|
1140
|
-
function trackReplaceAroundStep(step, oldState, newTr, attrs) {
|
|
1141
|
+
function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
|
|
1141
1142
|
log.info('###### ReplaceAroundStep ######');
|
|
1142
1143
|
// @ts-ignore
|
|
1143
1144
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -1158,14 +1159,18 @@ function trackReplaceAroundStep(step, oldState, newTr, attrs) {
|
|
|
1158
1159
|
log.info('DELETE STEPS: ', deleteSteps);
|
|
1159
1160
|
// We only want to insert when there something inside the gap (actually would this be always true?)
|
|
1160
1161
|
// or insert slice wasn't just start/end tokens (which we already merged inside deleteAndMergeSplitBlockNodes)
|
|
1161
|
-
|
|
1162
|
+
// ^^answering above comment we could have meta node like(bibliography_item, contributor) will not have content at all,
|
|
1163
|
+
// and that case gap will be 0, for that will use updateMetaNode to indicate that we are going just to update that node
|
|
1164
|
+
if (gap.size > 0 ||
|
|
1165
|
+
(!structure && newSliceContent.size > 0) ||
|
|
1166
|
+
tr.getMeta(TrackChangesAction.updateMetaNode)) {
|
|
1162
1167
|
log.info('newSliceContent', newSliceContent);
|
|
1163
1168
|
// Since deleteAndMergeSplitBlockNodes modified the slice to not to contain any merged nodes,
|
|
1164
1169
|
// the sides should be equal. TODO can they be other than 0?
|
|
1165
1170
|
const openStart = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openStart;
|
|
1166
1171
|
const openEnd = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openEnd;
|
|
1167
1172
|
let insertedSlice = new prosemirrorModel.Slice(setFragmentAsInserted(newSliceContent, createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd);
|
|
1168
|
-
if (gap.size > 0) {
|
|
1173
|
+
if (gap.size > 0 || tr.getMeta(TrackChangesAction.updateMetaNode)) {
|
|
1169
1174
|
log.info('insertedSlice before inserted gap', insertedSlice);
|
|
1170
1175
|
insertedSlice = insertedSlice.insertAt(insertedSlice.size === 0 ? 0 : insert, gap.content);
|
|
1171
1176
|
log.info('insertedSlice after inserted gap', insertedSlice);
|
|
@@ -1201,6 +1206,7 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1201
1206
|
let selectionPos = 0, changeSteps = [];
|
|
1202
1207
|
// Invert the transaction step to prevent it from actually deleting or inserting anything
|
|
1203
1208
|
step.getMap().forEach((fromA, toA, fromB, toB) => {
|
|
1209
|
+
var _a, _b;
|
|
1204
1210
|
log.info(`changed ranges: ${fromA} ${toA} ${fromB} ${toB}`);
|
|
1205
1211
|
const { slice } = step;
|
|
1206
1212
|
log.info('TR: steps before applying delete', [...newTr.steps]);
|
|
@@ -1248,9 +1254,6 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1248
1254
|
type: 'insert-slice',
|
|
1249
1255
|
from: textWasDeleted ? fromB : toA,
|
|
1250
1256
|
to: textWasDeleted ? toB - 1 : toA,
|
|
1251
|
-
/* it's not entirely clear why using "fromB" is needed at all but in cases where there areno content deleted before
|
|
1252
|
-
- it will gointo infinite loop if toB -1 is used
|
|
1253
|
-
*/
|
|
1254
1257
|
sliceWasSplit,
|
|
1255
1258
|
slice: new prosemirrorModel.Slice(setFragmentAsInserted(newSliceContent, createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd),
|
|
1256
1259
|
});
|
|
@@ -1258,7 +1261,10 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1258
1261
|
else {
|
|
1259
1262
|
// Incase only deletion was applied, check whether tracked marks around deleted content can be merged
|
|
1260
1263
|
// mergeTrackedMarks(adjustedInsertPos, newTr.doc, newTr, oldState.schema)
|
|
1261
|
-
|
|
1264
|
+
// When DEL is used, the selection is set to the end of the deleted content
|
|
1265
|
+
// TODO: 'window.event' is deprecated, find a better way to detect the key used for deletion
|
|
1266
|
+
// @ts-ignore
|
|
1267
|
+
selectionPos = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete' || ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward' ? toA : fromA;
|
|
1262
1268
|
}
|
|
1263
1269
|
});
|
|
1264
1270
|
return [changeSteps, selectionPos];
|
|
@@ -1723,7 +1729,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
1723
1729
|
}
|
|
1724
1730
|
}
|
|
1725
1731
|
else if (step instanceof prosemirrorTransform.ReplaceAroundStep) {
|
|
1726
|
-
let steps = trackReplaceAroundStep(step, oldState, newTr, emptyAttrs);
|
|
1732
|
+
let steps = trackReplaceAroundStep(step, oldState, tr, newTr, emptyAttrs);
|
|
1727
1733
|
const deleted = steps.filter((s) => s.type !== 'insert-slice');
|
|
1728
1734
|
const inserted = steps.filter((s) => s.type === 'insert-slice');
|
|
1729
1735
|
log.info('INSERT STEPS: ', inserted);
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ var TrackChangesAction;
|
|
|
11
11
|
TrackChangesAction["setChangeStatuses"] = "track-changes-set-change-statuses";
|
|
12
12
|
TrackChangesAction["refreshChanges"] = "track-changes-refresh-changes";
|
|
13
13
|
TrackChangesAction["applyAndRemoveChanges"] = "track-changes-apply-remove-changes";
|
|
14
|
+
TrackChangesAction["updateMetaNode"] = "track-changes-update-meta-node";
|
|
14
15
|
})(TrackChangesAction || (TrackChangesAction = {}));
|
|
15
16
|
/**
|
|
16
17
|
* Gets the value of a meta field, action payload, of a defined track-changes action.
|
|
@@ -1129,7 +1130,7 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
|
|
|
1129
1130
|
* See the License for the specific language governing permissions and
|
|
1130
1131
|
* limitations under the License.
|
|
1131
1132
|
*/
|
|
1132
|
-
function trackReplaceAroundStep(step, oldState, newTr, attrs) {
|
|
1133
|
+
function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
|
|
1133
1134
|
log.info('###### ReplaceAroundStep ######');
|
|
1134
1135
|
// @ts-ignore
|
|
1135
1136
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -1150,14 +1151,18 @@ function trackReplaceAroundStep(step, oldState, newTr, attrs) {
|
|
|
1150
1151
|
log.info('DELETE STEPS: ', deleteSteps);
|
|
1151
1152
|
// We only want to insert when there something inside the gap (actually would this be always true?)
|
|
1152
1153
|
// or insert slice wasn't just start/end tokens (which we already merged inside deleteAndMergeSplitBlockNodes)
|
|
1153
|
-
|
|
1154
|
+
// ^^answering above comment we could have meta node like(bibliography_item, contributor) will not have content at all,
|
|
1155
|
+
// and that case gap will be 0, for that will use updateMetaNode to indicate that we are going just to update that node
|
|
1156
|
+
if (gap.size > 0 ||
|
|
1157
|
+
(!structure && newSliceContent.size > 0) ||
|
|
1158
|
+
tr.getMeta(TrackChangesAction.updateMetaNode)) {
|
|
1154
1159
|
log.info('newSliceContent', newSliceContent);
|
|
1155
1160
|
// Since deleteAndMergeSplitBlockNodes modified the slice to not to contain any merged nodes,
|
|
1156
1161
|
// the sides should be equal. TODO can they be other than 0?
|
|
1157
1162
|
const openStart = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openStart;
|
|
1158
1163
|
const openEnd = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openEnd;
|
|
1159
1164
|
let insertedSlice = new Slice(setFragmentAsInserted(newSliceContent, createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd);
|
|
1160
|
-
if (gap.size > 0) {
|
|
1165
|
+
if (gap.size > 0 || tr.getMeta(TrackChangesAction.updateMetaNode)) {
|
|
1161
1166
|
log.info('insertedSlice before inserted gap', insertedSlice);
|
|
1162
1167
|
insertedSlice = insertedSlice.insertAt(insertedSlice.size === 0 ? 0 : insert, gap.content);
|
|
1163
1168
|
log.info('insertedSlice after inserted gap', insertedSlice);
|
|
@@ -1193,6 +1198,7 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1193
1198
|
let selectionPos = 0, changeSteps = [];
|
|
1194
1199
|
// Invert the transaction step to prevent it from actually deleting or inserting anything
|
|
1195
1200
|
step.getMap().forEach((fromA, toA, fromB, toB) => {
|
|
1201
|
+
var _a, _b;
|
|
1196
1202
|
log.info(`changed ranges: ${fromA} ${toA} ${fromB} ${toB}`);
|
|
1197
1203
|
const { slice } = step;
|
|
1198
1204
|
log.info('TR: steps before applying delete', [...newTr.steps]);
|
|
@@ -1240,9 +1246,6 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1240
1246
|
type: 'insert-slice',
|
|
1241
1247
|
from: textWasDeleted ? fromB : toA,
|
|
1242
1248
|
to: textWasDeleted ? toB - 1 : toA,
|
|
1243
|
-
/* it's not entirely clear why using "fromB" is needed at all but in cases where there areno content deleted before
|
|
1244
|
-
- it will gointo infinite loop if toB -1 is used
|
|
1245
|
-
*/
|
|
1246
1249
|
sliceWasSplit,
|
|
1247
1250
|
slice: new Slice(setFragmentAsInserted(newSliceContent, createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd),
|
|
1248
1251
|
});
|
|
@@ -1250,7 +1253,10 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
1250
1253
|
else {
|
|
1251
1254
|
// Incase only deletion was applied, check whether tracked marks around deleted content can be merged
|
|
1252
1255
|
// mergeTrackedMarks(adjustedInsertPos, newTr.doc, newTr, oldState.schema)
|
|
1253
|
-
|
|
1256
|
+
// When DEL is used, the selection is set to the end of the deleted content
|
|
1257
|
+
// TODO: 'window.event' is deprecated, find a better way to detect the key used for deletion
|
|
1258
|
+
// @ts-ignore
|
|
1259
|
+
selectionPos = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete' || ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward' ? toA : fromA;
|
|
1254
1260
|
}
|
|
1255
1261
|
});
|
|
1256
1262
|
return [changeSteps, selectionPos];
|
|
@@ -1715,7 +1721,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
1715
1721
|
}
|
|
1716
1722
|
}
|
|
1717
1723
|
else if (step instanceof ReplaceAroundStep) {
|
|
1718
|
-
let steps = trackReplaceAroundStep(step, oldState, newTr, emptyAttrs);
|
|
1724
|
+
let steps = trackReplaceAroundStep(step, oldState, tr, newTr, emptyAttrs);
|
|
1719
1725
|
const deleted = steps.filter((s) => s.type !== 'insert-slice');
|
|
1720
1726
|
const inserted = steps.filter((s) => s.type === 'insert-slice');
|
|
1721
1727
|
log.info('INSERT STEPS: ', inserted);
|
|
@@ -2,4 +2,4 @@ import type { EditorState, Transaction } from 'prosemirror-state';
|
|
|
2
2
|
import { ReplaceAroundStep } from 'prosemirror-transform';
|
|
3
3
|
import { NewEmptyAttrs } from '../types/track';
|
|
4
4
|
import { ChangeStep } from '../types/step';
|
|
5
|
-
export declare function trackReplaceAroundStep(step: ReplaceAroundStep, oldState: EditorState, newTr: Transaction, attrs: NewEmptyAttrs): ChangeStep[];
|
|
5
|
+
export declare function trackReplaceAroundStep(step: ReplaceAroundStep, oldState: EditorState, tr: Transaction, newTr: Transaction, attrs: NewEmptyAttrs): ChangeStep[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manuscripts/track-changes-plugin",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.1-LEAN-2737",
|
|
4
4
|
"author": "Atypon Systems LLC",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/Atypon-OpenSource/manuscripts-quarterback/tree/main/quarterback-packages/track-changes-plugin",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"scripts": {
|
|
62
62
|
"build": "rollup -c",
|
|
63
63
|
"watch": "rollup -cw",
|
|
64
|
+
"dev": "yarn run watch",
|
|
64
65
|
"test": "jest --runInBand",
|
|
65
66
|
"format": "prettier --write \"*.+(js|json|yml|yaml|ts|md|graphql|mdx)\" src/ test/",
|
|
66
67
|
"typecheck": "tsc --project tsconfig.test.json --noEmit",
|