From 813d97314cae913fbde901bc95daf823c2b7cd24 Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Thu, 6 Aug 2020 20:25:23 +0300 Subject: [PATCH] reject insertions/deletions --- wax-prosemirror-services/package.json | 1 + .../AcceptTrackChange.js | 5 +-- .../RejectTrackChange.js | 41 ++++++++++++++++++- .../track-changes/trackedTransaction.js | 36 ++++++++-------- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index 22559ee12..d0e1e4919 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -13,6 +13,7 @@ "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", "lodash": "^4.17.4", + "prosemirror-model": "^1.9.1", "prosemirror-commands": "^1.1.3", "prosemirror-history": "^1.1.3", "prosemirror-keymap": "^1.1.3", diff --git a/wax-prosemirror-services/src/TrackChangeService/AcceptTrackChangeService/AcceptTrackChange.js b/wax-prosemirror-services/src/TrackChangeService/AcceptTrackChangeService/AcceptTrackChange.js index 9589c1b3c..975ec2dba 100644 --- a/wax-prosemirror-services/src/TrackChangeService/AcceptTrackChangeService/AcceptTrackChange.js +++ b/wax-prosemirror-services/src/TrackChangeService/AcceptTrackChangeService/AcceptTrackChange.js @@ -18,7 +18,7 @@ class AcceptTrackChange extends Tools { tr, selection: { from, to }, } = state; - + tr.setMeta('AcceptReject', true); const map = new Mapping(); state.doc.nodesBetween(from, to, (node, pos) => { @@ -49,8 +49,7 @@ class AcceptTrackChange extends Tools { ); } }); - - dispatch(tr); + if (tr.steps.length) dispatch(tr); }; } diff --git a/wax-prosemirror-services/src/TrackChangeService/RejectTrackChangeService/RejectTrackChange.js b/wax-prosemirror-services/src/TrackChangeService/RejectTrackChangeService/RejectTrackChange.js index 60a3996cb..6978d555b 100644 --- a/wax-prosemirror-services/src/TrackChangeService/RejectTrackChangeService/RejectTrackChange.js +++ b/wax-prosemirror-services/src/TrackChangeService/RejectTrackChangeService/RejectTrackChange.js @@ -1,3 +1,5 @@ +import { Mapping, RemoveMarkStep, ReplaceStep } from 'prosemirror-transform'; +import { Slice } from 'prosemirror-model'; import { injectable } from 'inversify'; import Tools from '../../lib/Tools'; @@ -8,7 +10,44 @@ class RejectTrackChange extends Tools { content = 'Reject'; get run() { - return (state, dispatch) => {}; + return (state, dispatch) => { + const { + tr, + selection: { from, to }, + } = state; + tr.setMeta('AcceptReject', true); + const map = new Mapping(); + + state.doc.nodesBetween(from, to, (node, pos) => { + if ( + node.marks && + node.marks.find(mark => mark.type.name === 'deletion') + ) { + const deletionMark = node.marks.find( + mark => mark.type.name === 'deletion', + ); + tr.step( + new RemoveMarkStep( + map.map(Math.max(pos, from)), + map.map(Math.min(pos + node.nodeSize, to)), + deletionMark, + ), + ); + } else if ( + node.marks && + node.marks.find(mark => mark.type.name === 'insertion') + ) { + const deletionStep = new ReplaceStep( + map.map(Math.max(pos, from)), + map.map(Math.min(pos + node.nodeSize, to)), + Slice.empty, + ); + tr.step(deletionStep); + map.appendMap(deletionStep.getMap()); + } + }); + if (tr.steps.length) dispatch(tr); + }; } get active() { diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js index 10d5dadef..d891fb64e 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js @@ -4,35 +4,37 @@ check: https://github.com/fiduswriter/fiduswriter/blob/develop/fiduswriter/docum License included in folder. */ -import { Selection, TextSelection } from "prosemirror-state"; +import { Selection, TextSelection } from 'prosemirror-state'; import { ReplaceStep, ReplaceAroundStep, AddMarkStep, RemoveMarkStep, - Mapping -} from "prosemirror-transform"; + Mapping, +} from 'prosemirror-transform'; -import { DocumentHelpers } from "wax-prosemirror-utilities"; +import { DocumentHelpers } from 'wax-prosemirror-utilities'; -import replaceStep from "./helpers/replaceStep"; -import replaceAroundStep from "./helpers/replaceAroundStep"; -import addMarkStep from "./helpers/addMarkStep"; -import removeMarkStep from "./helpers/removeMarkStep"; +import replaceStep from './helpers/replaceStep'; +import replaceAroundStep from './helpers/replaceAroundStep'; +import addMarkStep from './helpers/addMarkStep'; +import removeMarkStep from './helpers/removeMarkStep'; const trackedTransaction = (tr, state, user) => { if ( !tr.steps.length || (tr.meta && !Object.keys(tr.meta).every(metadata => - ["inputType", "uiEvent", "paste", "outsideView"].includes(metadata) + ['inputType', 'uiEvent', 'paste', 'outsideView'].includes(metadata), )) || - ["historyUndo", "historyRedo"].includes(tr.getMeta("inputType")) + ['historyUndo', 'historyRedo', 'AcceptReject'].includes( + tr.getMeta('inputType'), + ) ) { return tr; } - const group = tr.getMeta("outsideView") ? tr.getMeta("outsideView") : "main"; + const group = tr.getMeta('outsideView') ? tr.getMeta('outsideView') : 'main'; const newTr = state.tr; const map = new Mapping(); const date = Math.floor(Date.now() / 300000); @@ -60,11 +62,11 @@ const trackedTransaction = (tr, state, user) => { } }); - if (tr.getMeta("inputType")) { - newTr.setMeta(tr.getMeta("inputType")); + if (tr.getMeta('inputType')) { + newTr.setMeta(tr.getMeta('inputType')); } - if (tr.getMeta("uiEvent")) { - newTr.setMeta(tr.getMeta("uiEvent")); + if (tr.getMeta('uiEvent')) { + newTr.setMeta(tr.getMeta('uiEvent')); } if (tr.selectionSet) { @@ -72,13 +74,13 @@ const trackedTransaction = (tr, state, user) => { const deletionMark = DocumentHelpers.findMark( state, deletionMarkSchema, - false + false, ); if ( tr.selection instanceof TextSelection && (tr.selection.from < state.selection.from || - tr.getMeta("inputType") === "deleteContentBackward") + tr.getMeta('inputType') === 'deleteContentBackward') ) { const caretPos = map.map(tr.selection.from, -1); newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); -- GitLab