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; }