diff --git a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx
index 5756b0df1..fc69466f1 100644
--- a/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx
+++ b/client/homebrew/pages/basePages/listPage/brewItem/brewItem.jsx
@@ -104,6 +104,13 @@ const BrewItem = createClass({
+ {brew.tags ? <>
+
+ {brew.tags.join(', ')}
+
+
+ > : <>>
+ }
{brew.authors?.join(', ')}
diff --git a/client/homebrew/pages/basePages/listPage/listPage.jsx b/client/homebrew/pages/basePages/listPage/listPage.jsx
index efd9e3f4a..7df89ae90 100644
--- a/client/homebrew/pages/basePages/listPage/listPage.jsx
+++ b/client/homebrew/pages/basePages/listPage/listPage.jsx
@@ -6,6 +6,8 @@ const moment = require('moment');
const BrewItem = require('./brewItem/brewItem.jsx');
+const USERPAGE_KEY_PREFIX = 'HOMEBREWERY-LISTPAGE-VISIBILITY';
+
const ListPage = createClass({
displayName : 'ListPage',
getDefaultProps : function() {
@@ -21,14 +23,47 @@ const ListPage = createClass({
};
},
getInitialState : function() {
+ // HIDE ALL GROUPS UNTIL LOADED
+ const brewCollection = this.props.brewCollection.map((brewGroup)=>{
+ brewGroup.visible = false;
+ return brewGroup;
+ });
+
return {
- sortType : 'alpha',
- sortDir : 'asc',
filterString : this.props.query?.filter || '',
- query : this.props.query
+ sortType : this.props.query?.sort || 'alpha',
+ sortDir : this.props.query?.dir || 'asc',
+ query : this.props.query,
+ brewCollection : brewCollection
};
},
+ componentDidMount : function() {
+ // SAVE TO LOCAL STORAGE WHEN LEAVING PAGE
+ window.onbeforeunload = this.saveToLocalStorage;
+
+ // LOAD FROM LOCAL STORAGE
+ if(typeof window !== 'undefined') {
+ const brewCollection = this.props.brewCollection.map((brewGroup)=>{
+ brewGroup.visible = (localStorage.getItem(`${USERPAGE_KEY_PREFIX}-${brewGroup.class}`) ?? 'true')=='true';
+ return brewGroup;
+ });
+ this.setState({
+ brewCollection : brewCollection
+ });
+ };
+ },
+
+ componentWillUnmount : function() {
+ window.onbeforeunload = function(){};
+ },
+
+ saveToLocalStorage : function() {
+ this.state.brewCollection.map((brewGroup)=>{
+ localStorage.setItem(`${USERPAGE_KEY_PREFIX}-${brewGroup.class}`, `${brewGroup.visible}`);
+ });
+ },
+
renderBrews : function(brews){
if(!brews || !brews.length) return
No Brews.
;
@@ -50,14 +85,18 @@ const ListPage = createClass({
},
handleSortOptionChange : function(event){
+ this.updateUrl(this.state.filterString, event.target.value, this.state.sortDir);
this.setState({
sortType : event.target.value
});
},
handleSortDirChange : function(event){
+ const newDir = this.state.sortDir == 'asc' ? 'desc' : 'asc';
+
+ this.updateUrl(this.state.filterString, this.state.sortType, newDir);
this.setState({
- sortDir : `${(this.state.sortDir == 'asc' ? 'desc' : 'asc')}`
+ sortDir : newDir
});
},
@@ -77,19 +116,22 @@ const ListPage = createClass({
this.setState({
filterString : e.target.value,
});
- this.updateUrl(e.target.value);
+ this.updateUrl(e.target.value, this.state.sortType, this.state.sortDir);
return;
},
- updateUrl : function(filterTerm){
+ updateUrl : function(filterTerm, sortType, sortDir){
const url = new URL(window.location.href);
const urlParams = new URLSearchParams(url.search);
- if(urlParams.get('filter') == filterTerm)
- return;
+
+ urlParams.set('sort', sortType);
+ urlParams.set('dir', sortDir);
+
if(!filterTerm)
urlParams.delete('filter');
else
urlParams.set('filter', filterTerm);
+
url.search = urlParams;
window.history.replaceState(null, null, url);
},
@@ -149,11 +191,22 @@ const ListPage = createClass({
return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir);
},
+ toggleBrewCollectionState : function(brewGroupClass) {
+ this.setState((prevState)=>({
+ brewCollection : prevState.brewCollection.map(
+ (brewGroup)=>brewGroup.class === brewGroupClass ? { ...brewGroup, visible: !brewGroup.visible } : brewGroup
+ )
+ }));
+ },
+
renderBrewCollection : function(brewCollection){
+ if(brewCollection == []) return
+
No Brews
+ ;
return _.map(brewCollection, (brewGroup, idx)=>{
return
-
{brewGroup.title || 'No Title'}
- {this.renderBrews(this.getSortedBrews(brewGroup.brews))}
+ {this.toggleBrewCollectionState(brewGroup.class);}}>{brewGroup.title || 'No Title'}
+ {brewGroup.visible ? this.renderBrews(this.getSortedBrews(brewGroup.brews)) : <>>}
;
});
},
@@ -166,7 +219,7 @@ const ListPage = createClass({
{this.renderSortOptions()}
- {this.renderBrewCollection(this.props.brewCollection)}
+ {this.renderBrewCollection(this.state.brewCollection)}
;
diff --git a/client/homebrew/pages/basePages/listPage/listPage.less b/client/homebrew/pages/basePages/listPage/listPage.less
index 64131e35b..d4efbe445 100644
--- a/client/homebrew/pages/basePages/listPage/listPage.less
+++ b/client/homebrew/pages/basePages/listPage/listPage.less
@@ -74,4 +74,26 @@
}
}
}
+ h1 {
+ cursor: pointer;
+ &.active {
+ color: #58180D;
+ }
+ &.inactive {
+ color: #707070;
+
+ }
+ &.active::before, &.inactive::before {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 900;
+ font-size: 0.6cm;
+ padding-right: 0.5em;
+ }
+ &.active::before {
+ content: '\f107';
+ }
+ &.inactive::before {
+ content: '\f105';
+ }
+ }
}
diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx
index 3bba1ab62..6a2709896 100644
--- a/client/homebrew/pages/newPage/newPage.jsx
+++ b/client/homebrew/pages/newPage/newPage.jsx
@@ -75,7 +75,7 @@ const NewPage = createClass({
componentDidMount : function() {
document.addEventListener('keydown', this.handleControlKeys);
- const brew = this.props.brew;
+ const brew = this.state.brew;
if(typeof window !== 'undefined') { //Load from localStorage if in client browser
const brewStorage = localStorage.getItem(BREWKEY);