-
chris authored63da9e76
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Forked from
Coko Org / Products / ketty / editoria-app
383 commits behind the upstream repository.
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