From cce6a9cb2194fad793ad7a18c1165370814d79f2 Mon Sep 17 00:00:00 2001
From: Alexandros Georgantas <alexgeorg86@gmail.com>
Date: Wed, 12 Apr 2017 15:30:26 +0300
Subject: [PATCH] WIP isolated notes added in the notes pane

---
 .../isolatedNote/IsolatedNoteComponent.js     |   2 +-
 .../isolatedNote/IsolatedNoteHTMLConverter.js |  13 +-
 .../elements/note/NoteComponent.js            |   8 +-
 .../SimpleEditor/miniEditor/config.js         |   5 +-
 .../SimpleEditor/panes/Notes/Notes.js         |   3 +-
 .../SimpleEditor/panes/Notes/NotesProvider.js | 133 +++++++++++++++---
 6 files changed, 127 insertions(+), 37 deletions(-)

diff --git a/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteComponent.js b/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteComponent.js
index 30c380d..b76cca0 100644
--- a/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteComponent.js
+++ b/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteComponent.js
@@ -10,7 +10,7 @@ class IsolatedNoteComponent extends BlockNodeComponent {
       disabled: this.props.disabled,
       tagName: 'p',
       multiLine: true
-    }).ref('nameEditor'))
+    }).ref('noteContentEditor-' + this.props.node.id))
 
     return el
   }
diff --git a/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteHTMLConverter.js b/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteHTMLConverter.js
index e1006da..69668d7 100644
--- a/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteHTMLConverter.js
+++ b/app/components/SimpleEditor/elements/isolatedNote/IsolatedNoteHTMLConverter.js
@@ -1,15 +1,4 @@
 export default {
   type: 'isolated-note',
-  tagName: 'isolated-note',
-
-  import: function (element, node, converter) {
-    console.log('import', node)
-    node['note-content'] = element.attr('note-content')
-  },
-
-  export: function (node, element, converter) {
-    console.log('export', node)
-    var noteContent = node['note-content']
-    element.setAttribute('note-content', noteContent)
-  }
+  tagName: 'isolated-note'
 }
