diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js index 0c382d617a2b083754a2c7203c2b9f173e0ecc69..dc0a2b609893496b33cacde10d68ad1c3a0e72ee 100644 --- a/editors/editoria/src/Editoria.js +++ b/editors/editoria/src/Editoria.js @@ -47,7 +47,9 @@ const Editoria = () => ( autoFocus placeholder="Type Something..." fileUpload={file => renderImage(file)} - value={"<p>this is some content</p><p>second paragraph</p>"} + value={ + '<p class="paragraph">this is <span class="deletion user-1234" data-id="" data-user="1234" data-username="demo" data-date="26486384" data-group="">some</span> content</p><p class="paragraph">second paragraph</p>' + } layout={EditoriaLayout} TrackChange // onChange={source => console.log(source)} 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 e0bfd55efbdbe50ef3d8215587167ad9b75f27f9..72c2028b2abc74ec2a6cc16f62849e308919dfe6 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/replaceStep.js @@ -1,21 +1,29 @@ import { ReplaceStep } from "prosemirror-transform"; import { CellSelection } from "prosemirror-tables"; +import { DocumentHelpers } from "wax-prosemirror-utilities"; import markDeletion from "./markDeletion"; import markInsertion from "./markInsertion"; const replaceStep = (state, tr, step, newTr, map, doc, user, date) => { - // We only insert content if this is not directly a tr for cell deletion. This is because tables delete rows by deleting the - // contents of each cell and replacing it with an empty paragraph. const cellDeleteTr = ["deleteContentBackward", "deleteContentForward"].includes( tr.getMeta("inputType") ) && state.selection instanceof CellSelection; + // if deletion mark move to the end of deletion + const deletionMarkSchema = state.schema.marks.deletion; + const deletionMark = DocumentHelpers.findMark( + state, + deletionMarkSchema, + false + ); + const positionTo = deletionMark ? deletionMark.to : step.to; + const newStep = !cellDeleteTr ? new ReplaceStep( - step.to, // We insert all the same steps, but with "from"/"to" both set to "to" in order not to delete content. Mapped as needed. - step.to, + positionTo, // We insert all the same steps, but with "from"/"to" both set to "to" in order not to delete content. Mapped as needed. + positionTo, step.slice, step.structure ) @@ -28,6 +36,7 @@ const replaceStep = (state, tr, step, newTr, map, doc, user, date) => { return; } const mappedNewStepTo = newStep.getMap().map(newStep.to); + markInsertion(trTemp, newStep.from, mappedNewStepTo, user, date); // We condense it down to a single replace step. const condensedStep = new ReplaceStep( diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js index ce093309726d978ff4184d26c670896c9481d4df..ee80e0839238ed243a68849bf2502aaa72563165 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js @@ -13,6 +13,8 @@ import { Mapping } from "prosemirror-transform"; +import { DocumentHelpers } from "wax-prosemirror-utilities"; + import replaceStep from "./helpers/replaceStep"; import replaceAroundStep from "./helpers/replaceAroundStep"; import addMarkStep from "./helpers/addMarkStep"; @@ -65,6 +67,13 @@ const trackedTransaction = (tr, state, user) => { } if (tr.selectionSet) { + const deletionMarkSchema = state.schema.marks.deletion; + const deletionMark = DocumentHelpers.findMark( + state, + deletionMarkSchema, + false + ); + if ( tr.selection instanceof TextSelection && (tr.selection.from < state.selection.from || @@ -72,7 +81,11 @@ const trackedTransaction = (tr, state, user) => { ) { const caretPos = map.map(tr.selection.from, -1); newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); + } else if (tr.selection.from > state.selection.from && deletionMark) { + const caretPos = map.map(deletionMark.to + 1, 1); + newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); } else { + console.log("not"); newTr.setSelection(tr.selection.map(newTr.doc, map)); } }