Skip to content
Snippets Groups Projects
Commit 831268a7 authored by chris's avatar chris Committed by Yannis Barlas
Browse files

modal warning when you have unsaved changes

parent 6839b987
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,11 @@ import { ...@@ -8,6 +8,11 @@ import {
} from 'substance' } from 'substance'
class ContainerEditor extends SubstanceContainerEditor { class ContainerEditor extends SubstanceContainerEditor {
constructor (...args) {
super(...args)
this.disableBackButton = this.disableBackButton.bind(this)
}
render ($$) { render ($$) {
let el = super.render($$) let el = super.render($$)
el.addClass('my-custom-class') el.addClass('my-custom-class')
...@@ -36,6 +41,33 @@ class ContainerEditor extends SubstanceContainerEditor { ...@@ -36,6 +41,33 @@ class ContainerEditor extends SubstanceContainerEditor {
this.addTargetToLinks() this.addTargetToLinks()
} }
this.props.history.listenBefore((location, callback) => {
const commandStates = this.getCommandStates()
if (commandStates['save'].disabled === false) {
this._owner.send('ChangesNotSaved')
this._owner.emit('send:route', location.pathname)
return callback(false)
} else {
return callback()
}
})
window.history.pushState(null, null, document.URL)
window.addEventListener('popstate', this.disableBackButton)
}
disableBackButton () {
const url = '/books/' + this.props.book.id + '/book-builder'
const commandStates = this.getCommandStates()
window.removeEventListener('popstate', this.disableBackButton)
if (commandStates['save'].disabled === false) {
window.history.pushState(null, null, document.URL)
this._owner.send('ChangesNotSaved')
this._owner.emit('send:route', url)
} else {
this.props.history.push(url)
}
return
} }
onTextInput (event) { onTextInput (event) {
......
...@@ -13,6 +13,7 @@ import Notes from './panes/Notes/Notes' ...@@ -13,6 +13,7 @@ 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' import TrackChangesProvider from './elements/track_change/TrackChangesProvider'
import ModalWarning from './elements/modal_warning/ModalWarning'
class Editor extends ProseEditor { class Editor extends ProseEditor {
constructor (parent, props) { constructor (parent, props) {
...@@ -22,10 +23,15 @@ class Editor extends ProseEditor { ...@@ -22,10 +23,15 @@ class Editor extends ProseEditor {
'showComments': function () { this.toggleCommentsArea(true) }, 'showComments': function () { this.toggleCommentsArea(true) },
'hideComments': function () { this.toggleCommentsArea(false) }, 'hideComments': function () { this.toggleCommentsArea(false) },
'trackChangesUpdate': function () { this.updateTrackChange() }, 'trackChangesUpdate': function () { this.updateTrackChange() },
'trackChangesViewToggle': function () { this.trackChangesViewToggle() } 'trackChangesViewToggle': function () { this.trackChangesViewToggle() },
'ChangesNotSaved': function () { this.ChangesNotSaved() }
}) })
} }
ChangesNotSaved () {
this.extendState({ changesNotSaved: true })
}
trackChangesViewToggle () { trackChangesViewToggle () {
this.extendState({ this.extendState({
trackChangesView: !this.state.trackChangesView trackChangesView: !this.state.trackChangesView
...@@ -124,7 +130,16 @@ class Editor extends ProseEditor { ...@@ -124,7 +130,16 @@ class Editor extends ProseEditor {
el.addClass('track-changes-mode') el.addClass('track-changes-mode')
} }
return el const modal = $$(ModalWarning, {
width: 'medium',
textAlign: 'center'
})
if (this.state.changesNotSaved) {
return el.append(modal)
} else {
return el
}
} }
// TODO -- use this to insert read-only mode alert // TODO -- use this to insert read-only mode alert
...@@ -151,14 +166,17 @@ class Editor extends ProseEditor { ...@@ -151,14 +166,17 @@ class Editor extends ProseEditor {
spellcheck: 'native', spellcheck: 'native',
textTypes: configurator.getTextTypes(), textTypes: configurator.getTextTypes(),
trackChanges: this.props.trackChanges, trackChanges: this.props.trackChanges,
updateTrackChangesStatus: this.props.updateTrackChangesStatus updateTrackChangesStatus: this.props.updateTrackChangesStatus,
history: this.props.history,
book: this.props.book
}).ref('body') }).ref('body')
} }
getInitialState () { getInitialState () {
return { return {
editorReady: false, editorReady: false,
trackChangesView: true trackChangesView: true,
changesNotSaved: false
} }
} }
......
...@@ -141,7 +141,7 @@ export default class SimpleEditor extends React.Component { ...@@ -141,7 +141,7 @@ export default class SimpleEditor extends React.Component {
componentDidMount () { componentDidMount () {
const el = ReactDOM.findDOMNode(this) const el = ReactDOM.findDOMNode(this)
const { book, fileUpload, fragment, history, onSave, update, user } = this.props const { book, fragment, history, onSave, update, user } = this.props
const { configurator, editorSession } = this.createSession() const { configurator, editorSession } = this.createSession()
if (!fragment) return if (!fragment) return
...@@ -178,6 +178,7 @@ export default class SimpleEditor extends React.Component { ...@@ -178,6 +178,7 @@ export default class SimpleEditor extends React.Component {
} }
componentWillUnmount () { componentWillUnmount () {
console.log('will unmount')
this._releaseLock() this._releaseLock()
window.removeEventListener('beforeunload', this._releaseLock) window.removeEventListener('beforeunload', this._releaseLock)
} }
......
...@@ -10,3 +10,4 @@ ...@@ -10,3 +10,4 @@
@import './track_change/trackChange'; @import './track_change/trackChange';
@import './images/image'; @import './images/image';
@import './modal_warning/modalWarning';
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