diff --git a/app/components/SimpleEditor/elements/note/NoteComponent.js b/app/components/SimpleEditor/elements/note/NoteComponent.js
index b0b7e29..44bc60a 100644
--- a/app/components/SimpleEditor/elements/note/NoteComponent.js
+++ b/app/components/SimpleEditor/elements/note/NoteComponent.js
@@ -6,7 +6,7 @@ import { Component, documentHelpers } from 'substance'
 class NoteComponent extends Component {
 
   didMount () {
-    this.context.editorSession.onUpdate('', this.createShowNote, this)
+    this.context.editorSession.onUpdate('', this.test, this)
   }
 
   render ($$) {
@@ -16,10 +16,16 @@ class NoteComponent extends Component {
 
     return el
   }
+  test() {
+    const provider = this.getProvider()
+    provider.computeEntries()
+    this.rerender()
+  }
 
   createShowNote () {
     const selected = this.getSelection()
     if (!selected.node) return
+    console.log('in note component', selected.node)
     const provider = this.getProvider()
     this.disableTools(selected)
     provider.createShowNote(selected.node)
diff --git a/app/components/SimpleEditor/miniEditor/config.js b/app/components/SimpleEditor/miniEditor/config.js
index 76d465c..94b702f 100644
--- a/app/components/SimpleEditor/miniEditor/config.js
+++ b/app/components/SimpleEditor/miniEditor/config.js
@@ -4,7 +4,8 @@ import {
   ParagraphPackage,
   ProseArticle,
   StrongPackage,
-  SpellCheckPackage
+  SpellCheckPackage,
+  PersistencePackage
 
 } from 'substance'
 
@@ -30,7 +31,7 @@ let config = {
     config.import(SpellCheckPackage)
     config.import(CommentPackage)
     config.import(IsolatedNote)
-    config.import(TrackChangePackage)
+    config.import(PersistencePackage)
   }
 }
 
diff --git a/app/components/SimpleEditor/panes/Notes/Notes.js b/app/components/SimpleEditor/panes/Notes/Notes.js
index a9ecff7..6f38008 100644
--- a/app/components/SimpleEditor/panes/Notes/Notes.js
+++ b/app/components/SimpleEditor/panes/Notes/Notes.js
@@ -25,7 +25,7 @@ class Notes extends Component {
       provider.createIsolatedNote(notes.main[i])
     }
 
-    provider.config.miniEditorSession.onUpdate('document', this.saveNotes, this)
+    // provider.config.miniEditorSession.onUpdate('document', this.saveNotes, this)
   }
 
   initResize (e) {
@@ -97,6 +97,7 @@ class Notes extends Component {
     forEach(notes.main, function (mainNote) {
       forEach(notes.mini, function (miniNote) {
         if (miniNote.parentNoteId === mainNote.id) {
+          console.log('miniNote', miniNote)
           self.context.editorSession.transaction(function (tx, args) {
             const path = [mainNote.id, 'note-content']
             tx.set(path, miniNote.content)
diff --git a/app/components/SimpleEditor/panes/Notes/NotesProvider.js b/app/components/SimpleEditor/panes/Notes/NotesProvider.js
index 4c9dec7..6ea7324 100644
--- a/app/components/SimpleEditor/panes/Notes/NotesProvider.js
+++ b/app/components/SimpleEditor/panes/Notes/NotesProvider.js
@@ -1,6 +1,6 @@
 import _ from 'lodash'
 
-import { TOCProvider } from 'substance'
+import { TOCProvider, Component } from 'substance'
 
 class NotesProvider extends TOCProvider {
   computeEntries () {
@@ -82,44 +82,137 @@ class NotesProvider extends TOCProvider {
   }
 
   createShowNote (note) {
-
+    const notes = this.computeEntries()
+    _.forEach(notes.mini, function (miniNote) {
+        if (miniNote.parentNoteId === note.id) {
+          console.log('if')
+          return false
+        }
+      }.bind(this))
     if (note['note-content'] !== '') {
       console.log('empty')
       return
     }
 
-    const notes = this.computeEntries()
-
+    
+    console.log('notes', notes)
     if (notes.mini.length === 0) {
       this.createIsolatedNote(note)
       return
     }
 
-    _.forEach(notes.main, function (mainNote) {
-      _.forEach(notes.mini, function (miniNote) {
-        if (miniNote.parentNoteId === mainNote.id) {
-          return false
-        } else {
-          this.createIsolatedNote(note)
-        }
-      }.bind(this))
-    }.bind(this))
+    // _.forEach(notes.main, function (mainNote) {
+    //   _.forEach(notes.mini, function (miniNote) {
+    //     if (miniNote.parentNoteId === mainNote.id) {
+    //       return false
+    //     } else {
+    //       this.createIsolatedNote(note)
+    //     }
+    //   }.bind(this))
+    // }.bind(this))
+    this.createIsolatedNote(note)
+    // console.log('something', this.config.miniEditorSession.getSelection())
   }
 
-  createNodeData (tx, note) {
+  createNodeData (note) {
     return {
       'type': 'isolated-note',
       'content': note['note-content'],
-      'parentNoteId': note.id,
-      'index': 1
+      'parentNoteId': note.id
     }
   }
 
   createIsolatedNote (note) {
-    this.config.miniEditorSession.transaction(function (tx) {
-      let nodeData = this.createNodeData(tx, note)
-      tx.insertBlockNode(nodeData)
-    }.bind(this))
+    console.log('create Isolated Note')
+    // console.log('note', note)
+    // console.log('config', this.config)
+    // let rootEl
+    let existingNodes = this.config.miniEditorContext.doc.getNodes()
+    let hasIsolatedNotes = false
+    // console.log('existingNodes', existingIsolatedNodes)
+    _.mapKeys(existingNodes, function (value, key) {
+      // console.log('key', key)
+      if (key.indexOf('isolated-note') !== -1) {
+        hasIsolatedNotes = true
+      }
+    })
+    if (hasIsolatedNotes) {
+      console.log('hello from true')
+      const docMini = this.config.miniEditorSession.document
+      let nodesMini = ''
+      if (docMini) nodesMini = docMini.getNodes()
+      const notesMini = _.pickBy(nodesMini, function (value, key) {
+        return value.type === 'isolated-note'
+      })
+      const entriesMini = this.sortNodesMini(notesMini)
+      // console.log('isolatedNotes', isolatedNotes)
+      let lastNote = _.last(this.sortNodesMini(entriesMini))
+      // console.log('lastNote', lastNote)
+      // this.config.miniEditorSession.setSelection({
+      //   type: 'node',
+      //   nodeId: lastNote.id,
+      //   containerId: 'body',
+      //   surfaceId: 'body'
+      // })
+      // let selection = this.config.miniEditorSession.getSelection()
+      let surface = this.config.miniEditorContext.surfaceManager.getSurface('body')
+      let container = surface.getContainer()
+      let nodePos = container.getPosition(lastNote.id, 'strict')
+      // console.log('nodepos', nodePos)
+      let nodeData = this.createNodeData(note)
+      this.config.miniEditorSession.transaction(function (tx) {
+        if (!tx.get(nodeData.id)) {
+          let blockNode = tx.create(nodeData)
+          tx.update(container.getContentPath(), { type: 'insert', pos: nodePos + 1, value: blockNode.id })
+        }
+      })
+      // console.log('after new note')
+      // console.log('selection before', selection)
+      // selection.start.offset += 1
+      // selection.end.offset += 1
+      // surface.editorSession.setSelection(selection)
+      // console.log('selection after', selection)
+    } else {
+      // console.log('hello from else')
+      this.config.miniEditorSession.transaction(function (tx) {
+        let nodeData = this.createNodeData(note)
+        tx.insertBlockNode(nodeData)
+      }.bind(this))
+    }
+
+    // this.config.miniEditorSession.transaction(function (tx) {
+    //   let nodeData = this.createNodeData(tx, note)
+    //   tx.insertBlockNode(nodeData)
+    // }.bind(this))
+    // console.log('config after', this.config)
+    // let selection = this.config.miniEditorSession.getSelection()
+    // console.log('selection', selection)
+    // this.config.miniEditorSession.setSelection({
+    //   type: 'node',
+    //   nodeId: selection.nodeId,
+    //   containerId: selection.containerId,
+    //   surfaceId: selection.surfaceId
+    // })
+    // let node = this.config.miniEditorContext.doc.get(selection.getNodeId())
+    // rootEl = this.config.miniEditorContext.domSelection.editor.el
+    // let comp = Component.unwrap(rootEl.find('*[data-id="'+selection.getNodeId()+'"]'))
+    // comp.el.focus()
+    // this.config.miniEditorContext.editor.rerender()
+    // console.log('node', node)
+    // console.log('comp', comp)
+
+  }
+
+  getSelection () {
+    const surface = this.getSurface()
+    return surface.domSelection.getSelection()
+  }
+
+  getSurface () {
+    const surface = this.config.miniEditorSession.getFocusedSurface()
+    console.log('f_surface', surface)
+
+    return surface
   }
 
 }
-- 
GitLab