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