diff --git a/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js b/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js index c9ef672c744d68c6b070d882db9b4f4676d09c8a..9f45a6e305a13cc78e52be814334a75bd796b2f4 100644 --- a/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js +++ b/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js @@ -1,5 +1,5 @@ import { AnnotationComponent, createAnnotation, deleteNode } from 'substance' - +import {pickBy, clone, map, sortBy, findIndex} from 'lodash' class TrackChangeComponent extends AnnotationComponent { render ($$) { const user = this.context.controller.props.user @@ -41,7 +41,6 @@ class TrackChangeComponent extends AnnotationComponent { const className = 'sc-track-change-' + status el.addClass(className) - return el } @@ -56,7 +55,7 @@ class TrackChangeComponent extends AnnotationComponent { toggleTrackChangeView () { const self = this const surface = self.getSurface() - + if (!surface) return return surface._owner.state.trackChangesView } @@ -65,15 +64,16 @@ class TrackChangeComponent extends AnnotationComponent { const status = this.props.node.status const ds = this.getDocumentSession() const doc = ds.getDocument() - const nodeData = this.buildNodeData() - + const nodeData = this.buildNodeData(nodeId) + const nextNodeId = this.findNextTrackNode(nodeId) var self = this - ds.transaction(function (tx, args) { if (status === 'add') createAnnotation(doc, nodeData) deleteNode(tx, { nodeId: nodeId }) if (status === 'delete') self.context.surface.delete(tx, nodeData) }) + const nextNodeData = self.buildNodeData(nextNodeId) + self.context.surface.setSelection(nextNodeData.selection) } rejectTrackChange () { @@ -81,19 +81,19 @@ class TrackChangeComponent extends AnnotationComponent { const status = this.props.node.status const ds = this.getDocumentSession() const doc = ds.getDocument() - const nodeData = this.buildNodeData() - + const nodeData = this.buildNodeData(nodeId) + const nextNodeId = this.findNextTrackNode(nodeId) var self = this - ds.transaction(function (tx, args) { if (status === 'delete') createAnnotation(doc, nodeData) deleteNode(tx, { nodeId: nodeId }) if (status === 'add') self.context.surface.delete(tx, nodeData) }) + const nextNodeData = self.buildNodeData(nextNodeId) + self.context.surface.setSelection(nextNodeData.selection) } - buildNodeData () { - const nodeId = this.props.node.id + buildNodeData (nodeId) { const ds = this.getDocumentSession() const doc = ds.getDocument() const trackChangeNode = doc.get(nodeId) @@ -110,6 +110,55 @@ class TrackChangeComponent extends AnnotationComponent { } } + findNextTrackNode (currentNodeId) { + const ds = this.getDocumentSession() + let doc = ds.getDocument() + let documentNodes = doc.getNodes() + const trackChanges = pickBy(documentNodes, function (value, key) { + return value.type === 'track-change' + }) + + // return entries sorted in document + const entries = this.sortNodes(trackChanges) + + // find index in Array of resolved track Change + const index = findIndex(entries, function (entry) { + return entry.id === currentNodeId + }) + + const nextIndex = index + 1 + + // If next index exist move to that else move to first + if (entries[nextIndex]) { + return entries[nextIndex].id + } else if (entries.length > 0) { + return entries[0].id + } + return + } + + sortNodes (nodes) { + let trackChanges = clone(nodes) + const ds = this.getDocumentSession() + let doc = ds.getDocument() + const container = doc.get('body') + + trackChanges = map(trackChanges, function (trackChange) { + const blockId = trackChange.path[0] + const blockPosition = container.getPosition(blockId) + const nodePosition = trackChange.startOffset + + return { + id: trackChange.id, + blockPosition: blockPosition, + nodePosition: nodePosition, + node: trackChange + } + }) + + return sortBy(trackChanges, ['blockPosition', 'nodePosition']) + } + getDocumentSession () { return this.context.documentSession }