Skip to content
Snippets Groups Projects
  • chris's avatar
    fixes · 63da9e76
    chris authored
    63da9e76
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Notes.js 3.91 KiB
import { Component, EditorSession,
  ProseEditorConfigurator as Configurator } from 'substance'
import MiniEditor from '../../miniEditor/miniEditor'
import config from '../../miniEditor/config'
import Importer from '../../miniEditor/MiniEditorImporter'
import {forEach} from 'lodash'

class Notes extends Component {
  constructor (props) {
    super(props)

    this.resize = this.resize.bind(this)
    this.stopResize = this.stopResize.bind(this)
    this.saveNotes = this.saveNotes.bind(this)
  }
  // use toc:updated to avoid rewriting TOCProvider's this.handleDocumentChange
  didMount () {
    const provider = this.getProvider()
    this.context.editorSession.onUpdate('document', this.onNotesUpdated, this)
    provider.config.miniEditorSession.onUpdate('', this.saveNotes, this)
  }

  initResize (e) {
    window.addEventListener('mousemove', this.resize, false)
    window.addEventListener('mouseup', this.stopResize, false)
  }

  resize (e) {
    const height = (this.el.el.offsetHeight + this.el.el.offsetTop - e.clientY)
    const scrollPane = document.getElementById('mini-editor-content-panel').children
    scrollPane[0].style.minHeight = height - 40 + 'px'
    this.el.el.style.height = height + 'px'
  }

  stopResize (e) {
    window.removeEventListener('mousemove', this.resize, false)
    window.removeEventListener('mouseup', this.stopResize, false)
  }

  render ($$) {
    const miniEditorSession = this._initMiniEditor()
    const resizer = $$('div').addClass('resize-area')

    const el = $$('div')
         .addClass('notes-container').append(resizer)

    const comments = this.getComments()
    const fragment = this.getFragment()
    const user = this.getUser()
    const update = this.getUpdate()
    const trackChanges = this.trackChanges()

    el.append($$(MiniEditor, {
      comments: comments,
      containerId: 'mini',
      editorSession: miniEditorSession,
      fragment: fragment,
      trackChanges: trackChanges,
      update: update,
      user: user
    }))

    resizer.addEventListener('mousedown', this.initResize, false)

    return el
  }

  _initMiniEditor () {
    const configurator = new Configurator().import(config)
    configurator.addImporter('html', Importer)

    const importer = configurator.createImporter('html')

    const provider = this.getProvider()

    const notes = provider.computeEntries()
    let noteContent = ''

    for (var i = 0; i < notes.main.length; i++) {
      noteContent += notes.main[i]['note-content']
    }

    const doc = importer.importDocument(noteContent)

    const editorSession = new EditorSession(doc, {
      configurator: configurator
    })
    editorSession.setSaveHandler({
      saveDocument: this.saveNotes
    })
    return editorSession
  }

  saveNotes (source) {
    const provider = this.getProvider()
    const notes = provider.computeEntries()
    let self = this

    forEach(notes.main, function (mainNote) {
      forEach(notes.mini, function (miniNote) {
        if (miniNote.parentNoteId === mainNote.id) {
          self.context.editorSession.transaction(function (tx, args) {
            const path = [mainNote.id, 'note-content']
            tx.set(path, miniNote.content)
          })
        }
      })
    })
    return new Promise(function (resolve, reject) {
      resolve()
    })
  }
  getProvider () {
    return this.context.notesProvider
  }

  getComments () {
    return this.context.commentsProvider.config.comments
  }

  getUser () {
    return this.context.editor.props.user
  }

  getFragment () {
    return this.context.editor.props.fragment
  }

  getUpdate () {
    return this.context.editor.props.update
  }

  trackChanges () {
    return this.context.editor.props.trackChanges
  }

  onNotesUpdated (change) {
    const notesProvider = this.getProvider()
    notesProvider.handleDocumentChange(change)
    // this.el.el.style.height = '95px'
  }

  dispose () {
    const provider = this.getProvider()
    provider.off(this)
  }
}

export default Notes