+
Save current
diff --git a/client/homebrew/pages/homePage/homePage.less b/client/homebrew/pages/homePage/homePage.less
index 4cf9ff4fe..c3ec1815c 100644
--- a/client/homebrew/pages/homePage/homePage.less
+++ b/client/homebrew/pages/homePage/homePage.less
@@ -34,7 +34,13 @@
}
.navItem.save {
+ .fadeInRight();
+ .transition(opacity);
background-color : @orange;
&:hover { background-color : @green; }
+ &.neverSaved {
+ .fadeOutRight();
+ opacity: 0;
+ }
}
}
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx
index d1d1fa75c..bc2b39c44 100644
--- a/client/homebrew/pages/newPage/newPage.jsx
+++ b/client/homebrew/pages/newPage/newPage.jsx
@@ -5,6 +5,7 @@ import './newPage.less';
import React, { useState, useEffect, useRef } from 'react';
import request from '../../utils/request-middleware.js';
import Markdown from 'naturalcrit/markdown.js';
+import _ from 'lodash';
import { DEFAULT_BREW } from '../../../../server/brewDefaults.js';
import { printCurrentBrew, fetchThemeBundle, splitTextStyleAndMetadata } from '../../../../shared/helpers.js';
@@ -26,15 +27,14 @@ import { both as RecentNavItem } from '../../navbar/recent.navitem.jsx';
// Page specific imports
import { Meta } from 'vitreum/headtags';
-
const BREWKEY = 'HB_newPage_content';
const STYLEKEY = 'HB_newPage_style';
const METAKEY = 'HB_newPage_metadata';
const SNIPKEY = 'HB_newPage_snippets';
const SAVEKEYPREFIX = 'HB_editor_defaultSave_';
-
const useLocalStorage = true;
+const neverSaved = true;
const NewPage = (props) => {
props = {
@@ -51,8 +51,11 @@ const NewPage = (props) => {
const [currentEditorCursorPageNum, setCurrentEditorCursorPageNum] = useState(1);
const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1);
const [themeBundle , setThemeBundle ] = useState({});
+ const [unsavedChanges , setUnsavedChanges ] = useState(false);
+ const [autoSaveEnabled , setAutoSaveEnabled ] = useState(false);
- const editorRef = useRef(null);
+ const editorRef = useRef(null);
+ const lastSavedBrew = useRef(_.cloneDeep(props.brew));
useEffect(() => {
loadBrew();
@@ -93,6 +96,7 @@ const NewPage = (props) => {
const saveStorage = localStorage.getItem(SAVEKEY) || 'HOMEBREWERY';
setCurrentBrew(brew);
+ lastSavedBrew.current = brew;
setSaveGoogle(saveStorage == 'GOOGLE-DRIVE' && saveGoogle);
localStorage.setItem(BREWKEY, brew.text);
@@ -103,6 +107,13 @@ const NewPage = (props) => {
window.history.replaceState({}, window.location.title, '/new/');
};
+ useEffect(()=>{
+ const hasChange = !_.isEqual(currentBrew, lastSavedBrew.current);
+ setUnsavedChanges(hasChange);
+
+ if(autoSaveEnabled) trySave(false, hasChange);
+ }, [currentBrew]);
+
const handleSplitMove = ()=>{
editorRef.current.update();
};
@@ -159,15 +170,38 @@ const NewPage = (props) => {
};
const renderSaveButton = ()=>{
- if(isSaving){
- return
- save...
- ;
- } else {
- return
- save
- ;
- }
+ // #1 - Currently saving, show SAVING
+ if(isSaving)
+ return
saving...;
+
+ // #2 - Unsaved changes exist, autosave is OFF and warning timer has expired, show AUTOSAVE WARNING
+ // if(unsavedChanges && warnUnsavedChanges) {
+ // resetWarnUnsavedTimer();
+ // const elapsedTime = Math.round((new Date() - lastSavedTime) / 1000 / 60);
+ // const text = elapsedTime === 0
+ // ? 'Autosave is OFF.'
+ // : `Autosave is OFF, and you haven't saved for ${elapsedTime} minutes.`;
+
+ // return
+ // Reminder...
+ // {text}
+ // ;
+ // }
+
+ // #3 - Unsaved changes exist, click to save, show SAVE NOW
+ if(unsavedChanges)
+ return
save now;
+
+ // #4 - No unsaved changes, autosave is ON, show AUTO-SAVED
+ if(autoSaveEnabled)
+ return
auto-saved;
+
+ // #5 - No unsaved changes, and has never been saved, hide the button
+ if(neverSaved)
+ return
save now;
+
+ // DEFAULT - No unsaved changes, show SAVED
+ return
saved;
};
const clearError = ()=>{
diff --git a/client/homebrew/pages/newPage/newPage.less b/client/homebrew/pages/newPage/newPage.less
index ebc44d543..083e1ee09 100644
--- a/client/homebrew/pages/newPage/newPage.less
+++ b/client/homebrew/pages/newPage/newPage.less
@@ -1,6 +1,12 @@
.newPage {
.navItem.save {
+ .fadeInRight();
+ .transition(opacity);
background-color : @orange;
&:hover { background-color : @green; }
+ &.neverSaved {
+ .fadeOutRight();
+ opacity: 0;
+ }
}
}
diff --git a/client/homebrew/pages/vaultPage/vaultPage.less b/client/homebrew/pages/vaultPage/vaultPage.less
index 8a5f3a714..304fefc72 100644
--- a/client/homebrew/pages/vaultPage/vaultPage.less
+++ b/client/homebrew/pages/vaultPage/vaultPage.less
@@ -1,14 +1,16 @@
.vaultPage {
height : 100%;
overflow-y : hidden;
- background-color : #2C3E50;
*:not(input) { user-select : none; }
+ .form {
+ background:white;
+ }
+
:where(.content .dataGroup) {
width : 100%;
height : 100%;
- background : white;
&.form .brewLookup {
position : relative;
@@ -171,7 +173,6 @@
max-height : 100%;
padding : 70px 50px;
overflow-y : scroll;
- background-color : #2C3E50;
container-type : inline-size;
h3 { font-size : 25px; }
diff --git a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js
index b4a05974f..f6e01c54f 100644
--- a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js
+++ b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.js
@@ -26,7 +26,7 @@ const getLocalStorageMap = function(){
if(global?.account?.username){
const username = global.account.username;
- localStorageMap[`HOMEBREWERY-DEFAULT-SAVE-LOCATION-${username}`] = `HB_editor_defaultSave_${username}`;
+ localStorageMap[`HOMEBREWERY-DEFAULT-SAVE-LOCATION-${username}`] = `HB_editor_defaultSave_${username}`;
}
return localStorageMap;
diff --git a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js b/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js
deleted file mode 100644
index ac61d4add..000000000
--- a/client/homebrew/utils/updateLocalStorage/localStorageKeyMap.spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import getLocalStorageMap from './localStorageKeyMap.js';
-
-describe('getLocalStorageMap', ()=>{
- it('no username', ()=>{
- const account = global.account;
-
- delete global.account;
-
- const map = getLocalStorageMap();
-
- global.account = account;
-
- expect(map).toBeInstanceOf(Object);
- expect(Object.entries(map)).toHaveLength(16);
- });
-
- it('no username', ()=>{
- const account = global.account;
-
- global.account = { username: 'test' };
-
- const map = getLocalStorageMap();
-
- global.account = account;
-
- expect(map).toBeInstanceOf(Object);
- expect(Object.entries(map)).toHaveLength(17);
- expect(map).toHaveProperty('HOMEBREWERY-DEFAULT-SAVE-LOCATION-test', 'HB_editor_defaultSave_test');
- });
-});
\ No newline at end of file
diff --git a/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js b/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js
index 1a8231f73..912c4297b 100644
--- a/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js
+++ b/client/homebrew/utils/updateLocalStorage/updateLocalStorageKeys.js
@@ -4,10 +4,7 @@ const updateLocalStorage = function(){
// Return if no window and thus no local storage
if(typeof window === 'undefined') return;
- // Return if the local storage key map has no content
const localStorageKeyMap = getLocalStorageMap();
- if(Object.keys(localStorageKeyMap).length == 0) return;
-
const storage = window.localStorage;
Object.keys(localStorageKeyMap).forEach((key)=>{
diff --git a/config/default.json b/config/default.json
index bea3b2663..0a2d7281e 100644
--- a/config/default.json
+++ b/config/default.json
@@ -1,4 +1,5 @@
{
+ "development": true,
"host" : "homebrewery.local.naturalcrit.com:8000",
"naturalcrit_url" : "local.naturalcrit.com:8010",
"secret" : "secret",
diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less
index 42a392454..9d41181e9 100644
--- a/themes/V3/Blank/style.less
+++ b/themes/V3/Blank/style.less
@@ -611,3 +611,17 @@ h6,
}
.toc.wide li { break-inside : auto; }
}
+
+
+/**********************************
+Firefox endruns
+**********************************/
+
+@supports (-moz-user-select: none) { // This section will only apply to Firefox; it's the only browser that supports `-mos-xyz...`
+ .page {
+ blockquote, table {
+ page-break-inside: auto;
+ break-inside: auto;
+ }
+ }
+}
\ No newline at end of file