Skip to content
Snippets Groups Projects
Commit e500027a authored by Yannis Barlas's avatar Yannis Barlas
Browse files

basic first creation of track change on addition on text type

parent a8b4cc66
No related branches found
No related tags found
No related merge requests found
import { each, keys, includes } from 'lodash' import { each, keys, includes } from 'lodash'
import { import {
ContainerEditor as SubstanceContainerEditor, ContainerEditor as SubstanceContainerEditor,
// createAnnotation,
Surface, Surface,
uuid, createAnnotation uuid
} from 'substance' } from 'substance'
class ContainerEditor extends SubstanceContainerEditor { class ContainerEditor extends SubstanceContainerEditor {
...@@ -45,37 +46,27 @@ class ContainerEditor extends SubstanceContainerEditor { ...@@ -45,37 +46,27 @@ class ContainerEditor extends SubstanceContainerEditor {
// documentSession.on('didUpdate', this.disableToolbar, this) // documentSession.on('didUpdate', this.disableToolbar, this)
// } // }
// Start return el
}
onTextInput (event) {
event.preventDefault()
event.stopPropagation()
if (!event.data) return
this._state.skipNextObservation = true
this.transaction(function (tx, args) {
if (this.domSelection) this.domSelection.clear()
args.text = event.data
return this.insertText(tx, args)
}.bind(this), { action: 'type' })
// don't rewrite the above, call it with super
if (this.props.trackChanges) { if (this.props.trackChanges) {
el.addEventListener('keydown', function (e) { const trackChangesProvider = this.context.trackChangesProvider
const surface = this.context.surfaceManager.getSurface('body') trackChangesProvider.handleTransaction()
const session = this.context.documentSession
const sel = session.getSelection()
const path = sel.path
const startOffset = sel.startOffset - 1
const endOffset = sel.endOffset + 1
const createAnno = session.createSelection(path, startOffset, endOffset)
const newNode = {
selection: createAnno,
node: { type: 'track-change' }
}
surface.transaction((tx, args) => {
createAnnotation(tx, newNode)
})
if (e.keyCode === 8) {
console.log('newNode', newNode)
let elem = document.querySelectorAll('[data-id=' + newNode.node.id + ']')
elem[0].style.backgroundColor = 'transparent'
elem[0].style.textDecoration = 'line-through'
}
})
} }
// END
return el
} }
didMount () { didMount () {
...@@ -85,6 +76,7 @@ class ContainerEditor extends SubstanceContainerEditor { ...@@ -85,6 +76,7 @@ class ContainerEditor extends SubstanceContainerEditor {
this.container.on('nodes:changed', this.onContainerChange, this) this.container.on('nodes:changed', this.onContainerChange, this)
if (this.isEmpty()) this.createText() if (this.isEmpty()) this.createText()
if (this.isReadOnlyMode()) { if (this.isReadOnlyMode()) {
const documentSession = this.getDocumentSession() const documentSession = this.getDocumentSession()
documentSession.on('didUpdate', this.disableToolbar, this) documentSession.on('didUpdate', this.disableToolbar, this)
......
...@@ -13,6 +13,7 @@ import ContainerEditor from './ContainerEditor' ...@@ -13,6 +13,7 @@ import ContainerEditor from './ContainerEditor'
import Notes from './panes/Notes/Notes' import Notes from './panes/Notes/Notes'
import NotesProvider from './panes/Notes/NotesProvider' import NotesProvider from './panes/Notes/NotesProvider'
import TableOfContents from './panes/TableOfContents/TableOfContents' import TableOfContents from './panes/TableOfContents/TableOfContents'
import TrackChangesProvider from './elements/track_change/TrackChangesProvider'
class Editor extends ProseEditor { class Editor extends ProseEditor {
constructor (parent, props) { constructor (parent, props) {
...@@ -155,12 +156,22 @@ class Editor extends ProseEditor { ...@@ -155,12 +156,22 @@ class Editor extends ProseEditor {
updateComments: this.props.updateComments updateComments: this.props.updateComments
}) })
// TODO -- do I need all of these?
// track changes provider
const trackChangesProvider = new TrackChangesProvider({
commandManager: this.commandManager,
containerId: this.props.containerId,
documentSession: this.documentSession,
surfaceManager: this.surfaceManager
})
// attach all to context // attach all to context
return { return {
...oldContext, ...oldContext,
tocProvider, tocProvider,
notesProvider, notesProvider,
commentsProvider commentsProvider,
trackChangesProvider
} }
} }
} }
......
...@@ -113,6 +113,7 @@ class CommentBubble extends Tool { ...@@ -113,6 +113,7 @@ class CommentBubble extends Tool {
return surfaceManager.getFocusedSurface() return surfaceManager.getFocusedSurface()
} }
// TODO -- move to provider?
createComment () { createComment () {
const mode = this.getMode() const mode = this.getMode()
const provider = this.getProvider() const provider = this.getProvider()
......
import TrackChange from './TrackChange' import TrackChange from './TrackChange'
import TrackChangeCommand from './TrackChangeCommand' import TrackChangeCommand from './TrackChangeCommand'
import TrackChangeComponent from './TrackChangeComponent' import TrackChangeComponent from './TrackChangeComponent'
import TrackChangeHTMLConverter from './TrackChangeHTMLConverter' // import TrackChangeHTMLConverter from './TrackChangeHTMLConverter'
// import { AnnotationTool } from 'substance'
export default { export default {
name: 'track-change', name: 'track-change',
configure: function (config) { configure: function (config) {
config.addNode(TrackChange) config.addNode(TrackChange)
config.addComponent(TrackChange.type, TrackChangeComponent) config.addComponent(TrackChange.type, TrackChangeComponent)
config.addConverter('html', TrackChangeHTMLConverter) // config.addConverter('html', TrackChangeHTMLConverter)
// config.addTool('track-change', AnnotationTool, { target: 'insert' })
config.addCommand(TrackChange.type, TrackChangeCommand, { nodeType: TrackChange.type }) config.addCommand(TrackChange.type, TrackChangeCommand, { nodeType: TrackChange.type })
config.addIcon('track-change', { 'fontawesome': 'fa-eye' }) config.addIcon('track-change', { 'fontawesome': 'fa-eye' })
config.addLabel('track-change', { config.addLabel('track-change', {
en: 'track-change' en: 'Track Changes'
}) })
} }
} }
import { createAnnotation } from 'substance'
class TrackChangesProvider {
constructor (config) {
this.config = config
}
handleTransaction () {
const surface = this.getSurface()
surface.transaction((tx, args) => {
const selection = this.createSelection(args)
// console.log(this.getTrackState())
const newNode = {
selection: selection,
node: { 'type': 'track-change' }
}
const mode = this.getMode()
if (!mode) {
createAnnotation(tx, newNode)
} else if (mode === 'delete') {
// continue here to expand annotation
}
this.clearSelection(args)
this.removeAnnotationFromHistory()
})
}
removeAnnotationFromHistory () {
const documentSession = this.getDocumentSession()
setTimeout(() => {
documentSession.doneChanges.pop()
}) // ensure that text insertion has finished
}
clearSelection (args) {
const selection = args.selection
selection.startOffset = selection.endOffset
return selection
}
createSelection (args) {
const selection = args.selection
selection.startOffset -= 1
return selection
}
getCommandManager () {
return this.config.commandManager
}
getTrackState () {
const commandManager = this.getCommandManager()
const commandStates = commandManager.getCommandStates()
return commandStates['track-change']
}
getMode () {
const state = this.getTrackState()
return state.mode
}
// createCommandState () {
// const commandState = this.getCommandState()
// commandState.disabled = false
// commandState.mode = 'create'
// return commandState
// }
getDocumentSession () {
return this.config.documentSession
}
getSurface () {
const surfaceManager = this.config.surfaceManager
const id = this.config.containerId
return surfaceManager.getSurface(id)
}
}
export default TrackChangesProvider
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment