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