From 27bf6374bc7bc49170f4a649799aa6a66cdf3e6a Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Wed, 30 Dec 2020 18:25:13 +0200
Subject: [PATCH] feat(track-changes): pass view id to all marks/blocks

---
 editors/editoria/src/demo.js                  |  2 +-
 .../trackChanges/ConnectedTrackChange.js      |  2 +-
 .../trackChanges/TrackChangesBox.js           |  1 -
 .../marks/trackChangesMarks/deletionMark.js   | 39 ++++++------
 .../trackChangesMarks/formatChangeMark.js     | 45 +++++++-------
 .../marks/trackChangesMarks/insertionMark.js  | 39 ++++++------
 .../trackChangesNodes/authorTrackNode.js      | 29 +++++----
 .../epigraphPoetryTrackNode.js                | 29 +++++----
 .../epigraphProseTrackNode.js                 | 29 +++++----
 .../extractPoetryTrackNode.js                 | 29 +++++----
 .../extractProseTrackNode.js                  | 29 +++++----
 .../trackChangesNodes/headingTrackNode.js     | 43 +++++++------
 .../trackChangesNodes/orderedListTrackNode.js | 29 +++++----
 .../paragraphContTrackNode.js                 | 29 +++++----
 .../trackChangesNodes/sourceNoteTrackNode.js  | 29 +++++----
 .../trackChangesNodes/subTitleTrackNode.js    | 29 +++++----
 .../nodes/trackChangesNodes/titleTrackNode.js | 29 +++++----
 .../src/NoteService/Editor.js                 |  2 +-
 .../track-changes/helpers/addMarkStep.js      | 16 ++++-
 .../track-changes/helpers/markDeletion.js     |  2 +-
 .../track-changes/helpers/markInsertion.js    | 19 +++---
 .../track-changes/helpers/markWrapping.js     | 10 +++-
 .../helpers/replaceAroundStep.js              |  2 +
 .../track-changes/helpers/replaceStep.js      | 13 +++-
 .../track-changes/trackedTransaction.js       | 60 +++++++++++++++++--
 .../src/schema/DefaultSchema.js               |  2 +
 .../src/schema/SchemaHelpers.js               | 17 +++---
 27 files changed, 366 insertions(+), 238 deletions(-)

