From 475f3e75ddfff2fdba1915d8445bfbb82848b0a5 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 21 Sep 2022 00:29:40 -0500 Subject: [PATCH 01/13] add simple toggle to 'save status' field for auto-save --- client/homebrew/pages/editPage/editPage.jsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index d6a20527e..08caaeb68 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -62,7 +62,8 @@ const EditPage = createClass({ confirmGoogleTransfer : false, errors : null, htmlErrors : Markdown.validate(this.props.brew.text), - url : '' + url : '', + autoSave : true }; }, savedBrew : null, @@ -142,7 +143,12 @@ const EditPage = createClass({ return !_.isEqual(this.state.brew, this.savedBrew); }, + toggleAutoSave : function(){ + this.setState((prevState)=>({ autoSave: !prevState.autoSave })); + }, + trySave : function(){ + if(!this.state.autoSave){ console.log('Auto-save is now off.'); return }; if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ this.debounceSave(); @@ -336,7 +342,7 @@ const EditPage = createClass({ return Save Now; } if(!this.state.isPending && !this.state.isSaving){ - return saved.; + return {this.state.autoSave ? `saved.` : `auto-save off`}; } }, From f681948a35fce5ae6e079fb04778e4ddd3bd7d72 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 21 Sep 2022 00:42:10 -0500 Subject: [PATCH 02/13] pedantic change --- client/homebrew/pages/editPage/editPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 08caaeb68..b06b21613 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -148,7 +148,7 @@ const EditPage = createClass({ }, trySave : function(){ - if(!this.state.autoSave){ console.log('Auto-save is now off.'); return }; + if(!this.state.autoSave){ console.log('Auto-save is off.'); return }; if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ this.debounceSave(); From c7ed9ea717790a94c1ede3fc17015d1914d83143 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Tue, 27 Sep 2022 19:35:29 -0500 Subject: [PATCH 03/13] Create autosave toggle dropdown menu --- client/homebrew/navbar/navbar.less | 7 +++++++ client/homebrew/pages/editPage/editPage.jsx | 16 +++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/client/homebrew/navbar/navbar.less b/client/homebrew/navbar/navbar.less index 39fbfaf5c..a199ecbe4 100644 --- a/client/homebrew/navbar/navbar.less +++ b/client/homebrew/navbar/navbar.less @@ -55,6 +55,13 @@ text-align : center; text-transform : initial; } + .save-menu .navItem i.fa-power-off { + color : red; + &.active { + color : rgb(0, 182, 52); + filter : drop-shadow(0 0 2px rgba(0, 182, 52, 0.765)) + } + } .patreon.navItem{ border-left : 1px solid #666; border-right : 1px solid #666; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index b06b21613..0976fbf98 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -143,12 +143,8 @@ const EditPage = createClass({ return !_.isEqual(this.state.brew, this.savedBrew); }, - toggleAutoSave : function(){ - this.setState((prevState)=>({ autoSave: !prevState.autoSave })); - }, - trySave : function(){ - if(!this.state.autoSave){ console.log('Auto-save is off.'); return }; + if(!this.state.autoSave){return;}; if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ this.debounceSave(); @@ -342,7 +338,7 @@ const EditPage = createClass({ return Save Now; } if(!this.state.isPending && !this.state.isSaving){ - return {this.state.autoSave ? `saved.` : `auto-save off`}; + return saved.; } }, @@ -384,7 +380,13 @@ const EditPage = createClass({ {this.renderGoogleDriveIcon()} - {this.renderSaveButton()} + + {this.renderSaveButton()} + { this.setState((prevState)=>({ autoSave: !prevState.autoSave }));}}> + Autosave + + + From fa4b3338af3a9cbb13c951d2c80e71884662256e Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Tue, 27 Sep 2022 21:04:51 -0500 Subject: [PATCH 04/13] save autosave setting to localStorage --- client/homebrew/pages/editPage/editPage.jsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 0976fbf98..746f5324b 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -63,12 +63,14 @@ const EditPage = createClass({ errors : null, htmlErrors : Markdown.validate(this.props.brew.text), url : '', - autoSave : true + autoSave : null }; }, savedBrew : null, componentDidMount : function(){ + this.setState({ autoSave: JSON.parse(localStorage.getItem('AUTOSAVE_ON')) }); + this.setState({ url : window.location.href }); @@ -382,7 +384,12 @@ const EditPage = createClass({ {this.renderGoogleDriveIcon()} {this.renderSaveButton()} - { this.setState((prevState)=>({ autoSave: !prevState.autoSave }));}}> + { + this.setState((prevState)=>({ + autoSave : !prevState.autoSave + })); + localStorage.setItem('AUTOSAVE_ON', JSON.stringify(!this.state.autoSave)); + }}> Autosave From ab695d29fe08f97a3e9f87f161ff2c7d7fa51dc1 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 28 Sep 2022 11:13:16 -0500 Subject: [PATCH 05/13] refactor into `handle...` and `render...` methods --- client/homebrew/pages/editPage/editPage.jsx | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 746f5324b..fa755aa5d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -344,6 +344,19 @@ const EditPage = createClass({ } }, + handleAutoSave : function(){ + this.setState((prevState)=>({ + autoSave : !prevState.autoSave + })); + localStorage.setItem('AUTOSAVE_ON', JSON.stringify(!this.state.autoSave)); + }, + + renderAutoSaveButton : function(){ + return + Autosave + ; + }, + processShareId : function() { return this.state.brew.googleId && !this.state.brew.stubbed ? this.state.brew.googleId + this.state.brew.shareId : @@ -384,15 +397,7 @@ const EditPage = createClass({ {this.renderGoogleDriveIcon()} {this.renderSaveButton()} - { - this.setState((prevState)=>({ - autoSave : !prevState.autoSave - })); - localStorage.setItem('AUTOSAVE_ON', JSON.stringify(!this.state.autoSave)); - }}> - Autosave - - + {this.renderAutoSaveButton()} From 9bb13445389ea799e85736fec1ebaeaefbae9b21 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 28 Sep 2022 12:17:14 -0500 Subject: [PATCH 06/13] tweak behavior per calculuschild notes Default to autosave = true. trySave() when autosave toggled on. Display "auto-saved." when save is a result of autosave. --- client/homebrew/pages/editPage/editPage.jsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index fa755aa5d..f3fad3f53 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -63,7 +63,7 @@ const EditPage = createClass({ errors : null, htmlErrors : Markdown.validate(this.props.brew.text), url : '', - autoSave : null + autoSave : true }; }, savedBrew : null, @@ -339,6 +339,9 @@ const EditPage = createClass({ if(this.state.isPending && this.hasChanges()){ return Save Now; } + if(!this.state.isPending && !this.state.isSaving && this.state.autoSave){ + return auto-saved.; + } if(!this.state.isPending && !this.state.isSaving){ return saved.; } @@ -347,8 +350,10 @@ const EditPage = createClass({ handleAutoSave : function(){ this.setState((prevState)=>({ autoSave : !prevState.autoSave - })); - localStorage.setItem('AUTOSAVE_ON', JSON.stringify(!this.state.autoSave)); + }), ()=>{ + this.trySave(); + localStorage.setItem('AUTOSAVE_ON', JSON.stringify(this.state.autoSave)); + }); }, renderAutoSaveButton : function(){ From 95497350e49260a2d607d970f8ba91a1b67a4c1c Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 28 Sep 2022 20:20:11 -0500 Subject: [PATCH 07/13] move test for autosave status to handleTextChange from trySave() --- client/homebrew/pages/editPage/editPage.jsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index f3fad3f53..9a90d7ad9 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -25,6 +25,7 @@ const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); const SAVE_TIMEOUT = 3000; +const AUTOSAVE_TIMEOUT = 10000; const EditPage = createClass({ displayName : 'EditPage', @@ -120,14 +121,14 @@ const EditPage = createClass({ brew : { ...prevState.brew, text: text }, isPending : true, htmlErrors : htmlErrors - }), ()=>this.trySave()); + }), ()=>{if(this.state.autoSave) this.trySave();}); }, handleStyleChange : function(style){ this.setState((prevState)=>({ brew : { ...prevState.brew, style: style }, isPending : true - }), ()=>this.trySave()); + }), ()=>{if(this.state.autoSave) this.trySave();}); }, handleMetaChange : function(metadata){ @@ -137,7 +138,7 @@ const EditPage = createClass({ ...metadata }, isPending : true, - }), ()=>this.trySave()); + }), ()=>{if(this.state.autoSave) this.trySave();}); }, @@ -146,7 +147,13 @@ const EditPage = createClass({ }, trySave : function(){ - if(!this.state.autoSave){return;}; + // if(!this.state.autoSave){ + // if(this.autoSaveInterval){ + // clearInterval(this.autoSaveInterval); + // } + // this.autoSaveInterval = setInterval(this.trySave, 10000); + // return; + // }; if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ this.debounceSave(); @@ -351,7 +358,7 @@ const EditPage = createClass({ this.setState((prevState)=>({ autoSave : !prevState.autoSave }), ()=>{ - this.trySave(); + if(this.state.autoSave) this.trySave(); localStorage.setItem('AUTOSAVE_ON', JSON.stringify(this.state.autoSave)); }); }, From 0cd598ae144561b891acea46ebf9ef8a0e3985c0 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:42:50 -0500 Subject: [PATCH 08/13] rework the whole thing --- client/homebrew/navbar/navbar.less | 15 ++++--- client/homebrew/pages/editPage/editPage.jsx | 44 +++++++++++++------- client/homebrew/pages/editPage/editPage.less | 2 +- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/client/homebrew/navbar/navbar.less b/client/homebrew/navbar/navbar.less index a199ecbe4..d1a54da6f 100644 --- a/client/homebrew/navbar/navbar.less +++ b/client/homebrew/navbar/navbar.less @@ -55,11 +55,16 @@ text-align : center; text-transform : initial; } - .save-menu .navItem i.fa-power-off { - color : red; - &.active { - color : rgb(0, 182, 52); - filter : drop-shadow(0 0 2px rgba(0, 182, 52, 0.765)) + .save-menu { + .dropdown { + z-index: 1000; + } + .navItem i.fa-power-off { + color : red; + &.active { + color : rgb(0, 182, 52); + filter : drop-shadow(0 0 2px rgba(0, 182, 52, 0.765)) + } } } .patreon.navItem{ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 9a90d7ad9..49903a4b2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -25,7 +25,6 @@ const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); const SAVE_TIMEOUT = 3000; -const AUTOSAVE_TIMEOUT = 10000; const EditPage = createClass({ displayName : 'EditPage', @@ -64,21 +63,27 @@ const EditPage = createClass({ errors : null, htmlErrors : Markdown.validate(this.props.brew.text), url : '', - autoSave : true + autoSave : true, + autoSaveWarning : false }; }, savedBrew : null, componentDidMount : function(){ - this.setState({ autoSave: JSON.parse(localStorage.getItem('AUTOSAVE_ON')) }); - this.setState({ url : window.location.href }); this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy - this.trySave(); + this.setState({ autoSave: JSON.parse(localStorage.getItem('AUTOSAVE_ON')) }, ()=>{ + if(this.state.autoSave){ + this.trySave(); + } else { + this.setState({ autoSaveWarning: true }); + } + }); + window.onbeforeunload = ()=>{ if(this.state.isSaving || this.state.isPending){ return 'You have unsaved changes!'; @@ -147,13 +152,6 @@ const EditPage = createClass({ }, trySave : function(){ - // if(!this.state.autoSave){ - // if(this.autoSaveInterval){ - // clearInterval(this.autoSaveInterval); - // } - // this.autoSaveInterval = setInterval(this.trySave, 10000); - // return; - // }; if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ this.debounceSave(); @@ -340,6 +338,18 @@ const EditPage = createClass({ ; } + if(this.state.autoSaveWarning){ + setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); + this.setAutosaveWarning(); + + return + Reminder... +
+ Autosave has been turned off, and you haven't saved for {Math.round((new Date() - new Date(this.props.brew.updatedAt)) / 1000 / 60)} minutes. +
+
; + } + if(this.state.isSaving){ return saving...; } @@ -355,14 +365,20 @@ const EditPage = createClass({ }, handleAutoSave : function(){ + if(this.warningTimer) clearTimeout(this.warningTimer); this.setState((prevState)=>({ - autoSave : !prevState.autoSave + autoSave : !prevState.autoSave, + autoSaveWarning : prevState.autoSave }), ()=>{ - if(this.state.autoSave) this.trySave(); localStorage.setItem('AUTOSAVE_ON', JSON.stringify(this.state.autoSave)); }); }, + setAutosaveWarning : function(){ + this.warningTimer = setTimeout(()=>{this.setState({ autoSaveWarning: true });}, 15000); + this.warningTimer; + }, + renderAutoSaveButton : function(){ return Autosave diff --git a/client/homebrew/pages/editPage/editPage.less b/client/homebrew/pages/editPage/editPage.less index 5d0d21b64..9d3f69221 100644 --- a/client/homebrew/pages/editPage/editPage.less +++ b/client/homebrew/pages/editPage/editPage.less @@ -32,7 +32,7 @@ position : absolute; top : 100%; left : 50%; - z-index : 100000; + z-index : 500; width : 140px; padding : 3px; color : white; From 8609026531e101f47addd6965d9f54ff56f4e635 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Fri, 30 Sep 2022 11:24:15 -0500 Subject: [PATCH 09/13] add `unsavedTime` state for better notification --- client/homebrew/pages/editPage/editPage.jsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 49903a4b2..3fcdcc168 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -64,7 +64,8 @@ const EditPage = createClass({ htmlErrors : Markdown.validate(this.props.brew.text), url : '', autoSave : true, - autoSaveWarning : false + autoSaveWarning : false, + unsavedTime : new Date() }; }, savedBrew : null, @@ -74,6 +75,7 @@ const EditPage = createClass({ url : window.location.href }); + this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy this.setState({ autoSave: JSON.parse(localStorage.getItem('AUTOSAVE_ON')) }, ()=>{ @@ -230,8 +232,9 @@ const EditPage = createClass({ editId : this.savedBrew.editId, shareId : this.savedBrew.shareId }, - isPending : false, - isSaving : false, + isPending : false, + isSaving : false, + unsavedTime : new Date() })); }, @@ -339,13 +342,14 @@ const EditPage = createClass({ } if(this.state.autoSaveWarning){ + console.log(this.state.unsavedTime); setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); this.setAutosaveWarning(); return Reminder...
- Autosave has been turned off, and you haven't saved for {Math.round((new Date() - new Date(this.props.brew.updatedAt)) / 1000 / 60)} minutes. + Autosave has been turned off, and you haven't saved for {Math.round((new Date() - this.state.unsavedTime) / 1000 / 60)} minutes.
; } From bfb82e8a21eadbe7503df8cc8424878a52177c6c Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Fri, 30 Sep 2022 12:20:59 -0500 Subject: [PATCH 10/13] autosave warning conditional on elapsed time unsaved. --- client/homebrew/pages/editPage/editPage.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 3fcdcc168..03cd87a0b 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -342,14 +342,14 @@ const EditPage = createClass({ } if(this.state.autoSaveWarning){ - console.log(this.state.unsavedTime); - setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); this.setAutosaveWarning(); + const elapsedTime = Math.round((new Date() - this.state.unsavedTime) / 1000 / 60); + const text = elapsedTime == 0 ? 'Autosave is OFF.' : `Autosave has been turned off, and you haven't saved for ${elapsedTime} minutes.`; return Reminder...
- Autosave has been turned off, and you haven't saved for {Math.round((new Date() - this.state.unsavedTime) / 1000 / 60)} minutes. + {text}
; } @@ -379,6 +379,7 @@ const EditPage = createClass({ }, setAutosaveWarning : function(){ + setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); this.warningTimer = setTimeout(()=>{this.setState({ autoSaveWarning: true });}, 15000); this.warningTimer; }, From c56adcba76e90a6c9b7d9a2b74f7cb7c88927692 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Mon, 17 Oct 2022 21:49:50 -0500 Subject: [PATCH 11/13] only display 'off' warning if changes exist --- client/homebrew/pages/editPage/editPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 03cd87a0b..a817691f2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -341,7 +341,7 @@ const EditPage = createClass({
; } - if(this.state.autoSaveWarning){ + if(this.state.autoSaveWarning && this.hasChanges()){ this.setAutosaveWarning(); const elapsedTime = Math.round((new Date() - this.state.unsavedTime) / 1000 / 60); const text = elapsedTime == 0 ? 'Autosave is OFF.' : `Autosave has been turned off, and you haven't saved for ${elapsedTime} minutes.`; From c49be3391ef36f550b18b5fdb4d4c7aa734e5767 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Mon, 17 Oct 2022 21:52:48 -0500 Subject: [PATCH 12/13] change time delay between warnings to 15min --- client/homebrew/pages/editPage/editPage.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a817691f2..7a288e5d2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -379,8 +379,8 @@ const EditPage = createClass({ }, setAutosaveWarning : function(){ - setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); - this.warningTimer = setTimeout(()=>{this.setState({ autoSaveWarning: true });}, 15000); + setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); // 4 seconds to display + this.warningTimer = setTimeout(()=>{this.setState({ autoSaveWarning: true });}, 900000); // 15 minutes between warnings this.warningTimer; }, From 8b8a60c8adf48fc299fc3b78687b3b988f8f824c Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 18 Oct 2022 13:22:29 -0400 Subject: [PATCH 13/13] tweak alert text --- client/homebrew/pages/editPage/editPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 7a288e5d2..3608c277d 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -344,7 +344,7 @@ const EditPage = createClass({ if(this.state.autoSaveWarning && this.hasChanges()){ this.setAutosaveWarning(); const elapsedTime = Math.round((new Date() - this.state.unsavedTime) / 1000 / 60); - const text = elapsedTime == 0 ? 'Autosave is OFF.' : `Autosave has been turned off, and you haven't saved for ${elapsedTime} minutes.`; + const text = elapsedTime == 0 ? 'Autosave is OFF.' : `Autosave is OFF, and you haven't saved for ${elapsedTime} minutes.`; return Reminder...