From 41fa0f2c7753f24eedc2d7683e4a7d4e6b8de7c2 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 9 Oct 2022 21:49:25 +1300 Subject: [PATCH 01/83] Apply defaults on load and before saving --- server/homebrew.api.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 293e8f873..d6762d6c2 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -9,6 +9,18 @@ const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); +const DEFAULT_BREW = { + title : 'Untitled Brew', + description : '', + renderer : 'V3', + tags : [], + systems : [], + thumbnail : '', + published : false, + pageCount : 1, + theme : '5ePHB' +}; + // const getTopBrews = (cb) => { // HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) { // cb(brews); @@ -66,6 +78,8 @@ const getBrew = (accessType)=>{ if(typeof stub.tags === 'string') { stub.tags = []; } + + _.defaults(stub, DEFAULT_BREW); req.brew = stub; next(); @@ -130,6 +144,8 @@ const beforeNewSave = (account, brew)=>{ brew.authors = (account) ? [account.username] : []; brew.text = mergeBrewText(brew); + + _.defaults(brew, DEFAULT_BREW); }; const newGoogleBrew = async (account, brew, res)=>{ From 9fd5fea50c6086f07004225b753d4e1d037a52bd Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 9 Oct 2022 21:50:11 +1300 Subject: [PATCH 02/83] Remove obsolete code in app.js --- server/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/app.js b/server/app.js index a3f66bb2c..57be820c0 100644 --- a/server/app.js +++ b/server/app.js @@ -29,7 +29,6 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } - _.defaults(brew, { 'renderer': 'legacy', 'theme': '5ePHB' }); }; const sanitizeBrew = (brew, accessType)=>{ From 9ad915c14a2cc3f0a4d82a1b9e9aa164d19d0f2f Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 9 Oct 2022 21:50:31 +1300 Subject: [PATCH 03/83] Remove unnecessary & incorrect default setting --- server/homebrew.model.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/homebrew.model.js b/server/homebrew.model.js index a514e3fd8..3a4f9b9a6 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -46,8 +46,6 @@ HomebrewSchema.statics.get = function(query, fields=null){ unzipped = zlib.inflateRawSync(brews[0].textBin); brews[0].text = unzipped.toString(); } - if(!brews[0].renderer) - brews[0].renderer = 'legacy'; return resolve(brews[0]); }); }); From 52a79b4f755c82e98002ee5be11fbcbd9ebe2d77 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Thu, 20 Oct 2022 19:11:31 +1300 Subject: [PATCH 04/83] Add default loading properties using custom assign --- server/homebrew.api.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/homebrew.api.js b/server/homebrew.api.js index d6762d6c2..8d19e915c 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -9,6 +9,7 @@ const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); +// Default brew properties in most cases const DEFAULT_BREW = { title : 'Untitled Brew', description : '', @@ -20,6 +21,11 @@ const DEFAULT_BREW = { pageCount : 1, theme : '5ePHB' }; +// Default brew properties for loading +const DEFAULT_BREW_LOAD = { + renderer : 'legacy', + published : true +}; // const getTopBrews = (cb) => { // HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) { @@ -79,7 +85,11 @@ const getBrew = (accessType)=>{ stub.tags = []; } - _.defaults(stub, DEFAULT_BREW); + // Use _.assignWith instead of _.defaults - does this need to be replicated at all other uses of _.defaults??? + _.assignWith(stub, DEFAULT_BREW_LOAD, DEFAULT_BREW, (objValue, srcValue)=>{ + if(typeof objValue === 'boolean') return objValue; + return objValue || srcValue; + }); req.brew = stub; next(); From 7696be5d95c576fd2e68f0c0d2817b916c4e2669 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:00:45 -0500 Subject: [PATCH 05/83] first commit --- .../editor/metadataEditor/metadataEditor.jsx | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 25b4daac8..91da62aa0 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -14,6 +14,17 @@ const SYSTEMS = ['5e', '4e', '3.5e', 'Pathfinder']; const homebreweryThumbnail = require('../../thumbnail.png'); +const validators = { + thumbnail : [ + (value)=>{ + return value?.length > 5 ? 'Max URL length of 5 characters' : null; + }, + (value)=>{ + return (value ?? '')[0] !== 'W' ? 'URL must start with W' : null; + } + ] +}; + const MetadataEditor = createClass({ displayName : 'MetadataEditor', getDefaultProps : function() { @@ -35,7 +46,8 @@ const MetadataEditor = createClass({ getInitialState : function(){ return { - showThumbnail : true + showThumbnail : true, + validationError : null }; }, @@ -51,11 +63,23 @@ const MetadataEditor = createClass({ }, handleFieldChange : function(name, e){ - this.props.onChange({ - ...this.props.metadata, - [name] : e.target.value - }); + const inputRules = validators[name] ?? []; + const validationErr = inputRules.map((rule)=>rule(e.target.value)).filter(Boolean); + this.setState((prevState)=>({ + validationError : { + ...(prevState.validationError ?? {}), + [name] : validationErr.length > 0 ? validationErr : undefined + } + })); + if(Object.values(this.state.validationError ?? {}).filter(Boolean).length === 0){ + this.props.onChange({ + ...this.props.metadata, + [name] : e.target.value + }); + } + }, + handleSystem : function(system, e){ if(e.target.checked){ this.props.metadata.systems.push(system); @@ -64,6 +88,7 @@ const MetadataEditor = createClass({ } this.props.onChange(this.props.metadata); }, + handleRenderer : function(renderer, e){ if(e.target.checked){ this.props.metadata.renderer = renderer; From 589ec0251a1bd42af27276bf6dd4039dce434cba Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Fri, 4 Nov 2022 15:32:20 -0500 Subject: [PATCH 06/83] move validations into it's own file. --- .../editor/metadataEditor/metadataEditor.jsx | 27 +++++++------------ .../editor/metadataEditor/validations.js | 23 ++++++++++++++++ 2 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 client/homebrew/editor/metadataEditor/validations.js diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 91da62aa0..0ae308fc8 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -9,21 +9,13 @@ const Nav = require('naturalcrit/nav/nav.jsx'); const StringArrayEditor = require('../stringArrayEditor/stringArrayEditor.jsx'); const Themes = require('themes/themes.json'); +const validations = require('./validations.js') const SYSTEMS = ['5e', '4e', '3.5e', 'Pathfinder']; const homebreweryThumbnail = require('../../thumbnail.png'); -const validators = { - thumbnail : [ - (value)=>{ - return value?.length > 5 ? 'Max URL length of 5 characters' : null; - }, - (value)=>{ - return (value ?? '')[0] !== 'W' ? 'URL must start with W' : null; - } - ] -}; + const MetadataEditor = createClass({ displayName : 'MetadataEditor', @@ -33,6 +25,7 @@ const MetadataEditor = createClass({ editId : null, title : '', description : '', + thumbnail : '', tags : [], published : false, authors : [], @@ -46,8 +39,8 @@ const MetadataEditor = createClass({ getInitialState : function(){ return { - showThumbnail : true, - validationError : null + showThumbnail : true, + errs : null }; }, @@ -63,20 +56,20 @@ const MetadataEditor = createClass({ }, handleFieldChange : function(name, e){ - const inputRules = validators[name] ?? []; + const inputRules = validations[name] ?? []; const validationErr = inputRules.map((rule)=>rule(e.target.value)).filter(Boolean); this.setState((prevState)=>({ - validationError : { - ...(prevState.validationError ?? {}), + errs : { + ...(prevState.errs ?? {}), [name] : validationErr.length > 0 ? validationErr : undefined } })); - if(Object.values(this.state.validationError ?? {}).filter(Boolean).length === 0){ + if(Object.values(this.state.errs ?? {}).filter(Boolean).length === 0){ this.props.onChange({ ...this.props.metadata, [name] : e.target.value }); - } + }; }, diff --git a/client/homebrew/editor/metadataEditor/validations.js b/client/homebrew/editor/metadataEditor/validations.js new file mode 100644 index 000000000..48d037b54 --- /dev/null +++ b/client/homebrew/editor/metadataEditor/validations.js @@ -0,0 +1,23 @@ +module.exports = { + title : [ + (value)=>{ + return value?.length > 10 ? 'Max URL length of 10 characters' : null; + } + ], + description : [ + (value)=>{ + return value?.length > 10 ? 'Max URL length of 10 characters' : null; + } + ], + thumbnail : [ + (value)=>{ + return value?.length > 5 ? 'Max URL length of 5 characters' : null; + }, + (value)=>{ + return (value ?? '')[0] !== 'W' ? 'URL must start with W' : null; + } + ] +}; + + + From 8c52a253dce34427152c3b6757126574093b38e9 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Fri, 4 Nov 2022 20:22:59 -0500 Subject: [PATCH 07/83] log errs correctly, setCustomValidity and reportValidity --- .../editor/metadataEditor/metadataEditor.jsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 0ae308fc8..76454e88b 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -65,10 +65,17 @@ const MetadataEditor = createClass({ } })); if(Object.values(this.state.errs ?? {}).filter(Boolean).length === 0){ + e.target.setCustomValidity(''); this.props.onChange({ ...this.props.metadata, [name] : e.target.value }); + } else { + const errMessage = this.state.errs[name].map((err)=>{ + return `- ${err}`; + }).join('\n'); + e.target.setCustomValidity(errMessage); + e.target.reportValidity(); }; }, @@ -241,25 +248,30 @@ const MetadataEditor = createClass({ ; }, + // renderErrors : function(){ + // if(Object.values(this.state.errs ?? {}).filter(Boolean).length > 0) return; + // return + // }, + render : function(){ return
this.handleFieldChange('title', e)} />
-