diff --git a/editors/editoria/src/demo.js b/editors/editoria/src/demo.js
index 5e735e3ea..c451a1f07 100644
--- a/editors/editoria/src/demo.js
+++ b/editors/editoria/src/demo.js
@@ -1,4 +1,4 @@
-export const demo = `<p class="paragraph">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eros turpis, imperdiet viverra purus eget, fermentum porttitor dui. Etiam quis venenatis risus, sit amet bibendum turpis. <span class="insertion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">this is an addition </span>Vestibulum non nibh at dolor sodales euismod. Maecenas mattis nulla in eros pretium, eu commodo sem sagittis. Nam eu varius justo. Nullam volutpat diam sit amet nunc aliquam convallis. Aliquam non eleifend dolor. Cras in urna lacinia, tempor tellus non, faucibus leo. Etiam mi elit, euismod sit amet tellus sed, molestie gravida tortor.</p><ol><li><p class="paragraph">list item 1</p></li><li><p class="paragraph">list <span class="comment" data-id="f109db7c-61df-456b-b933-8cc9d43e65a3" data-conversation="[{&quot;content&quot;:&quot;demo comment&quot;,&quot;displayName&quot;:&quot;demo&quot;,&quot;timestamp&quot;:1601559766164}]" data-viewid="main" data-group="main">item</span> 2</p><p class="paragraph">list item 2 second paragraph</p></li><li><p class="paragraph">list item 3</p><ol><li><p class="paragraph">nested 1</p></li><li><p class="paragraph">nested 2</p></li><li><p class="paragraph">nested 3</p></li></ol></li><li><p class="paragraph">list item 4</p></li></ol><p class="paragraph">Quisque posuere <span class="deletion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">velit ut venenatis tempor. Donec mollis dictum magna, ac ullamcorper nibh dignissim at. Aliquam malesuada id dolor non ornare. Morbi condimentum a justo id </span>fermentum. In eget metus ac ante fermentum suscipit. Donec eleifend cursus suscipit. <strong><span class="format-change" data-id="37f76a5f-f8fa-474d-a37d-e9d8fdeea0f5" data-user="1234" data-username="demo" data-date="1609243477509" data-before="[]" data-after="[&quot;strong&quot;]" data-group="main">Donec</span></strong> velit lectus, ultricies a pulvinar eu, eleifend non metus. <footnote id="de87b2a3-6186-440e-9249-fb07ce9ff344">note 2 with <span class="deletion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">some</span> more content </footnote>Duis ut volutpat nunc.<footnote id="b8cc2013-ba52-48cb-b42c-dbe407de0c69">note 1 <span class="comment" data-id="48abf2f8-f58f-4157-b966-42276abee599" data-conversation="[{&quot;content&quot;:&quot;comment&quot;,&quot;displayName&quot;:&quot;demo&quot;,&quot;timestamp&quot;:1601559909838}]" data-viewid="b8cc2013-ba52-48cb-b42c-dbe407de0c69" data-group="notes">content</span><span class="insertion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group=""> and tracked text</span></footnote> Nunc elementum id nulla nec tempor. Sed fringilla lacinia diam non tempus.</p><p class="paragraph">Proin sed odio sit amet erat volutpat tempus non et metus. Cras vitae ullamcorper diam. Proin blandit scelerisque vulputate. In elementum rutrum urna ac posuere. Nam at ex ipsum. Morbi ornare lacus vel orci congue, sed hendrerit mauris convallis. Etiam in aliquam ex.</p><pre data-params=""><code>#include &lt;iostream&gt;
+export const demo = `<p class="paragraph">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eros turpis, imperdiet viverra purus eget, fermentum porttitor dui. Etiam quis venenatis risus, sit amet bibendum turpis. <span class="insertion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">this is an addition </span>Vestibulum non nibh at dolor sodales euismod. Maecenas mattis nulla in eros pretium, eu commodo sem sagittis. Nam eu varius justo. Nullam volutpat diam sit amet nunc aliquam convallis. Aliquam non eleifend dolor. Cras in urna lacinia, tempor tellus non, faucibus leo. Etiam mi elit, euismod sit amet tellus sed, molestie gravida tortor.</p><ol><li><p class="paragraph">list item 1</p></li><li><p class="paragraph">list <span class="comment" data-id="f109db7c-61df-456b-b933-8cc9d43e65a3" data-conversation="[{&quot;content&quot;:&quot;demo comment&quot;,&quot;displayName&quot;:&quot;demo&quot;,&quot;timestamp&quot;:1601559766164}]" data-viewid="main" data-group="main">item</span> 2</p><p class="paragraph">list item 2 second paragraph</p></li><li><p class="paragraph">list item 3</p><ol><li><p class="paragraph">nested 1</p></li><li><p class="paragraph">nested 2</p></li><li><p class="paragraph">nested 3</p></li></ol></li><li><p class="paragraph">list item 4</p></li></ol><p class="paragraph">Quisque posuere <span class="deletion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">velit ut venenatis tempor. Donec mollis dictum magna, ac ullamcorper nibh dignissim at. Aliquam malesuada id dolor non ornare. Morbi condimentum a justo id </span>fermentum. In eget metus ac ante fermentum suscipit. Donec eleifend cursus suscipit. <strong><span class="format-change" data-id="37f76a5f-f8fa-474d-a37d-e9d8fdeea0f5" data-user="1234" data-username="demo" data-date="1609243477509" data-before="[]" data-after="[&quot;strong&quot;]" data-group="main"data-viewid=""main">Donec</span></strong> velit lectus, ultricies a pulvinar eu, eleifend non metus. <footnote id="de87b2a3-6186-440e-9249-fb07ce9ff344">note 2 with <span class="deletion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group="">some</span> more content </footnote>Duis ut volutpat nunc.<footnote id="b8cc2013-ba52-48cb-b42c-dbe407de0c69">note 1 <span class="comment" data-id="48abf2f8-f58f-4157-b966-42276abee599" data-conversation="[{&quot;content&quot;:&quot;comment&quot;,&quot;displayName&quot;:&quot;demo&quot;,&quot;timestamp&quot;:1601559909838}]" data-viewid="b8cc2013-ba52-48cb-b42c-dbe407de0c69" data-group="notes">content</span><span class="insertion" data-id="" data-user="1234" data-username="demo" data-date="0" data-group=""> and tracked text</span></footnote> Nunc elementum id nulla nec tempor. Sed fringilla lacinia diam non tempus.</p><p class="paragraph">Proin sed odio sit amet erat volutpat tempus non et metus. Cras vitae ullamcorper diam. Proin blandit scelerisque vulputate. In elementum rutrum urna ac posuere. Nam at ex ipsum. Morbi ornare lacus vel orci congue, sed hendrerit mauris convallis. Etiam in aliquam ex.</p><pre data-params=""><code>#include &lt;iostream&gt;
 
 int main(int argc, char *argv[]) {
 
diff --git a/wax-prosemirror-components/src/components/trackChanges/ConnectedTrackChange.js b/wax-prosemirror-components/src/components/trackChanges/ConnectedTrackChange.js
index c5c7c215f..d67f2a5da 100644
--- a/wax-prosemirror-components/src/components/trackChanges/ConnectedTrackChange.js
+++ b/wax-prosemirror-components/src/components/trackChanges/ConnectedTrackChange.js
@@ -20,7 +20,7 @@ export default ({ trackChangeId, top, recalculateTops, trackChange }) => {
 
   const [isActive, setIsActive] = useState(false);
   // const { state, dispatch } = activeView;
-  const viewId = 'main';
+  const viewId = trackChange.attrs.viewid;
   const styles = {
     top: `${top}px`,
   };
diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangesBox.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangesBox.js
index 594086807..83e011679 100644
--- a/wax-prosemirror-components/src/components/trackChanges/TrackChangesBox.js
+++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangesBox.js
@@ -99,7 +99,6 @@ const TrackChangesBox = props => {
   } = props;
 
   const onClickTrackBox = () => {
-    console.log(onClickBox);
     onClickBox(trackData);
   };
 
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
index d96ad4811..2281f22cb 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
@@ -1,43 +1,46 @@
 const deletion = {
   attrs: {
-    class: { default: "deletion" },
-    id: { default: "" },
+    class: { default: 'deletion' },
+    id: { default: '' },
     user: { default: 0 },
-    username: { default: "" },
+    username: { default: '' },
     date: { default: 0 },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   inclusive: false,
-  group: "track",
+  group: 'track',
   parseDOM: [
     {
-      tag: "span.deletion",
+      tag: 'span.deletion',
       getAttrs(hook, next) {
         Object.assign(hook, {
-          class: hook.dom.getAttribute("class"),
+          class: hook.dom.getAttribute('class'),
           id: hook.dom.dataset.id,
           user: parseInt(hook.dom.dataset.user),
           username: hook.dom.dataset.username,
           date: parseInt(hook.dom.dataset.date),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     hook.value = [
-      "span",
+      'span',
       {
         class: hook.node.attrs.class,
-        "data-id": hook.node.attrs.id,
-        "data-user": hook.node.attrs.user,
-        "data-username": hook.node.attrs.username,
-        "data-date": hook.node.attrs.date,
-        "data-group": hook.node.attrs.group
-      }
+        'data-id': hook.node.attrs.id,
+        'data-user': hook.node.attrs.user,
+        'data-username': hook.node.attrs.username,
+        'data-date': hook.node.attrs.date,
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
+      },
     ];
     next();
-  }
+  },
 };
 export default deletion;
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
index 633578c39..53346bbab 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
@@ -1,52 +1,55 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const format_change = {
   attrs: {
-    class: { default: "format-change" },
-    id: { default: "" },
+    class: { default: 'format-change' },
+    id: { default: '' },
     user: { default: 0 },
-    username: { default: "" },
+    username: { default: '' },
     date: { default: 0 },
     before: { default: [] },
     after: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   inclusive: false,
-  group: "track",
+  group: 'track',
   parseDOM: [
     {
-      tag: "span.format-change",
+      tag: 'span.format-change',
       getAttrs(hook, next) {
         Object.assign(hook, {
-          class: hook.dom.getAttribute("class"),
+          class: hook.dom.getAttribute('class'),
           id: hook.dom.dataset.id,
           user: parseInt(hook.dom.dataset.user),
           username: hook.dom.dataset.username,
           date: parseInt(hook.dom.dataset.date),
           before: SchemaHelpers.parseFormatList(hook.dom.dataset.before),
           after: SchemaHelpers.parseFormatList(hook.dom.dataset.after),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     hook.value = [
-      "span",
+      'span',
       {
         class: hook.node.attrs.class,
-        "data-id": hook.node.attrs.id,
-        "data-user": hook.node.attrs.user,
-        "data-username": hook.node.attrs.username,
-        "data-date": hook.node.attrs.date,
-        "data-before": JSON.stringify(hook.node.attrs.before),
-        "data-after": JSON.stringify(hook.node.attrs.after),
-        "data-group": hook.node.attrs.group
-      }
+        'data-id': hook.node.attrs.id,
+        'data-user': hook.node.attrs.user,
+        'data-username': hook.node.attrs.username,
+        'data-date': hook.node.attrs.date,
+        'data-before': JSON.stringify(hook.node.attrs.before),
+        'data-after': JSON.stringify(hook.node.attrs.after),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
+      },
     ];
     next();
-  }
+  },
 };
 
 export default format_change;
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
index 22330a58a..60e6a4873 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
@@ -1,44 +1,47 @@
 const insertion = {
   attrs: {
-    class: { default: "insertion" },
-    id: { default: "" },
+    class: { default: 'insertion' },
+    id: { default: '' },
     user: { default: 0 },
-    username: { default: "" },
+    username: { default: '' },
     date: { default: 0 },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   inclusive: false,
-  group: "track",
+  group: 'track',
   parseDOM: [
     {
-      tag: "span.insertion",
+      tag: 'span.insertion',
       getAttrs(hook, next) {
         Object.assign(hook, {
-          class: hook.dom.getAttribute("class"),
+          class: hook.dom.getAttribute('class'),
           id: hook.dom.dataset.id,
           user: parseInt(hook.dom.dataset.user),
           username: hook.dom.dataset.username,
           date: parseInt(hook.dom.dataset.date),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     hook.value = [
-      "span",
+      'span',
       {
         class: hook.node.attrs.class,
-        "data-id": hook.node.attrs.id,
-        "data-user": hook.node.attrs.user,
-        "data-username": hook.node.attrs.username,
-        "data-date": hook.node.attrs.date,
-        "data-group": hook.node.attrs.group
-      }
+        'data-id': hook.node.attrs.id,
+        'data-user': hook.node.attrs.user,
+        'data-username': hook.node.attrs.username,
+        'data-date': hook.node.attrs.date,
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
+      },
     ];
     next();
-  }
+  },
 };
 
 export default insertion;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
index 4ee38f0b2..cf812debc 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const author = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.author",
+      tag: 'p.author',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default author;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
index e888ed541..c55f7a32d 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const epigraphPoetry = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.epigraph-poetry",
+      tag: 'p.epigraph-poetry',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default epigraphPoetry;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
index e4135cf06..d77610beb 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const epigraphProse = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.epigraph-prose",
+      tag: 'p.epigraph-prose',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default epigraphProse;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
index 937af7bd4..9cff2b413 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const extractPoetry = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.extract-poetry",
+      tag: 'p.extract-poetry',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default extractPoetry;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
index 83d9bda49..c6e9363fd 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const extractProse = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.extract-prose",
+      tag: 'p.extract-prose',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default extractProse;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
index 55be2a66a..c94abe308 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
@@ -1,59 +1,64 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const heading = {
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   defining: true,
   parseDOM: [
     {
-      tag: "h1",
+      tag: 'h1',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
+      },
     },
     {
-      tag: "h2",
+      tag: 'h2',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
+      },
     },
     {
-      tag: "h3",
+      tag: 'h3',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default heading;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
index a4214da44..c3727ca77 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
@@ -1,36 +1,39 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const orderedlist = {
-  group: "block",
-  content: "list_item+",
+  group: 'block',
+  content: 'list_item+',
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "ol",
+      tag: 'ol',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default orderedlist;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
index 3bc477abf..35a760346 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const paragraphCont = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.paragraph-cont",
+      tag: 'p.paragraph-cont',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default paragraphCont;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
index cf9437b3c..89c7debea 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const sourceNote = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.source-note",
+      tag: 'p.source-note',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default sourceNote;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
index c2d21e612..16f566567 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const subtitle = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.cst",
+      tag: 'p.cst',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default subtitle;
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
index 81de595b5..8276e0cf8 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
@@ -1,38 +1,41 @@
-import { SchemaHelpers } from "wax-prosemirror-utilities";
+import { SchemaHelpers } from 'wax-prosemirror-utilities';
 
 const title = {
-  content: "inline*",
-  group: "block",
+  content: 'inline*',
+  group: 'block',
   priority: 0,
   defining: true,
   attrs: {
-    id: { default: "" },
+    id: { default: '' },
     track: { default: [] },
-    group: { default: "" }
+    group: { default: '' },
+    viewid: { default: '' },
   },
   parseDOM: [
     {
-      tag: "p.title",
+      tag: 'p.title',
       getAttrs(hook, next) {
         Object.assign(hook, {
           id: hook.dom.dataset.id,
           track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
-          group: hook.dom.dataset.group
+          group: hook.dom.dataset.group,
+          viewid: hook.dom.dataset.viewid,
         });
         next();
-      }
-    }
+      },
+    },
   ],
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-id": hook.node.attrs.id,
-        "data-track": JSON.stringify(hook.node.attrs.track),
-        "data-group": hook.node.attrs.group
+        'data-id': hook.node.attrs.id,
+        'data-track': JSON.stringify(hook.node.attrs.track),
+        'data-group': hook.node.attrs.group,
+        'data-viewid': hook.node.attrs.viewid,
       });
     }
     next();
-  }
+  },
 };
 
 export default title;
diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js
index b8bcb437d..8051a106f 100644
--- a/wax-prosemirror-services/src/NoteService/Editor.js
+++ b/wax-prosemirror-services/src/NoteService/Editor.js
@@ -69,7 +69,7 @@ export default ({ node, view }) => {
     );
 
     const tr = TrackChange.enabled
-      ? trackedTransaction(transaction, noteView.state, user, 'notes')
+      ? trackedTransaction(transaction, noteView.state, user, 'notes', noteId)
       : transaction;
 
     const { state, transactions } = noteView.state.applyTransaction(tr);
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js
index 79fe7d527..c3ce98fac 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js
@@ -1,6 +1,17 @@
 import { v4 as uuidv4 } from 'uuid';
 
-const addMarkStep = (state, tr, step, newTr, map, doc, user, date, group) => {
+const addMarkStep = (
+  state,
+  tr,
+  step,
+  newTr,
+  map,
+  doc,
+  user,
+  date,
+  group,
+  viewId,
+) => {
   doc.nodesBetween(step.from, step.to, (node, pos) => {
     if (!node.isInline) {
       return true;
@@ -43,13 +54,14 @@ const addMarkStep = (state, tr, step, newTr, map, doc, user, date, group) => {
           step.from,
           step.to,
           state.schema.marks.format_change.create({
+            id: uuidv4(),
             user: user.userId,
             username: user.username,
             date,
             before,
             after,
             group,
-            id: uuidv4(),
+            viewid: viewId,
           }),
         );
       } else if (formatChangeMark) {
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markDeletion.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markDeletion.js
index b577ad969..25cb33220 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markDeletion.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markDeletion.js
@@ -2,7 +2,7 @@ import { Selection, TextSelection } from 'prosemirror-state';
 import { Slice } from 'prosemirror-model';
 import { ReplaceStep, Mapping } from 'prosemirror-transform';
 
-const markDeletion = (tr, from, to, user, date, group) => {
+const markDeletion = (tr, from, to, user, date, group, viewId) => {
   const deletionMark = tr.doc.type.schema.marks.deletion.create({
     user: user.userId,
     username: user.username,
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js
index d9c6d8414..c91420e2d 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js
@@ -1,12 +1,12 @@
-import { v4 as uuidv4 } from "uuid";
+import { v4 as uuidv4 } from 'uuid';
 
-const markInsertion = (tr, from, to, user, date, group) => {
+const markInsertion = (tr, from, to, user, date, group, viewId) => {
   tr.removeMark(from, to, tr.doc.type.schema.marks.deletion);
   tr.removeMark(from, to, tr.doc.type.schema.marks.insertion);
 
   const insertionMark = tr.doc.type.schema.marks.insertion.create({
     user: user.userId,
-    username: user.username
+    username: user.username,
     // date
   });
 
@@ -15,12 +15,12 @@ const markInsertion = (tr, from, to, user, date, group) => {
   tr.doc.nodesBetween(from, to, (node, pos) => {
     if (
       pos < from ||
-      ["bullet_list", "ordered_list"].includes(node.type.name)
+      ['bullet_list', 'ordered_list'].includes(node.type.name)
     ) {
       return true;
     } else if (
       node.isInline ||
-      ["table_row", "table_cell"].includes(node.type.name)
+      ['table_row', 'table_cell'].includes(node.type.name)
     ) {
       return false;
     }
@@ -28,21 +28,22 @@ const markInsertion = (tr, from, to, user, date, group) => {
       const track = [];
 
       track.push({
-        type: "insertion",
+        type: 'insertion',
         user: user.userId,
         username: user.username,
         date,
-        group
+        group,
+        viewid: viewId,
       });
 
       tr.setNodeMarkup(
         pos,
         null,
         Object.assign({}, node.attrs, { track, group, id: uuidv4() }),
-        node.marks
+        node.marks,
       );
     }
-    if (node.type.name === "table") {
+    if (node.type.name === 'table') {
       // A table was inserted. We don't add track marks to elements inside of it.
       return false;
     }
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markWrapping.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markWrapping.js
index 4ceec4eb5..c1bbe4722 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markWrapping.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markWrapping.js
@@ -1,6 +1,7 @@
 import { v4 as uuidv4 } from 'uuid';
 
-const markWrapping = (tr, pos, oldNode, newNode, user, date, group) => {
+const markWrapping = (tr, pos, oldNode, newNode, user, date, group, viewId) => {
+  console.log(viewId, 'hooo');
   let track = oldNode.attrs.track.slice();
   let blockTrack = track.find(track => track.type === 'block_change');
 
@@ -38,7 +39,12 @@ const markWrapping = (tr, pos, oldNode, newNode, user, date, group) => {
   tr.setNodeMarkup(
     pos,
     null,
-    Object.assign({}, newNode.attrs, { track, group, id: uuidv4() }),
+    Object.assign({}, newNode.attrs, {
+      track,
+      group,
+      id: uuidv4(),
+      viewid: viewId,
+    }),
   );
 };
 
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceAroundStep.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceAroundStep.js
index 373ec42c1..b5b505cbe 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceAroundStep.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceAroundStep.js
@@ -13,6 +13,7 @@ const replaceAroundStep = (
   user,
   date,
   group,
+  viewId,
 ) => {
   if (step.from === step.gapFrom && step.to === step.gapTo) {
     // wrapped in something
@@ -43,6 +44,7 @@ const replaceAroundStep = (
         user,
         date,
         group,
+        viewId,
       );
     }
   } else {
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js
index 3fef5b5e4..2a78141df 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js
@@ -4,7 +4,18 @@ import { DocumentHelpers } from 'wax-prosemirror-utilities';
 import markDeletion from './markDeletion';
 import markInsertion from './markInsertion';
 
-const replaceStep = (state, tr, step, newTr, map, doc, user, date, group) => {
+const replaceStep = (
+  state,
+  tr,
+  step,
+  newTr,
+  map,
+  doc,
+  user,
+  date,
+  group,
+  viewId,
+) => {
   const deletionMarkSchema = state.schema.marks.deletion;
   const deletionMark = DocumentHelpers.findMark(
     state,
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js
index 1d8e18fa0..b5ff32517 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js
@@ -13,7 +13,13 @@ import replaceAroundStep from './helpers/replaceAroundStep';
 import addMarkStep from './helpers/addMarkStep';
 import removeMarkStep from './helpers/removeMarkStep';
 
-const trackedTransaction = (tr, state, user, group = 'main') => {
+const trackedTransaction = (
+  tr,
+  state,
+  user,
+  group = 'main',
+  viewId = 'main',
+) => {
   // Don't track table operations
   if (!tr.selectionSet) {
     const $pos = state.selection.$anchor;
@@ -61,16 +67,60 @@ const trackedTransaction = (tr, state, user, group = 'main') => {
 
     switch (step.constructor) {
       case ReplaceStep:
-        replaceStep(state, tr, step, newTr, map, doc, user, date, group);
+        replaceStep(
+          state,
+          tr,
+          step,
+          newTr,
+          map,
+          doc,
+          user,
+          date,
+          group,
+          viewId,
+        );
         break;
       case ReplaceAroundStep:
-        replaceAroundStep(state, tr, step, newTr, map, doc, user, date, group);
+        replaceAroundStep(
+          state,
+          tr,
+          step,
+          newTr,
+          map,
+          doc,
+          user,
+          date,
+          group,
+          viewId,
+        );
         break;
       case AddMarkStep:
-        addMarkStep(state, tr, step, newTr, map, doc, user, date, group);
+        addMarkStep(
+          state,
+          tr,
+          step,
+          newTr,
+          map,
+          doc,
+          user,
+          date,
+          group,
+          viewId,
+        );
         break;
       case RemoveMarkStep:
-        removeMarkStep(state, tr, step, newTr, map, doc, user, date, group);
+        removeMarkStep(
+          state,
+          tr,
+          step,
+          newTr,
+          map,
+          doc,
+          user,
+          date,
+          group,
+          viewId,
+        );
         break;
       default:
     }
diff --git a/wax-prosemirror-utilities/src/schema/DefaultSchema.js b/wax-prosemirror-utilities/src/schema/DefaultSchema.js
index 26295da14..73703ab0e 100644
--- a/wax-prosemirror-utilities/src/schema/DefaultSchema.js
+++ b/wax-prosemirror-utilities/src/schema/DefaultSchema.js
@@ -25,6 +25,7 @@ export default {
         class: { default: 'paragraph' },
         track: { default: [] },
         group: { default: '' },
+        viewid: { default: '' },
       },
       parseDOM: [
         {
@@ -35,6 +36,7 @@ export default {
               class: dom.getAttribute('class'),
               track: SchemaHelpers.parseTracks(dom.dataset.track),
               group: dom.dataset.group,
+              viewid: dom.dataset.viewid,
             };
           },
         },
diff --git a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
index 79134bb58..9875e8669 100644
--- a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
+++ b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
@@ -11,7 +11,7 @@ const parseFormatList = str => {
   if (!Array.isArray(formatList)) {
     return [];
   }
-  return formatList.filter(format => typeof format === "string");
+  return formatList.filter(format => typeof format === 'string');
 };
 
 const parseTracks = str => {
@@ -29,11 +29,11 @@ const parseTracks = str => {
   }
   return tracks.filter(
     (
-      track // ensure required fields are present
+      track, // ensure required fields are present
     ) =>
-      track.hasOwnProperty("user") &&
-      track.hasOwnProperty("username") &&
-      track.hasOwnProperty("date")
+      track.hasOwnProperty('user') &&
+      track.hasOwnProperty('username') &&
+      track.hasOwnProperty('date'),
   );
 };
 
@@ -41,10 +41,11 @@ const blockLevelToDOM = node => {
   const attrs =
     node.attrs.track && node.attrs.track.length
       ? {
-          "data-id": node.attrs.id,
+          'data-id': node.attrs.id,
           class: node.attrs.class,
-          "data-track": JSON.stringify(node.attrs.track),
-          "data-group": node.attrs.group
+          'data-track': JSON.stringify(node.attrs.track),
+          'data-group': node.attrs.group,
+          'data-viewid': node.attrs.viewid,
         }
       : { class: node.attrs.class };
   return attrs;
-- 
GitLab