Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Notes.js 4.29 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 {isEmpty, find} from 'lodash'

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

    this.resize = this.resize.bind(this)
    this.stopResize = this.stopResize.bind(this)
  }

  didMount () {
    this.context.editorSession.onUpdate('document', this.onNotesUpdated, this)
  }

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

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

    const miniEditorProps = this.getParentProps()

    el.append($$(MiniEditor, {
      book: miniEditorProps.book,
      editorSession: miniSessionConf.editorSession,
      comments: miniEditorProps.comments,
      configurator: miniSessionConf.configurator,
      containerId: 'mini',
      history: miniEditorProps.history,
      disabled: miniEditorProps.disabled,
      fragment: miniEditorProps.fragment,
      trackChanges: miniEditorProps.trackChanges,
      update: miniEditorProps.update,
      user: miniEditorProps.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.length; i++) {
      noteContent += notes[i]['note-content']
    }

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

  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'
    const mainScrollPane = document.getElementById('content-panel').children
    mainScrollPane[0].style.maxHeight = this.el.el.offsetTop - 140 + 'px'
    this.el.el.style.height = height + 'px'
  }

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

  onNotesUpdated (change) {
    const notesProvider = this.getProvider()
    notesProvider.handleDocumentChange(change)
    const miniEditor = this.getMiniEditor()

    const NoteCreated = find(change.created, function (value, key) {
      return value.type === 'note'
    })

    const NoteDeleted = find(change.deleted, function (value, key) {
      return value.type === 'note'
    })

    if (!isEmpty(NoteCreated)) {
      miniEditor.emit('notes:inserted', NoteCreated.id)
      return false
    }

    if (!isEmpty(NoteDeleted)) {
      miniEditor.emit('notes:deleted', NoteDeleted.id)
      return false
    }
  }

  getParentProps () {
    return {
      comments: this.context.commentsProvider.config.comments,
      disabled: this.context.editor.props.disabled,
      book: this.context.editor.props.book,
      fragment: this.context.editor.props.fragment,
      history: this.context.editor.props.history,
      trackChanges: this.context.editor.props.trackChanges,
      update: this.context.editor.props.update,
      user: this.context.editor.props.user
    }
  }

  getProvider () {
    return this.context.notesProvider
  }

  getSurface () {
    const provider = this.getProvider()
    return provider.config.miniEditorContext.surfaceManager.getSurface('mini')
  }
  getMiniEditor () {
    const provider = this.getProvider()
    return provider.config.miniEditorContext.editor
  }

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

export default Notes