From 7c3a5f204c16e302706dfa30f0be6987efddb540 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Thu, 5 Jan 2017 17:24:43 +0200
Subject: [PATCH] when resolving a track change autofocus to next one in
 document

---
 .../track_change/TrackChangeComponent.js      | 71 ++++++++++++++++---
 1 file changed, 60 insertions(+), 11 deletions(-)

diff --git a/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js b/app/components/SimpleEditor/elements/track_change/TrackChangeComponent.js
index c9ef672..9f45a6e 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
   }
-- 
GitLab