From 32ef36d7f7fbab8be6982e90e5ac04d09bdc9fb0 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 15 Feb 2021 18:51:02 +1300 Subject: [PATCH 1/6] Initial commit: `Import from Share ID` appears to be functioning correctly. --- client/homebrew/homebrew.jsx | 2 + .../homebrew/pages/importPage/importPage.jsx | 207 ++++++++++++++++++ .../homebrew/pages/importPage/importPage.less | 10 + server.js | 28 +++ 4 files changed, 247 insertions(+) create mode 100644 client/homebrew/pages/importPage/importPage.jsx create mode 100644 client/homebrew/pages/importPage/importPage.less diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 640a73f77..d8707c72d 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -9,6 +9,7 @@ const EditPage = require('./pages/editPage/editPage.jsx'); const UserPage = require('./pages/userPage/userPage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx'); +const ImportPage = require('./pages/importPage/importPage.jsx'); //const ErrorPage = require('./pages/errorPage/errorPage.jsx'); const PrintPage = require('./pages/printPage/printPage.jsx'); @@ -44,6 +45,7 @@ const Homebrew = createClass({ }/> }/> + }/> }/> } /> } /> diff --git a/client/homebrew/pages/importPage/importPage.jsx b/client/homebrew/pages/importPage/importPage.jsx new file mode 100644 index 000000000..56a116949 --- /dev/null +++ b/client/homebrew/pages/importPage/importPage.jsx @@ -0,0 +1,207 @@ +require('./importPage.less'); +const React = require('react'); +const createClass = require('create-react-class'); +const _ = require('lodash'); +const request = require('superagent'); + +const Markdown = require('naturalcrit/markdown.js'); + +const Nav = require('naturalcrit/nav/nav.jsx'); +const Navbar = require('../../navbar/navbar.jsx'); +const AccountNavItem = require('../../navbar/account.navitem.jsx'); +const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; +const IssueNavItem = require('../../navbar/issue.navitem.jsx'); + +const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); +const Editor = require('../../editor/editor.jsx'); +const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); + + +const KEY = 'homebrewery-new'; + +const ImportPage = createClass({ + getDefaultProps : function() { + return { + brew : { + text : '', + shareId : null, + editId : null, + createdAt : null, + updatedAt : null, + gDrive : false, + + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [] + } + }; + }, + + getInitialState : function() { + return { + metadata : { + gDrive : false, + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [] + }, + + text : this.props.brew.text, + isSaving : false, + saveGoogle : (global.account && global.account.googleId ? true : false), + errors : [] + }; + }, + + componentDidMount : function() { + const storage = localStorage.getItem(KEY); + if(storage){ + this.setState({ + text : storage + }); + } + document.addEventListener('keydown', this.handleControlKeys); + }, + componentWillUnmount : function() { + document.removeEventListener('keydown', this.handleControlKeys); + }, + + handleControlKeys : function(e){ + if(!(e.ctrlKey || e.metaKey)) return; + const S_KEY = 83; + const P_KEY = 80; + if(e.keyCode == S_KEY) this.save(); + if(e.keyCode == P_KEY) this.print(); + if(e.keyCode == P_KEY || e.keyCode == S_KEY){ + e.stopPropagation(); + e.preventDefault(); + } + }, + + handleSplitMove : function(){ + this.refs.editor.update(); + }, + + handleMetadataChange : function(metadata){ + this.setState({ + metadata : _.merge({}, this.state.metadata, metadata) + }); + }, + + handleTextChange : function(text){ + this.setState({ + text : text, + errors : Markdown.validate(text) + }); + localStorage.setItem(KEY, text); + }, + + save : async function(){ + this.setState({ + isSaving : true + }); + + console.log('saving new brew'); + + if(this.state.saveGoogle) { + const res = await request + .post('/api/newGoogle/') + .send(_.merge({}, this.state.metadata, { text: this.state.text })) + .catch((err)=>{ + console.log(err.status === 401 + ? 'Not signed in!' + : 'Error Creating New Google Brew!'); + this.setState({ isSaving: false }); + return; + }); + + const brew = res.body; + localStorage.removeItem(KEY); + window.location = `/edit/${brew.googleId}${brew.editId}`; + } else { + request.post('/api') + .send(_.merge({}, this.state.metadata, { + text : this.state.text + })) + .end((err, res)=>{ + if(err){ + this.setState({ + isSaving : false + }); + return; + } + window.onbeforeunload = function(){}; + const brew = res.body; + localStorage.removeItem(KEY); + window.location = `/edit/${brew.editId}`; + }); + } + + }, + + renderSaveButton : function(){ + if(this.state.isSaving){ + return + save... + ; + } else { + return + save + ; + } + }, + + print : function(){ + localStorage.setItem('print', this.state.text); + window.open('/print?dialog=true&local=print', '_blank'); + }, + + renderLocalPrintButton : function(){ + return + get PDF + ; + }, + + renderNavbar : function(){ + return + + + {this.state.metadata.title} + + + + {this.renderSaveButton()} + {this.renderLocalPrintButton()} + + + + + ; + }, + + render : function(){ + return
+ {this.renderNavbar()} +
+ + + + +
+
; + } +}); + +module.exports = ImportPage; diff --git a/client/homebrew/pages/importPage/importPage.less b/client/homebrew/pages/importPage/importPage.less new file mode 100644 index 000000000..041508a61 --- /dev/null +++ b/client/homebrew/pages/importPage/importPage.less @@ -0,0 +1,10 @@ +.importPage{ + + .saveButton{ + background-color: @orange; + &:hover{ + background-color: @green; + } + } + +} \ No newline at end of file diff --git a/server.js b/server.js index c33a755aa..76fec7629 100644 --- a/server.js +++ b/server.js @@ -143,6 +143,34 @@ app.get('/edit/:id', (req, res, next)=>{ } }); +//Import Page +app.get('/import/:id', (req, res, next)=>{ + res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. + if(req.params.id.length > 12) { + const googleId = req.params.id.slice(0, -12); + const shareId = req.params.id.slice(-12); + GoogleActions.readFileMetadata(config.get('google_api_key'), googleId, shareId, 'share') + .then((brew)=>{ + req.brew = brew; //TODO Need to sanitize later + return next(); + }) + .catch((err)=>{ + console.log(err); + return res.status(400).send('Can\'t get brew from Google'); + }); + } else { + HomebrewModel.get({ shareId: req.params.id }) + .then((brew)=>{ + req.brew = brew; + return next(); + }) + .catch((err)=>{ + console.log(err); + return res.status(400).send(`Can't get that`); + }); + } +}); + //Share Page app.get('/share/:id', (req, res, next)=>{ if(req.params.id.length > 12) { From 41ecbb62a24eaa3c483c5855ff32efc5d6162541 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 27 Feb 2021 17:55:29 +1300 Subject: [PATCH 2/6] Redirect `new` to `import`. --- client/homebrew/homebrew.jsx | 4 ++-- server.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index d8707c72d..d7c963c1c 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -45,11 +45,11 @@ const Homebrew = createClass({ }/> }/> - }/> + }/> }/> } /> } /> - + // }/> }/> diff --git a/server.js b/server.js index 76fec7629..54e61d085 100644 --- a/server.js +++ b/server.js @@ -144,7 +144,7 @@ app.get('/edit/:id', (req, res, next)=>{ }); //Import Page -app.get('/import/:id', (req, res, next)=>{ +app.get('/new/:id', (req, res, next)=>{ res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. if(req.params.id.length > 12) { const googleId = req.params.id.slice(0, -12); From ed23578dcf818a93f6c6dd108c23e3aa3252ecbc Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 27 Feb 2021 18:07:28 +1300 Subject: [PATCH 3/6] Lint fixes. --- client/homebrew/pages/importPage/importPage.jsx | 2 +- server.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/importPage/importPage.jsx b/client/homebrew/pages/importPage/importPage.jsx index 56a116949..d64d63d8b 100644 --- a/client/homebrew/pages/importPage/importPage.jsx +++ b/client/homebrew/pages/importPage/importPage.jsx @@ -39,7 +39,7 @@ const ImportPage = createClass({ } }; }, - + getInitialState : function() { return { metadata : { diff --git a/server.js b/server.js index 54e61d085..440751903 100644 --- a/server.js +++ b/server.js @@ -1,3 +1,4 @@ +/*eslint max-lines: ["warn", {"max": 250, "skipBlankLines": true, "skipComments": true}]*/ const _ = require('lodash'); const jwt = require('jwt-simple'); const express = require('express'); From 2f9bd00d703dde7697e60ffffaa95de9e29019e1 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 2 Mar 2021 20:30:11 +1300 Subject: [PATCH 4/6] Merge `importPage` functions into `newPage`. --- client/homebrew/homebrew.jsx | 4 +- .../homebrew/pages/importPage/importPage.jsx | 207 ------------------ .../homebrew/pages/importPage/importPage.less | 10 - client/homebrew/pages/newPage/newPage.jsx | 22 +- server.js | 2 +- 5 files changed, 24 insertions(+), 221 deletions(-) delete mode 100644 client/homebrew/pages/importPage/importPage.jsx delete mode 100644 client/homebrew/pages/importPage/importPage.less diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index d7c963c1c..4fa170d7c 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -9,7 +9,7 @@ const EditPage = require('./pages/editPage/editPage.jsx'); const UserPage = require('./pages/userPage/userPage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx'); -const ImportPage = require('./pages/importPage/importPage.jsx'); +//const ImportPage = require('./pages/importPage/importPage.jsx'); //const ErrorPage = require('./pages/errorPage/errorPage.jsx'); const PrintPage = require('./pages/printPage/printPage.jsx'); @@ -45,7 +45,7 @@ const Homebrew = createClass({ }/> }/> - }/> + }/> }/> } /> } /> diff --git a/client/homebrew/pages/importPage/importPage.jsx b/client/homebrew/pages/importPage/importPage.jsx deleted file mode 100644 index d64d63d8b..000000000 --- a/client/homebrew/pages/importPage/importPage.jsx +++ /dev/null @@ -1,207 +0,0 @@ -require('./importPage.less'); -const React = require('react'); -const createClass = require('create-react-class'); -const _ = require('lodash'); -const request = require('superagent'); - -const Markdown = require('naturalcrit/markdown.js'); - -const Nav = require('naturalcrit/nav/nav.jsx'); -const Navbar = require('../../navbar/navbar.jsx'); -const AccountNavItem = require('../../navbar/account.navitem.jsx'); -const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; -const IssueNavItem = require('../../navbar/issue.navitem.jsx'); - -const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); -const Editor = require('../../editor/editor.jsx'); -const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - - -const KEY = 'homebrewery-new'; - -const ImportPage = createClass({ - getDefaultProps : function() { - return { - brew : { - text : '', - shareId : null, - editId : null, - createdAt : null, - updatedAt : null, - gDrive : false, - - title : '', - description : '', - tags : '', - published : false, - authors : [], - systems : [] - } - }; - }, - - getInitialState : function() { - return { - metadata : { - gDrive : false, - title : '', - description : '', - tags : '', - published : false, - authors : [], - systems : [] - }, - - text : this.props.brew.text, - isSaving : false, - saveGoogle : (global.account && global.account.googleId ? true : false), - errors : [] - }; - }, - - componentDidMount : function() { - const storage = localStorage.getItem(KEY); - if(storage){ - this.setState({ - text : storage - }); - } - document.addEventListener('keydown', this.handleControlKeys); - }, - componentWillUnmount : function() { - document.removeEventListener('keydown', this.handleControlKeys); - }, - - handleControlKeys : function(e){ - if(!(e.ctrlKey || e.metaKey)) return; - const S_KEY = 83; - const P_KEY = 80; - if(e.keyCode == S_KEY) this.save(); - if(e.keyCode == P_KEY) this.print(); - if(e.keyCode == P_KEY || e.keyCode == S_KEY){ - e.stopPropagation(); - e.preventDefault(); - } - }, - - handleSplitMove : function(){ - this.refs.editor.update(); - }, - - handleMetadataChange : function(metadata){ - this.setState({ - metadata : _.merge({}, this.state.metadata, metadata) - }); - }, - - handleTextChange : function(text){ - this.setState({ - text : text, - errors : Markdown.validate(text) - }); - localStorage.setItem(KEY, text); - }, - - save : async function(){ - this.setState({ - isSaving : true - }); - - console.log('saving new brew'); - - if(this.state.saveGoogle) { - const res = await request - .post('/api/newGoogle/') - .send(_.merge({}, this.state.metadata, { text: this.state.text })) - .catch((err)=>{ - console.log(err.status === 401 - ? 'Not signed in!' - : 'Error Creating New Google Brew!'); - this.setState({ isSaving: false }); - return; - }); - - const brew = res.body; - localStorage.removeItem(KEY); - window.location = `/edit/${brew.googleId}${brew.editId}`; - } else { - request.post('/api') - .send(_.merge({}, this.state.metadata, { - text : this.state.text - })) - .end((err, res)=>{ - if(err){ - this.setState({ - isSaving : false - }); - return; - } - window.onbeforeunload = function(){}; - const brew = res.body; - localStorage.removeItem(KEY); - window.location = `/edit/${brew.editId}`; - }); - } - - }, - - renderSaveButton : function(){ - if(this.state.isSaving){ - return - save... - ; - } else { - return - save - ; - } - }, - - print : function(){ - localStorage.setItem('print', this.state.text); - window.open('/print?dialog=true&local=print', '_blank'); - }, - - renderLocalPrintButton : function(){ - return - get PDF - ; - }, - - renderNavbar : function(){ - return - - - {this.state.metadata.title} - - - - {this.renderSaveButton()} - {this.renderLocalPrintButton()} - - - - - ; - }, - - render : function(){ - return
- {this.renderNavbar()} -
- - - - -
-
; - } -}); - -module.exports = ImportPage; diff --git a/client/homebrew/pages/importPage/importPage.less b/client/homebrew/pages/importPage/importPage.less deleted file mode 100644 index 041508a61..000000000 --- a/client/homebrew/pages/importPage/importPage.less +++ /dev/null @@ -1,10 +0,0 @@ -.importPage{ - - .saveButton{ - background-color: @orange; - &:hover{ - background-color: @green; - } - } - -} \ No newline at end of file diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 8d20277f9..ad40d0905 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -20,10 +20,30 @@ const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const KEY = 'homebrewery-new'; const NewPage = createClass({ + getDefaultProps : function() { + return { + brew : { + text : '', + shareId : null, + editId : null, + createdAt : null, + updatedAt : null, + gDrive : false, + + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [] + } + }; + }, + getInitialState : function() { return { brew : { - text : '', + text : this.props.brew.text, gDrive : false, title : '', description : '', diff --git a/server.js b/server.js index 440751903..b20c2f6c2 100644 --- a/server.js +++ b/server.js @@ -144,7 +144,7 @@ app.get('/edit/:id', (req, res, next)=>{ } }); -//Import Page +//New Page app.get('/new/:id', (req, res, next)=>{ res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. if(req.params.id.length > 12) { From 33580943196894b10294f7e1f61b17b68bf65826 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Tue, 2 Mar 2021 22:14:26 +1300 Subject: [PATCH 5/6] Fix issues arising post-merge --- client/homebrew/pages/newPage/newPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index ad40d0905..754dd90b7 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -43,7 +43,7 @@ const NewPage = createClass({ getInitialState : function() { return { brew : { - text : this.props.brew.text, + text : this.props.brew.text, gDrive : false, title : '', description : '', From 5b242989da9b2cd9240e1177887be2365e930302 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 4 Mar 2021 22:58:40 -0500 Subject: [PATCH 6/6] Handle cached text The NEW page saves to the browser LocalStorage the current text in case the user goes to a different page before saving. The new "import" function wasn't working since it was being overwritten by any cached values if they existed from an earlier "new" page. --- client/homebrew/homebrew.jsx | 2 -- client/homebrew/pages/newPage/newPage.jsx | 2 +- server.js | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 4fa170d7c..1126ab3ba 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -9,7 +9,6 @@ const EditPage = require('./pages/editPage/editPage.jsx'); const UserPage = require('./pages/userPage/userPage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx'); -//const ImportPage = require('./pages/importPage/importPage.jsx'); //const ErrorPage = require('./pages/errorPage/errorPage.jsx'); const PrintPage = require('./pages/printPage/printPage.jsx'); @@ -49,7 +48,6 @@ const Homebrew = createClass({ }/> } /> } /> - // }/> }/>
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 754dd90b7..1594af667 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -61,7 +61,7 @@ const NewPage = createClass({ componentDidMount : function() { const storage = localStorage.getItem(KEY); - if(storage){ + if(!this.props.brew.text && storage){ this.setState({ brew : { text: storage } }); diff --git a/server.js b/server.js index b20c2f6c2..ca2f6f17f 100644 --- a/server.js +++ b/server.js @@ -146,7 +146,6 @@ app.get('/edit/:id', (req, res, next)=>{ //New Page app.get('/new/:id', (req, res, next)=>{ - res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. if(req.params.id.length > 12) { const googleId = req.params.id.slice(0, -12); const shareId = req.params.id.slice(-12);