diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 81f52bc..471b770 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -1,198 +1,203 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); -var request = require("superagent"); - -var Nav = require('naturalcrit/nav/nav.jsx'); -var Navbar = require('../../navbar/navbar.jsx'); - -var EditTitle = require('../../navbar/editTitle.navitem.jsx'); -var ReportIssue = require('../../navbar/issue.navitem.jsx'); -var PrintLink = require('../../navbar/print.navitem.jsx'); - - -var SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -var Editor = require('../../editor/editor.jsx'); -var BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - - - -const SAVE_TIMEOUT = 3000; - - - -var EditPage = React.createClass({ - getDefaultProps: function() { - return { - id : null, - brew : { - title : '', - text : '', - shareId : null, - editId : null, - createdAt : null, - updatedAt : null, - } - }; - }, - - getInitialState: function() { - return { - title : this.props.brew.title, - text: this.props.brew.text, - isSaving : false, - isPending : false, - errors : null, - lastUpdated : this.props.brew.updatedAt - }; - }, - savedBrew : null, - - componentDidMount: function(){ - this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); - window.onbeforeunload = ()=>{ - if(this.state.isSaving || this.state.isPending){ - return 'You have unsaved changes!'; - } - } - }, - componentWillUnmount: function() { - window.onbeforeunload = function(){}; - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleTitleChange : function(title){ - this.setState({ - title : title, - isPending : true - }); - - (this.hasChanges() ? this.debounceSave() : this.debounceSave.cancel()); - }, - - handleTextChange : function(text){ - this.setState({ - text : text, - isPending : true - }); - - (this.hasChanges() ? this.debounceSave() : this.debounceSave.cancel()); - }, - - handleDelete : function(){ - if(!confirm("are you sure you want to delete this brew?")) return; - if(!confirm("are you REALLY sure? You will not be able to recover it")) return; - - request.get('/homebrew/api/remove/' + this.props.brew.editId) - .send() - .end(function(err, res){ - window.location.href = '/homebrew'; - }); - }, - - hasChanges : function(){ - if(this.savedBrew){ - if(this.state.text !== this.savedBrew.text) return true; - if(this.state.title !== this.savedBrew.title) return true; - }else{ - if(this.state.text !== this.props.brew.text) return true; - if(this.state.title !== this.props.brew.title) return true; - } - return false; - }, - - save : function(){ - this.debounceSave.cancel(); - this.setState({ - isSaving : true, - errors : null - }); - - request - .put('/homebrew/api/update/' + this.props.brew.editId) - .send({ - text : this.state.text, - title : this.state.title - }) - .end((err, res) => { - if(err){ - this.setState({ - errors : err, - }) - }else{ - this.savedBrew = res.body; - this.setState({ - isPending : false, - isSaving : false, - lastUpdated : res.body.updatedAt - }) - } - }) - }, - - renderSaveButton : function(){ - if(this.state.errors){ - var errMsg = ''; - try{ - errMsg += this.state.errors.toString() + '\n\n'; - errMsg += '```\n' + JSON.stringify(this.state.errors.response.error, null, ' ') + '\n```'; - }catch(e){} - - - return - Oops! -
- Looks like there was a problem saving.
- Report the issue - here - . -
-
- } - - if(this.state.isSaving){ - return saving... - } - if(!this.state.isPending && !this.state.isSaving){ - return saved. - } - if(this.state.isPending && this.hasChanges()){ - return Save Now - } - }, - renderNavbar : function(){ - return - - - - - {this.renderSaveButton()} - - Share - - - - Delete - - - - }, - - render : function(){ - return
- {this.renderNavbar()} - -
- - - - -
-
- } -}); - -module.exports = EditPage; +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); +var request = require("superagent"); + +var Nav = require('naturalcrit/nav/nav.jsx'); +var Navbar = require('../../navbar/navbar.jsx'); + +var EditTitle = require('../../navbar/editTitle.navitem.jsx'); +var ReportIssue = require('../../navbar/issue.navitem.jsx'); +var PrintLink = require('../../navbar/print.navitem.jsx'); + + +var SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +var Editor = require('../../editor/editor.jsx'); +var BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); + +var HijackPrint = require('../hijackPrint.js'); + + + +const SAVE_TIMEOUT = 3000; + + + +var EditPage = React.createClass({ + getDefaultProps: function() { + return { + id : null, + brew : { + title : '', + text : '', + shareId : null, + editId : null, + createdAt : null, + updatedAt : null, + } + }; + }, + + getInitialState: function() { + return { + title : this.props.brew.title, + text: this.props.brew.text, + isSaving : false, + isPending : false, + errors : null, + lastUpdated : this.props.brew.updatedAt + }; + }, + savedBrew : null, + + componentDidMount: function(){ + this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); + window.onbeforeunload = ()=>{ + if(this.state.isSaving || this.state.isPending){ + return 'You have unsaved changes!'; + } + }; + + document.onkeydown = HijackPrint(this.props.brew.shareId); + }, + componentWillUnmount: function() { + window.onbeforeunload = function(){}; + document.onkeydown = function(){}; + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleTitleChange : function(title){ + this.setState({ + title : title, + isPending : true + }); + + (this.hasChanges() ? this.debounceSave() : this.debounceSave.cancel()); + }, + + handleTextChange : function(text){ + this.setState({ + text : text, + isPending : true + }); + + (this.hasChanges() ? this.debounceSave() : this.debounceSave.cancel()); + }, + + handleDelete : function(){ + if(!confirm("are you sure you want to delete this brew?")) return; + if(!confirm("are you REALLY sure? You will not be able to recover it")) return; + + request.get('/homebrew/api/remove/' + this.props.brew.editId) + .send() + .end(function(err, res){ + window.location.href = '/homebrew'; + }); + }, + + hasChanges : function(){ + if(this.savedBrew){ + if(this.state.text !== this.savedBrew.text) return true; + if(this.state.title !== this.savedBrew.title) return true; + }else{ + if(this.state.text !== this.props.brew.text) return true; + if(this.state.title !== this.props.brew.title) return true; + } + return false; + }, + + save : function(){ + this.debounceSave.cancel(); + this.setState({ + isSaving : true, + errors : null + }); + + request + .put('/homebrew/api/update/' + this.props.brew.editId) + .send({ + text : this.state.text, + title : this.state.title + }) + .end((err, res) => { + if(err){ + this.setState({ + errors : err, + }) + }else{ + this.savedBrew = res.body; + this.setState({ + isPending : false, + isSaving : false, + lastUpdated : res.body.updatedAt + }) + } + }) + }, + + renderSaveButton : function(){ + if(this.state.errors){ + var errMsg = ''; + try{ + errMsg += this.state.errors.toString() + '\n\n'; + errMsg += '```\n' + JSON.stringify(this.state.errors.response.error, null, ' ') + '\n```'; + }catch(e){} + + + return + Oops! +
+ Looks like there was a problem saving.
+ Report the issue + here + . +
+
+ } + + if(this.state.isSaving){ + return saving... + } + if(!this.state.isPending && !this.state.isSaving){ + return saved. + } + if(this.state.isPending && this.hasChanges()){ + return Save Now + } + }, + renderNavbar : function(){ + return + + + + + {this.renderSaveButton()} + + Share + + + + Delete + + + + }, + + render : function(){ + return
+ {this.renderNavbar()} + +
+ + + + +
+
+ } +}); + +module.exports = EditPage; diff --git a/client/homebrew/pages/hijackPrint.js b/client/homebrew/pages/hijackPrint.js new file mode 100644 index 0000000..8e1541a --- /dev/null +++ b/client/homebrew/pages/hijackPrint.js @@ -0,0 +1,10 @@ +module.exports = function(shareId){ + return function(event){ + event = event || window.event; + if(event.ctrlKey && event.keyCode == 80){ + var win = window.open(`/homebrew/print/${shareId}?dialog=true`, '_blank'); + win.focus(); + event.preventDefault(); + } + }; +}; \ No newline at end of file diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 7252c52..a405f74 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -1,48 +1,57 @@ -var React = require('react'); -var _ = require('lodash'); -var cx = require('classnames'); - -var Nav = require('naturalcrit/nav/nav.jsx'); -var Navbar = require('../../navbar/navbar.jsx'); - -var PrintLink = require('../../navbar/print.navitem.jsx'); - -var BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - -var SharePage = React.createClass({ - getDefaultProps: function() { - return { - brew : { - title : '', - text : '', - shareId : null, - createdAt : null, - updatedAt : null, - views : 0 - } - }; - }, - - render : function(){ - return
- - - {this.props.brew.title} - - - - - - source - - - - -
- -
-
- } -}); - -module.exports = SharePage; +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var Nav = require('naturalcrit/nav/nav.jsx'); +var Navbar = require('../../navbar/navbar.jsx'); + +var PrintLink = require('../../navbar/print.navitem.jsx'); + +var BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); + +var HijackPrint = require('../hijackPrint.js'); + +var SharePage = React.createClass({ + getDefaultProps: function() { + return { + brew : { + title : '', + text : '', + shareId : null, + createdAt : null, + updatedAt : null, + views : 0 + } + }; + }, + + componentDidMount: function() { + document.onkeydown = HijackPrint(this.props.brew.shareId); + }, + componentWillUnmount: function() { + document.onkeydown = function(){}; + }, + + render : function(){ + return
+ + + {this.props.brew.title} + + + + + + source + + + + +
+ +
+
+ } +}); + +module.exports = SharePage;