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