diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js index d525de58a9acb9239d4c371027702ab6583d3184..c4dde0a55a19aa9a4f656d767a73d443b0da8c36 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/markDeletion.js @@ -115,6 +115,7 @@ const markDeletion = (tr, from, to, user, date, group, viewId) => { track, group, id: uuidv4(), + viewid: viewId, }), // Object.assign(node.attrs.track, { track }), node.marks, diff --git a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js index 98fd4204711fea0b3230761d7ef656eb6ee6a77d..dd5bc0164d80cb49f7388bf5a94bc194f02a6ea9 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js +++ b/wax-prosemirror-core/src/utilities/track-changes/helpers/replaceStep.js @@ -68,7 +68,9 @@ const replaceStep = ( } } if (step.from !== step.to) { - map.appendMap(markDeletion(newTr, step.from, step.to, user, date, group)); + map.appendMap( + markDeletion(newTr, step.from, step.to, user, date, group, viewId), + ); } }; diff --git a/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js b/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js index e57621f922e1c48cd7180d02579885c34d50f1eb..7373eb3a25fa47f6507d3e4e46c178c29e7378b9 100644 --- a/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js +++ b/wax-prosemirror-core/src/utilities/track-changes/trackedTransaction.js @@ -39,6 +39,7 @@ const trackedTransaction = ( 'inputType', 'uiEvent', 'paste', + 'pointer', 'imagePlaceHolder$', 'imagePlaceHolder$1', ].includes(meta), diff --git a/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js b/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js index c8ffdd9231d3615fe1f379f557d54fd41a7ee1c6..6b67fb815b9dbe165a0b27645d571ae78a3561be 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js +++ b/wax-prosemirror-services/src/CommentsService/components/ConnectedTrackChange.js @@ -81,13 +81,27 @@ export default ({ trackChangeId, top, recalculateTops, trackChange }) => { const onClickAccept = () => { const acceptConfig = app.config.get('config.AcceptTrackChangeService'); - acceptTrackChange(state, dispatch, user, activeTrackChange, acceptConfig); + acceptTrackChange( + dispatch, + user, + activeTrackChange, + acceptConfig, + context, + trackChange, + ); pmViews[viewId].focus(); }; const onClickReject = () => { const rejectConfig = app.config.get('config.RejectTrackChangeService'); - rejectTrackChange(state, dispatch, user, activeTrackChange, rejectConfig); + rejectTrackChange( + dispatch, + user, + activeTrackChange, + rejectConfig, + context, + trackChange, + ); pmViews[viewId].focus(); }; diff --git a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/AcceptTrackChange.js b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/AcceptTrackChange.js index 044d12b414ad6507e9427489e629e352d629b323..02a6dfcda60041b3869675c5f5cdb60070c062da 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/AcceptTrackChange.js +++ b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/AcceptTrackChange.js @@ -15,124 +15,122 @@ const checkFromConfig = (mark, user, config) => { }; const acceptTrackChange = ( - state, dispatch, user, activeTrackChange, acceptConfig, + context, + trackData, ) => { + const { activeView } = context; + const { state } = activeView; const { tr, - selection: { from, to }, + selection: { from }, } = state; + let { to } = activeTrackChange; + + if (trackData?.node?.type?.name === 'figure') { + to = activeTrackChange.from + 3; + } + tr.setMeta('AcceptReject', true); const map = new Mapping(); - state.doc.nodesBetween( - activeTrackChange.from, - activeTrackChange.to, - (node, pos) => { - if ( - node.attrs.track && - node.attrs.track.find(track => track.type === 'deletion') - ) { - removeNode(tr, node, pos, map); - } - if ( - node.marks && - node.marks.find(mark => mark.type.name === 'deletion') - ) { - const deletionMark = node.marks.find( - mark => mark.type.name === 'deletion', - ); + state.doc.nodesBetween(activeTrackChange.from, to, (node, pos) => { + if ( + node.attrs.track && + node.attrs.track.find(track => track.type === 'deletion') + ) { + removeNode(tr, node, pos, map); + } + if (node.marks && node.marks.find(mark => mark.type.name === 'deletion')) { + const deletionMark = node.marks.find( + mark => mark.type.name === 'deletion', + ); - const configCheck = checkFromConfig(deletionMark, user, acceptConfig); - if (!configCheck) return; + const configCheck = checkFromConfig(deletionMark, user, acceptConfig); + if (!configCheck) return; - const deletionStep = new ReplaceStep( + 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()); + } else if ( + node.attrs.track && + node.attrs.track.find(track => track.type === 'insertion') + ) { + const track = node.attrs.track.filter( + track => track.type !== 'insertion', + ); + tr.setNodeMarkup( + map.map(pos), + null, + Object.assign(node.attrs.track, { track }), + node.marks, + ); + } else if ( + node.marks && + node.marks.find(mark => mark.type.name === 'insertion') + ) { + const insertionMark = node.marks.find( + mark => mark.type.name === 'insertion', + ); + const configCheck = checkFromConfig(insertionMark, user, acceptConfig); + if (!configCheck) return; + + tr.step( + new RemoveMarkStep( map.map(Math.max(pos, from)), map.map(Math.min(pos + node.nodeSize, to)), - Slice.empty, - ); - tr.step(deletionStep); - map.appendMap(deletionStep.getMap()); - } else if ( - node.attrs.track && - node.attrs.track.find(track => track.type === 'insertion') - ) { - const track = node.attrs.track.filter( - track => track.type !== 'insertion', - ); - tr.setNodeMarkup( - map.map(pos), - null, - Object.assign(node.attrs.track, { track }), - node.marks, - ); - } else if ( - node.marks && - node.marks.find(mark => mark.type.name === 'insertion') - ) { - const insertionMark = node.marks.find( - mark => mark.type.name === 'insertion', - ); - const configCheck = checkFromConfig(insertionMark, user, acceptConfig); - if (!configCheck) return; + insertionMark, + ), + ); + } else if ( + node.marks && + node.marks.find(mark => mark.type.name === 'format_change') + ) { + const formatChangeMark = node.marks.find( + mark => mark.type.name === 'format_change', + ); + const configCheck = checkFromConfig(formatChangeMark, user, acceptConfig); + if (!configCheck) return; - tr.step( - new RemoveMarkStep( - map.map(Math.max(pos, from)), - map.map(Math.min(pos + node.nodeSize, to)), - insertionMark, - ), - ); - } else if ( - node.marks && - node.marks.find(mark => mark.type.name === 'format_change') - ) { - const formatChangeMark = node.marks.find( - mark => mark.type.name === 'format_change', - ); - const configCheck = checkFromConfig( + tr.step( + new RemoveMarkStep( + activeTrackChange.from, + activeTrackChange.to, formatChangeMark, - user, - acceptConfig, - ); - if (!configCheck) return; - - tr.step( - new RemoveMarkStep( - activeTrackChange.from, - activeTrackChange.to, - formatChangeMark, - ), - ); - } else if ( - node.attrs.track && - node.attrs.track.find(track => track.type === 'block_change') - ) { - const blockChangeTrack = node.attrs.track.find( - track => track.type === 'block_change', - ); + ), + ); + } else if ( + node.attrs.track && + node.attrs.track.find(track => track.type === 'block_change') + ) { + const blockChangeTrack = node.attrs.track.find( + track => track.type === 'block_change', + ); - const track = node.attrs.track.filter( - track => track !== blockChangeTrack, - ); + const track = node.attrs.track.filter( + track => track !== blockChangeTrack, + ); - tr.setNodeMarkup( - map.map(pos), - null, - { - class: node.attrs.class, - track: [], - }, - // Object.assign(node.attrs.track, { track }), - node.marks, - ); - } - }, - ); + tr.setNodeMarkup( + map.map(pos), + null, + { + class: node.attrs.class, + track: [], + }, + // Object.assign(node.attrs.track, { track }), + node.marks, + ); + } + }); if (tr.steps.length) dispatch(tr); }; diff --git a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/RejectTrackChange.js b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/RejectTrackChange.js index 039bf44469d3d29dabf8a1e0233106935986904f..49a75f7ed8c6f9ec356ffc868c181d1d6496a711 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/RejectTrackChange.js +++ b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/RejectTrackChange.js @@ -20,20 +20,30 @@ const checkFromConfig = (mark, user, config) => { }; const rejectTrackChange = ( - state, dispatch, user, activeTrackChange, rejectConfig, + context, + trackData, ) => { + const { activeView } = context; + const { state } = activeView; const { tr, - selection: { from, to }, + selection: { from }, } = state; + + let { to } = activeTrackChange; + + if (trackData?.node?.type?.name === 'figure') { + to = activeTrackChange.from + 3; + } + console.log(activeTrackChange, trackData); tr.setMeta('AcceptReject', true); const map = new Mapping(); - state.doc.nodesBetween(from, to, (node, pos) => { + state.doc.nodesBetween(activeTrackChange.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', @@ -48,15 +58,19 @@ const rejectTrackChange = ( deletionMark, ), ); - } else if ( + } + if ( node.attrs.track && node.attrs.track.find(track => track.type === 'insertion') ) { removeNode(tr, node, pos, map); } else if ( - node.marks && - node.marks.find(mark => mark.type.name === 'insertion') + node.attrs.track && + node.attrs.track.find(track => track.type === 'deletion') ) { + tr.setNodeMarkup(map.map(pos), undefined, { ...node.attrs, track: [] }); + } + if (node.marks && node.marks.find(mark => mark.type.name === 'insertion')) { const insertionMark = node.marks.find( mark => mark.type.name === 'insertion', ); diff --git a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/TrackChangesBox.js b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/TrackChangesBox.js index 87c6cc0f733608b60e628dfd78d664b0837919f4..9316652ab92e983a54fa529eacf74ef31e868229 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/TrackChangesBox.js +++ b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/TrackChangesBox.js @@ -127,6 +127,7 @@ const TrackChangesBox = props => { const labelBlockChange = 'changed '; let textBlockChange = ''; let textBlockInsert = ''; + let textBlockRemoved = ''; if (trackData.type && trackData.type.name === 'format_change') { const { before, after } = trackData.attrs; @@ -156,6 +157,9 @@ const TrackChangesBox = props => { if (track.type === 'block_change') { textBlockChange = `${track.before.type} to ${trackData.node.type.name}`; } + if (track.type === 'deletion') { + textBlockRemoved = trackData.node.type.name; + } } return ( @@ -198,6 +202,12 @@ const TrackChangesBox = props => { <Text>{textBlockInsert}</Text> </ActionWrapper> )} + {textBlockRemoved !== '' && ( + <ActionWrapper> + <Label>{labelRemoved}</Label> + <Text>{textBlockRemoved}</Text> + </ActionWrapper> + )} {textBlockChange !== '' && ( <ActionWrapper> <Label>{labelBlockChange}</Label> diff --git a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/removeNode.js b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/removeNode.js index c698e47c2ef9c4ec4ba8ce83db491a7c34d35c3c..ce8b4788a1907e0445ffd2dff02ee9f27828c592 100644 --- a/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/removeNode.js +++ b/wax-prosemirror-services/src/CommentsService/components/ui/trackChanges/removeNode.js @@ -1,13 +1,23 @@ -import { replaceStep } from 'prosemirror-transform'; +import { replaceStep, ReplaceStep } from 'prosemirror-transform'; +import { Slice } from 'prosemirror-model'; import { Selection } from 'prosemirror-state'; const removeNode = (tr, node, nodePos, map) => { const newNodePos = map.map(nodePos); + let delStep; const selectionBefore = Selection.findFrom(tr.doc.resolve(newNodePos), -1); const start = selectionBefore.$anchor.pos; const end = newNodePos + 1; - const delStep = replaceStep(tr.doc, start, end); + if (node.isLeaf || ['figure', 'table'].includes(node.type.name)) { + delStep = new ReplaceStep( + newNodePos, + map.map(nodePos + node.nodeSize), + Slice.empty, + ); + } else { + delStep = replaceStep(tr.doc, start, end); + } tr.step(delStep); const stepMap = delStep.getMap(); diff --git a/wax-prosemirror-services/src/ImageService/AltComponent.js b/wax-prosemirror-services/src/ImageService/AltComponent.js index d6469398d24591ba339602ab295fb9a27c3e7ca6..8f6212426cf6fefdd509517162e1642ba8aee6fc 100644 --- a/wax-prosemirror-services/src/ImageService/AltComponent.js +++ b/wax-prosemirror-services/src/ImageService/AltComponent.js @@ -64,10 +64,12 @@ export default ({ setPosition, position }) => { const { selection } = activeView.state; setAltText(altRef.current.value); activeView.dispatch( - activeView.state.tr.setNodeMarkup(selection.from, undefined, { - ...selection.node.attrs, - alt: altRef.current.value, - }), + activeView.state.tr + .setNodeMarkup(selection.from, undefined, { + ...selection.node.attrs, + alt: altRef.current.value, + }) + .setMeta('imageAlt', true), ); };