diff --git a/editors/editoria/src/config/config.js b/editors/editoria/src/config/config.js index 319094f1a7c8abbc3b3c5b71224b78a255949f01..6a29c0f794a50e5f6a3a00eb066093403b02ca58 100644 --- a/editors/editoria/src/config/config.js +++ b/editors/editoria/src/config/config.js @@ -71,9 +71,9 @@ export default { new TextBlockLevelService(), new TextToolGroupService(), new ListsService(), + new LinkService(), new TrackChangeService(), new CommentsService(), - new LinkService(), new PlaceholderService(), new ImageService(), new InlineAnnotationsService(), diff --git a/wax-prosemirror-components/src/components/link/LinkComponent.js b/wax-prosemirror-components/src/components/link/LinkComponent.js index c44c989fe393ce578cf4a4da3f3fc7b7810b8fcc..7fc43a202c8c296700f9298f65e1a0f19462e21c 100644 --- a/wax-prosemirror-components/src/components/link/LinkComponent.js +++ b/wax-prosemirror-components/src/components/link/LinkComponent.js @@ -43,6 +43,7 @@ const LinkComponent = ({ mark, setPosition, position }) => { const href = linkHref; const linkMark = state.schema.marks.link; const { tr } = state; + dispatch( tr.addMark( mark.from, @@ -86,7 +87,7 @@ const LinkComponent = ({ mark, setPosition, position }) => { const removeMarkIfEmptyHref = () => { const { selection: { $from, $to } } = state; const PMLinkMark = state.schema.marks["link"]; - const actualMark = DocumentHelpers.findMark(state, PMLinkMark); + const actualMark = DocumentHelpers.getSelectionMark(state, PMLinkMark); setLLastLinkMark(actualMark); if ( diff --git a/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js b/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js index 9acb8015c9b1340c4ddd630a51e2f4c52d58c893..9aee856a0018f196896ff03d37c48417e977270d 100644 --- a/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js +++ b/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js @@ -31,6 +31,26 @@ const NoteStyled = styled.div` background-color: #ffab20; } } + + span.deletion { + text-decoration: line-through; + color: red; + } + + span.insertion { + color: blue; + } + + .selected-insertion, + .selected-deletion, + .selected-format-change, + .selected-block-change { + background-color: #fffacf; + } + + .format-change { + border-bottom: 2px solid blue; + } `; const NoteEditorContainer = React.forwardRef((props, ref) => ( diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js index 7c1fadeca38daa1a181cdd8451d51b748b1828d5..84d2d9b35d656ddc35ddfbf123369c003b5e85a2 100644 --- a/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js +++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js @@ -28,7 +28,6 @@ const TrackChangeBoxStyled = styled.div` `; export default ({ trackChange, view, top, dataBox }) => { - console.log(trackChange); const [animate, setAnimate] = useState(false); const { view: { main }, app, activeView } = useContext(WaxContext); let action; diff --git a/wax-prosemirror-core/src/WaxView.js b/wax-prosemirror-core/src/WaxView.js index e6ab661e0ad8433d5547d3ddc513295a67488c0f..5b1a7c08a8241e9a8fbb31ff60590353cfbfa71e 100644 --- a/wax-prosemirror-core/src/WaxView.js +++ b/wax-prosemirror-core/src/WaxView.js @@ -45,6 +45,7 @@ export default props => { } } ); + context.updateView( { main: view @@ -59,20 +60,25 @@ export default props => { const dispatchTransaction = transaction => { const { TrackChange } = props; - const group = "main"; const tr = TrackChange - ? trackedTransaction(transaction, view.state, user, group) + ? trackedTransaction(transaction, view.state, user) : transaction; const state = view.state.apply(tr); view.updateState(state); - context.updateView( - { - main: view - }, - "main" - ); + /*when a transaction comes from a view other than + main don't keep updating the view ,as this is + the central point of each transaction + */ + if (!transaction.getMeta("outsideView")) { + context.updateView( + { + main: view + }, + "main" + ); + } props.onChange(state.doc.content); }; diff --git a/wax-prosemirror-schema/src/nodes/footNoteNode.js b/wax-prosemirror-schema/src/nodes/footNoteNode.js index 3a1f74070bdafd5820607647f96692637acfeb67..a83987c177ce1a008ff878985b61bf64f10a1478 100644 --- a/wax-prosemirror-schema/src/nodes/footNoteNode.js +++ b/wax-prosemirror-schema/src/nodes/footNoteNode.js @@ -1,3 +1,4 @@ +//TODO Write the node in WaxSchema const footnote = { group: "inline", content: "inline*", diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index 12ce67a8888d038999c8868a8cafe5e6d775ff00..87d36a6628e4127b322f3f9334027eee53fd090e 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -39,6 +39,11 @@ export default ({ node, view }) => { node: { attrs: { id: noteId } } }); + //Set everytime the active view into context + setTimeout(() => { + context.updateView({}, noteId); + }, 20); + if (!tr.getMeta("fromOutside")) { let outerTr = view.state.tr, offsetMap = StepMap.offset(noteFound[0].pos + 1); @@ -48,10 +53,8 @@ export default ({ node, view }) => { outerTr.step(steps[j].map(offsetMap)); } - if (outerTr.docChanged) view.dispatch(outerTr); - - //Set everytime the active view into context - context.updateView({}, noteId); + if (outerTr.docChanged) + view.dispatch(outerTr.setMeta("outsideView", "notes")); } }, handleDOMEvents: { diff --git a/wax-prosemirror-services/src/OverlayService/usePosition.js b/wax-prosemirror-services/src/OverlayService/usePosition.js index 9768d0aa241f85305d2d0ecde1503f02589a26a1..dc2738477299a21895b39f42f481d2bd2f82e668 100644 --- a/wax-prosemirror-services/src/OverlayService/usePosition.js +++ b/wax-prosemirror-services/src/OverlayService/usePosition.js @@ -55,7 +55,7 @@ export default options => { const displayOnMark = (activeView, options) => { const { markType, followCursor } = options; const PMmark = activeView.state.schema.marks[markType]; - mark = DocumentHelpers.findMark(activeView.state, PMmark); + mark = DocumentHelpers.getSelectionMark(activeView.state, PMmark); if (!isObject(mark)) return defaultOverlay; const { from, to } = followCursor ? activeView.state.selection : mark; diff --git a/wax-prosemirror-services/src/SchemaService/Node.js b/wax-prosemirror-services/src/SchemaService/Node.js index c3108aea345571c4ec27a430dd05e603b16517ca..ae38bf3dbca268f657cad94109b33c2512f2284d 100644 --- a/wax-prosemirror-services/src/SchemaService/Node.js +++ b/wax-prosemirror-services/src/SchemaService/Node.js @@ -6,11 +6,12 @@ export default class Node { name = ""; importer = {}; - isolating = false; + atom = false; inline = false; + isolating = false; + draggable = false; group = ""; content = ""; - draggable = false; _attrs = {}; _parseRules = []; @@ -57,6 +58,7 @@ export default class Node { const importer = this.importer; return { + atom: this.atom, inline: this.inline, group: this.group, content: this.content, 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 c8c6d547cc1cb597b96beb43aba9c678aef98483..d9c6d841428a7e2cbb028dd083daf2cc0a15e7b1 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/markInsertion.js @@ -1,3 +1,5 @@ +import { v4 as uuidv4 } from "uuid"; + const markInsertion = (tr, from, to, user, date, group) => { tr.removeMark(from, to, tr.doc.type.schema.marks.deletion); tr.removeMark(from, to, tr.doc.type.schema.marks.insertion); @@ -36,7 +38,7 @@ const markInsertion = (tr, from, to, user, date, group) => { tr.setNodeMarkup( pos, null, - Object.assign({}, node.attrs, { track, group }), + Object.assign({}, node.attrs, { track, group, id: uuidv4() }), node.marks ); } diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js index 0cebdfbbde3d8dcf1a52c7fa5c171b827c99dfa2..10d5dadef64454b757045699501b038ee8b03016 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js @@ -20,18 +20,19 @@ import replaceAroundStep from "./helpers/replaceAroundStep"; import addMarkStep from "./helpers/addMarkStep"; import removeMarkStep from "./helpers/removeMarkStep"; -const trackedTransaction = (tr, state, user, group) => { +const trackedTransaction = (tr, state, user) => { if ( !tr.steps.length || (tr.meta && !Object.keys(tr.meta).every(metadata => - ["inputType", "uiEvent", "paste"].includes(metadata) + ["inputType", "uiEvent", "paste", "outsideView"].includes(metadata) )) || ["historyUndo", "historyRedo"].includes(tr.getMeta("inputType")) ) { return tr; } + const group = tr.getMeta("outsideView") ? tr.getMeta("outsideView") : "main"; const newTr = state.tr; const map = new Mapping(); const date = Math.floor(Date.now() / 300000); diff --git a/wax-prosemirror-utilities/src/document/DocumentHelpers.js b/wax-prosemirror-utilities/src/document/DocumentHelpers.js index 37a09a354e27b5d3c0adbdf53b2d27df3c9060ab..f29e9bad9975c17100a787fac0fb0dc8b2a6cd42 100644 --- a/wax-prosemirror-utilities/src/document/DocumentHelpers.js +++ b/wax-prosemirror-utilities/src/document/DocumentHelpers.js @@ -23,6 +23,25 @@ const findMark = (state, PMmark, toArr = false) => { return markFound; }; +const getSelectionMark = (state, PMmark) => { + const { selection: { $from, $to }, doc } = state; + let markFound; + doc.nodesBetween($from.pos, $to.pos, (node, from) => { + if (node.marks) { + const actualMark = node.marks.find(mark => mark.type === PMmark); + if (actualMark) { + markFound = { + from: $from.pos, + to: $to.pos, + attrs: actualMark.attrs + }; + } + } + }); + + return markFound; +}; + export const flatten = (node, descend = true) => { if (!node) { throw new Error('Invalid "node" parameter'); @@ -72,5 +91,6 @@ export default { findChildrenByType, findInlineNodes, findChildrenByMark, - findChildrenByAttr + findChildrenByAttr, + getSelectionMark };