diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx
index 074879b05..58c44ded9 100644
--- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx
+++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx
@@ -8,6 +8,8 @@ const request = require('../../utils/request-middleware.js');
const Nav = require('naturalcrit/nav/nav.jsx');
const Combobox = require('client/components/combobox.jsx');
const StringArrayEditor = require('../stringArrayEditor/stringArrayEditor.jsx');
+const HomebrewModel = require('../../../../server/homebrew.model.js').model;
+
const Themes = require('themes/themes.json');
const validations = require('./validations.js');
@@ -192,20 +194,23 @@ const MetadataEditor = createClass({
renderThemeDropdown : function(){
if(!global.enable_themes) return;
+ const mergedThemes = { ...Themes, ...this.props.metadata.userThemes };
+
const listThemes = (renderer)=>{
- return _.map(_.values(Themes[renderer]), (theme)=>{
- return
this.handleTheme(theme)} title={''}>
- {`${theme.renderer} : ${theme.name}`}
+ return _.map(_.values(mergedThemes[renderer]), (theme)=>{
+ const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`;
+ return
this.handleTheme(theme)} title={''}>
+ {`${renderer} : ${theme.name}`}
{`${theme.name}`} preview
-

+
;
});
};
- const currentTheme = Themes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme];
+ const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme];
let dropdown;
if(this.props.metadata.renderer == 'legacy') {
@@ -223,6 +228,7 @@ const MetadataEditor = createClass({
{/*listThemes('Legacy')*/}
{listThemes('V3')}
+ {listThemes('Brew')}
;
}
diff --git a/config/default.json b/config/default.json
index 70c90593e..12b35e6cf 100644
--- a/config/default.json
+++ b/config/default.json
@@ -4,6 +4,7 @@
"secret" : "secret",
"web_port" : 8000,
"enable_v3" : true,
+ "enable_themes" : true,
"local_environments" : ["docker", "local"],
"publicUrl" : "https://homebrewery.naturalcrit.com"
}
diff --git a/server/app.js b/server/app.js
index fc5d4a035..af842f2bf 100644
--- a/server/app.js
+++ b/server/app.js
@@ -42,6 +42,36 @@ const sanitizeBrew = (brew, accessType)=>{
return brew;
};
+const getUsersBrewThemes = async (username)=>{
+ const fields = [
+ 'title',
+ 'tags',
+ 'editId',
+ 'thumbnail'
+ ];
+ const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects
+ .catch((error)=>{throw 'Can not find brews';});
+
+ const userThemes = {
+ Brew : {
+
+ }
+ };
+
+ brews.forEach((brew)=>{
+ userThemes.Brew[brew.editId] = {
+ name : brew.title,
+ renderer : 'V3',
+ baseTheme : false,
+ baseSnippets : false,
+ path : `#${brew.editId}`,
+ thumbnail : brew.thumbnail
+ };
+ });
+
+ return userThemes;
+};
+
app.use('/', serveCompressedStaticAssets(`build`));
app.use(require('./middleware/content-negotiation.js'));
app.use(require('body-parser').json({ limit: '25mb' }));
@@ -278,7 +308,7 @@ app.get('/user/:username', async (req, res, next)=>{
});
//Edit Page
-app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{
+app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{
req.brew = req.brew.toObject ? req.brew.toObject() : req.brew;
req.ogMeta = { ...defaultMetaTags,
@@ -288,6 +318,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{
type : 'article'
};
+ req.brew.userThemes = await getUsersBrewThemes(req.account.username);
sanitizeBrew(req.brew, 'edit');
splitTextStyleAndMetadata(req.brew);
res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save.
diff --git a/server/homebrew.model.js b/server/homebrew.model.js
index 36c9aa192..c8db8fdcc 100644
--- a/server/homebrew.model.js
+++ b/server/homebrew.model.js
@@ -50,8 +50,8 @@ HomebrewSchema.statics.get = async function(query, fields=null){
return brew;
};
-HomebrewSchema.statics.getByUser = async function(username, allowAccess=false, fields=null){
- const query = { authors: username, published: true };
+HomebrewSchema.statics.getByUser = async function(username, allowAccess=false, fields=null, filter=null){
+ const query = { authors: username, published: true, ...filter };
if(allowAccess){
delete query.published;
}