Skip to content

Commit

Permalink
Merge branch 'addUserInfo-naturalcrit#1908' of https://github.com/G-A…
Browse files Browse the repository at this point in the history
  • Loading branch information
G-Ambatte committed Dec 25, 2022
2 parents f590f9d + dc73664 commit 1fcb432
Show file tree
Hide file tree
Showing 9 changed files with 348 additions and 228 deletions.
33 changes: 31 additions & 2 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,42 @@ pre {
font-family: 'Open Sans';
font-size: 0.9em;
}


```

## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).

### Friday 23/12/2022 - v3.5.0
{{taskList

##### Jeddai

* [x] Only brew owners or invited authors can edit a brew

- Visiting an `/edit` page of a brew that does not list you as an author will result in an error page. Authors can be added to any brew by opening its {{fa,fa-info-circle}} **Properties** menu and typing the author's username (case-sensitive) into the **Invited Authors** bubble.
- Warn user if a newer brew version has been saved on another device

Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987)
}}

\page

### Monday 05/12/2022 - v3.4.1
{{taskList

##### G-Ambatte

* [x] Fix Account page incorrect last login time

Fixes issues [#2521](https://github.com/naturalcrit/homebrewery/issues/2521)

##### Gazook

* [x] Fix crashing on iOS and Safari browsers

Fixes issues [#2531](https://github.com/naturalcrit/homebrewery/issues/2531)
}}

### Saturday 10/12/2022 - v3.4.2
{{taskList

Expand Down
21 changes: 19 additions & 2 deletions client/homebrew/editor/metadataEditor/metadataEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,8 @@ const MetadataEditor = createClass({

render : function(){
return <div className='metadataEditor'>
<h1 className='sectionHead'>Brew</h1>

<div className='field title'>
<label>title</label>
<input type='text' className='value'
Expand Down Expand Up @@ -283,8 +285,6 @@ const MetadataEditor = createClass({
values={this.props.metadata.tags}
onChange={(e)=>this.handleFieldChange('tags', e)}/>

{this.renderAuthors()}

<div className='field systems'>
<label>systems</label>
<div className='value'>
Expand All @@ -296,6 +296,23 @@ const MetadataEditor = createClass({

{this.renderRenderOptions()}

<hr/>

<h1 className='sectionHead'>Authors</h1>

{this.renderAuthors()}

<StringArrayEditor label='invited authors' valuePatterns={[/.+/]}
validators={[(v)=>!this.props.metadata.authors?.includes(v)]}
placeholder='invite author' unique={true}
values={this.props.metadata.invitedAuthors}
notes={['Invited authors are case sensitive.', 'After adding an invited author, send them the edit link. There, they can choose to accept or decline the invitation.']}
onChange={(e)=>this.handleFieldChange('invitedAuthors', e)}/>

<hr/>

<h1 className='sectionHead'>Privacy</h1>

<div className='field publish'>
<label>publish</label>
<div className='value'>
Expand Down
20 changes: 16 additions & 4 deletions client/homebrew/editor/metadataEditor/metadataEditor.less
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@
height : calc(100vh - 54px); // 54px is the height of the navbar + snippet bar. probably a better way to dynamic get this.
overflow-y : auto;

.sectionHead {
font-weight: 1000;
margin: 20px 0;

&:first-of-type {
margin-top: 0;
}
}

& > div {
margin-bottom: 10px;
}
Expand All @@ -30,6 +39,7 @@
}
.field{
display : flex;
flex-wrap : wrap;
width : 100%;
min-width : 200px;
&>label{
Expand Down Expand Up @@ -78,6 +88,11 @@
font-size : 0.8em;
}
}

small {
font-size : 0.6em;
font-style : italic;
}
}


Expand Down Expand Up @@ -128,10 +143,6 @@
button.unpublish{
.button(@silver);
}
small{
font-size : 0.6em;
font-style : italic;
}
}

.delete.field .value{
Expand Down Expand Up @@ -196,6 +207,7 @@
}
.field .list {
display: flex;
flex: 1 0;
flex-wrap: wrap;

> * {
Expand Down
27 changes: 17 additions & 10 deletions client/homebrew/editor/stringArrayEditor/stringArrayEditor.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ const StringArrayEditor = createClass({
label : '',
values : [],
valuePatterns : null,
validators : [],
placeholder : '',
notes : [],
unique : false,
cannotEdit : [],
onChange : ()=>{}
Expand Down Expand Up @@ -83,7 +85,8 @@ const StringArrayEditor = createClass({
}
const matchesPatterns = !this.props.valuePatterns || this.props.valuePatterns.some((pattern)=>!!(value || '').match(pattern));
const uniqueIfSet = !this.props.unique || !values.includes(value);
return matchesPatterns && uniqueIfSet;
const passesValidators = !this.props.validators || this.props.validators.every((validator)=>validator(value));
return matchesPatterns && uniqueIfSet && passesValidators;
},

handleValueInputKeyDown : function(event, index) {
Expand Down Expand Up @@ -123,17 +126,21 @@ const StringArrayEditor = createClass({
</div>
);

return <div className='field values'>
return <div className='field'>
<label>{this.props.label}</label>
<div className='list'>
{valueElements}
<div className='input-group'>
<input type='text' className={`value ${this.valueIsValid(this.state.temporaryValue) ? '' : 'invalid'}`} placeholder={this.props.placeholder}
value={this.state.temporaryValue}
onKeyDown={(e)=>this.handleValueInputKeyDown(e)}
onChange={(e)=>this.setState({ temporaryValue: e.target.value })}/>
{this.valueIsValid(this.state.temporaryValue) ? <div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.addValue(this.state.temporaryValue); }}><i className='fa fa-check fa-fw'/></div> : null}
<div style={{ flex: '1 0' }}>
<div className='list'>
{valueElements}
<div className='input-group'>
<input type='text' className={`value ${this.valueIsValid(this.state.temporaryValue) ? '' : 'invalid'}`} placeholder={this.props.placeholder}
value={this.state.temporaryValue}
onKeyDown={(e)=>this.handleValueInputKeyDown(e)}
onChange={(e)=>this.setState({ temporaryValue: e.target.value })}/>
{this.valueIsValid(this.state.temporaryValue) ? <div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.addValue(this.state.temporaryValue); }}><i className='fa fa-check fa-fw'/></div> : null}
</div>
</div>

{this.props.notes ? this.props.notes.map((n)=><p><small>{n}</small></p>) : null}
</div>
</div>;
}
Expand Down
13 changes: 12 additions & 1 deletion client/homebrew/pages/editPage/editPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,8 @@ const EditPage = createClass({
brew : { ...prevState.brew,
googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null,
editId : this.savedBrew.editId,
shareId : this.savedBrew.shareId
shareId : this.savedBrew.shareId,
version : this.savedBrew.version
},
isPending : false,
isSaving : false,
Expand Down Expand Up @@ -329,6 +330,16 @@ const EditPage = createClass({
</Nav.item>;
}

if(this.state.errors.response.error.status === 409) {
const message = this.state.errors.response.body?.message;
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer'>
{message ? message : 'Conflict: please refresh to get latest changes'}
</div>
</Nav.item>;
}

return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer'>
Expand Down
Loading

0 comments on commit 1fcb432

Please sign in to comment.