Newer
Older
import {
ProseEditor,
Toolbar
} from 'substance'
import ContainerEditor from '../ContainerEditor'
import Comments from '../panes/Comments/CommentBoxList'
import CommentsProvider from '../panes/Comments/CommentsProvider'
import TrackChangesProvider from '../elements/track_change/TrackChangesProvider'
didMount () {
const provider = this.getProvider()
provider.config.notesEditorContext = this.getChildContext()
this.editorSession.onUpdate('document', this.findNote, this)
this.on('noteSelected', this.scrollTo, this)
this.on('notes:inserted', this.createNote, this)
this.on('notes:deleted', this.removeNote, this)
}
const el = $$('div').addClass('sc-notes-editor')
let toolbar = this._renderNotesToolbar($$)
let editor = this._renderEditor($$)
let SplitPane = this.componentRegistry.get('split-pane')
let ScrollPane = this.componentRegistry.get('scroll-pane')
let Overlay = this.componentRegistry.get('overlay')
var commentsPane = $$(Comments, {
fragment: this.props.fragment,
update: this.props.update,
user: this.props.user
}).addClass('sc-comments-pane')
const editorWithComments = $$(SplitPane, { sizeA: '100%', splitType: 'vertical' })
.append(
editor,
commentsPane
)
const contentPanel = $$(ScrollPane, {
scrollbarPosition: 'right'
})
.append(editorWithComments, $$(Overlay))
.attr('id', 'notes-editor-content-panel')
.ref('notesEditorContentPanel')
el.append(
$$(SplitPane, { splitType: 'horizontal' })
.append(toolbar, contentPanel)
)
return el
}
let commandStates = this.commandManager.getCommandStates()
return $$('div').addClass('se-toolbar-wrapper').append(
$$(Toolbar, {
commandStates: commandStates,
)
}
_renderEditor ($$) {
return $$(ContainerEditor, {
containerId: this.props.containerId,
editorSession: this.editorSession,
disabled: this.props.disabled,
trackChanges: this.props.trackChanges,
user: this.props.user
scrollTo (nodeId) {
const nodes = this.getIsolatedNodes()
const note = _.find(nodes, function (c) {
return c.parentNoteId === nodeId
})
this.refs.notesEditorContentPanel.scrollTo(note.id)
}
return {
'type': 'isolated-note',
const provider = this.getProvider()
const notes = provider.computeEntries()
const surface = this.getSurface()
const container = surface.getContainer()
let note = _.find(notes, function (c) {
return c.id === noteId
})
let findIndex = _.findIndex(notes, ['id', note.id])
let nodeData = this.createNodeData(note)
this.editorSession.transaction(function (tx) {
let blockNode = tx.create(nodeData)
tx.update(path, { type: 'insert', pos: findIndex, value: blockNode.id })
})
const existingNodes = this.getIsolatedNodes()
let isolatedNote = _.find(existingNodes, function (c) {
return c.parentNoteId === noteId
})
this.saveNote(isolatedNote)
removeNote (noteId) {
const existingNodes = this.getIsolatedNodes()
const surface = this.getSurface()
const container = surface.getContainer()
let note = _.find(existingNodes, function (c) {
return c.parentNoteId === noteId
})
// if Isolated note is focused cannot be deleted. Remove focus
// before deleting callout
this.editorSession.setSelection(null)
// Delete comments from the isolated note before
// removing the note
this.removeCommentsFirst(note.id)
let findIndex = _.findIndex(existingNodes, ['parentNoteId', noteId])
this.editorSession.transaction(function (tx) {
saveNote (isolatedNote) {
// If isloated note has no content and you keep pressing backspace,
// it gets deleted. Set selection to null to prevent that
if (selection.start && selection.start.offset === 0 && selection.end.offset === 0) {
const exporter = new SimpleExporter(this.props.configurator.config)
const convertedNode = exporter.convertNode(isolatedNote)
this.context.editorSession.transaction(function (tx, args) {
const path = [isolatedNote.parentNoteId, 'note-content']
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
tx.set(path, convertedNode.outerHTML)
})
}
findNote () {
const selection = this.editorSession.getSelection()
if (!selection.end) return
const isolatedNoteId = selection.end.path[0]
const isolatedNote = this.editorSession.document.get(isolatedNoteId)
return this.saveNote(isolatedNote)
}
getIsolatedNodes () {
const doc = this.editorSession.document
const nodes = doc.getNodes()
const entries = _.pickBy(nodes, function (value, key) {
return value.type === 'isolated-note'
})
return _.values(entries)
}
removeCommentsFirst (noteId) {
const doc = this.editorSession.document
const nodes = doc.getNodes()
const entries = _.pickBy(nodes, function (value, key) {
return value.type === 'comment'
if (!entries) return
_.forEach(entries, function (node, key) {
if (node.path[0] === noteId) {
this.editorSession.transaction(function (tx) {
tx.delete(node.id)
})
}
}.bind(this))
getProvider () {
return this.context.notesProvider
}
getSurface () {
const containerId = this.props.containerId
const provider = this.getProvider()
return provider.config.notesEditorContext.surfaceManager.getSurface(containerId)
getChildContext () {
const oldContext = super.getChildContext()
const doc = this.doc
// comments provider
const commentsProvider = new CommentsProvider(doc, {
commandManager: this.commandManager,
containerId: this.props.containerId,
controller: this,
editorSession: this.editorSession,
fragment: this.props.fragment,
surfaceManager: this.surfaceManager,
update: this.props.update
})
const trackChangesProvider = new TrackChangesProvider(doc, {
commandManager: this.commandManager,
containerId: this.props.containerId,
controller: this,
editorSession: this.editorSession,
surfaceManager: this.surfaceManager,
user: this.props.user
})
// attach all to context
return {
...oldContext,
commentsProvider,
trackChangesProvider
}
}