This commit is contained in:
data 2019-07-10 22:08:28 +02:00
parent 4e90f48cb8
commit e56afa8869
5 changed files with 132 additions and 96 deletions

View File

@ -8,11 +8,7 @@ import {
selectArticle,
} from './controllers/articles'
import {
addTag,
selectTag,
removeTag,
} from './controllers/tags'
import { addTag, selectTag, removeTag } from './controllers/tags'
import {
createTask,
@ -59,7 +55,7 @@ const defaultState = {
newTask: '',
newProject: '',
project: {},
newTag: ''
newTag: '',
}
class App extends React.Component {
@ -160,7 +156,15 @@ class App extends React.Component {
const projects = await this.fetchProjects()
const comments = await this.fetchComments()
const votes = await this.fetchVotes()
await this.setState({ loading: false, articles, tags, tasks, projects, comments, votes })
await this.setState({
loading: false,
articles,
tags,
tasks,
projects,
comments,
votes,
})
}
componentDidMount() {
@ -185,8 +189,7 @@ class App extends React.Component {
renderError() {
if (!this.state.error) {
return <div>There was an error.</div>
}
else if (this.state.error.message === 'Network Error') {
} else if (this.state.error.message === 'Network Error') {
alert(`Failed to reach backend at\n${this.state.error.config.url}.`)
} else {
return (
@ -214,36 +217,39 @@ class App extends React.Component {
)
}
renderArticles() {
return (<Articles
navigate={this.navigate}
handleChange={this.handleChange}
createArticle={this.createArticle}
selectArticle={this.selectArticle}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
{...this.state}
return (
<Articles
navigate={this.navigate}
handleChange={this.handleChange}
createArticle={this.createArticle}
selectArticle={this.selectArticle}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
{...this.state}
/>
)
}
renderArticle() {
return (<Article
navigate={this.navigate}
addTag={this.addTag}
removeTag={this.removeTag}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
handleChange={this.handleChange}
{...this.state}
return (
<Article
navigate={this.navigate}
addTag={this.addTag}
removeTag={this.removeTag}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
handleChange={this.handleChange}
{...this.state}
/>
)
}
renderUpdateArticle() {
return (<UpdateArticle
handleChange={this.handleChange}
updateArticle={this.updateArticle}
navigate={this.navigate}
selectTag={this.selectTag}
{...this.state}
return (
<UpdateArticle
handleChange={this.handleChange}
updateArticle={this.updateArticle}
navigate={this.navigate}
selectTag={this.selectTag}
{...this.state}
/>
)
}

View File

@ -11,23 +11,32 @@ class Article extends React.Component {
render() {
return (
<div>
<Tags
{...this.props}
/>
<Tags {...this.props} />
<h2>{this.state.title}</h2>
<div className="mb-3">{this.state.text}</div>
<div>
<button className="btn btn-primary" onClick={() => this.props.navigate('articles')}>Back</button>
<button className="btn btn-primary ml-1" onClick={() => this.props.navigate('update-article')}>Edit</button>
<button
className="btn btn-primary"
onClick={() => this.props.navigate('articles')}
>
Back
</button>
<button
className="btn btn-primary ml-1"
onClick={() => this.props.navigate('update-article')}
>
Edit
</button>
</div>
<h2 className="mt-3">Comments</h2>
<ul className="list-group">
{this.props.comments ? this.props.comments.map(comment=>(
<li className="list-group-item" key={comment.id}>
{comment.text}
</li>
)) : "No comments yet."
}
{this.props.comments
? this.props.comments.map(comment => (
<li className="list-group-item" key={comment.id}>
{comment.text}
</li>
))
: 'No comments yet.'}
</ul>
</div>
)

View File

@ -26,38 +26,42 @@ function Articles(props) {
>
{article.title}{' '}
</button>
<button
className="btn ml-1 float-right"
>
{props.comments.map(c => c.articleId === article.id).length} comment(s)
<button className="btn ml-1 float-right">
{props.comments.map(c => c.articleId === article.id).length}{' '}
comment(s)
</button>
{props.tags && props.tags.filter(t => t.articleId === article.id).map(tag => (
<button className="btn btn-outline-success mr-1 float-right" key={tag.id}
onClick={(e) => props.selectTag(tag.id)}>
{tag.name}
</button>
))
}
{props.tags &&
props.tags
.filter(t => t.articleId === article.id)
.map(tag => (
<button
className="btn btn-outline-success mr-1 float-right"
key={tag.id}
onClick={e => props.selectTag(tag.id)}
>
{tag.name}
</button>
))}
</li>
))}
<li className="list-group-item">
<form className="form-group row" onSubmit={props.createArticle}>
<input
className="form-control col input-sm"
placeholder="Create Article"
name="newArticle"
value={props.newArticle}
onChange={props.handleChange}
/>
<button
type="submit"
className="form-control col col-sm-2 ml-1 btn btn-primary"
onClick={props.createArticle}
>
Save
</button>
</form>
<li className="list-group-item">
<form className="form-group row" onSubmit={props.createArticle}>
<input
className="form-control col input-sm"
placeholder="Create Article"
name="newArticle"
value={props.newArticle}
onChange={props.handleChange}
/>
<button
type="submit"
className="form-control col col-sm-2 ml-1 btn btn-primary"
onClick={props.createArticle}
>
Save
</button>
</form>
</li>
</ul>
</div>

View File

@ -9,27 +9,42 @@ class Tags extends React.Component {
render() {
return (
<div>
{this.props.tags && this.props.tags.filter(t => t.articleId === this.props.selectedArticleId).map(tag => (
<span key={tag.id}>
<button className="btn btn-outline-success ml-1"
onClick={(e) => this.props.selectTag(tag.id)}>
{tag.name}
{this.props.tags &&
this.props.tags
.filter(t => t.articleId === this.props.selectedArticleId)
.map(tag => (
<span key={tag.id}>
<button
className="btn btn-outline-success ml-1"
onClick={e => this.props.selectTag(tag.id)}
>
{tag.name}
</button>
<button
className="btn btn-danger mr-1"
onClick={e => this.props.removeTag(tag.id)}
>
-
</button>
</span>
))}
<form className="mt-2 mb-2" onSubmit={this.props.addTag}>
<input
className="col input-sm col-sm-3 ml-3 mr-1"
placeholder="Add tag"
name="newTag"
value={this.props.newTag}
onChange={this.props.handleChange}
/>
<button
className="col btn btn-primary col-sm-1"
onClick={this.props.addTag}
>
+
</button>
<button className="btn btn-danger mr-1" onClick={(e) => this.props.removeTag(tag.id)}>-</button>
</span>
))}
<form className="mt-2 mb-2" onSubmit={this.props.addTag}>
<input
className="col input-sm col-sm-3 ml-3 mr-1"
placeholder="Add tag"
name="newTag"
value={this.props.newTag}
onChange={this.props.handleChange}
/>
<button className="col btn btn-primary col-sm-1" onClick={this.props.addTag}>+</button>
</form>
</div>
)}
</form>
</div>
)
}
}
export default Tags

View File

@ -8,8 +8,8 @@ class UpdateArticle extends React.Component {
this.handleChange = this.handleChange.bind(this)
if (!props.selectedArticleId) {
props.navigate('articles')
}
props.navigate('articles')
}
}
handleChange(e) {
@ -19,7 +19,9 @@ class UpdateArticle extends React.Component {
render() {
return (
<div>
<button className="btn" onClick={() => this.props.navigate('article')}>back</button>
<button className="btn" onClick={() => this.props.navigate('article')}>
back
</button>
<form>
<h2 className="form-group row">Article {this.state.id}</h2>
<div className="form-group row">
@ -29,7 +31,7 @@ class UpdateArticle extends React.Component {
name="title"
value={this.state.title}
onChange={this.handleChange}
/>
/>
</div>
<div className="form-group row">
@ -38,7 +40,7 @@ class UpdateArticle extends React.Component {
className="form-control"
name="text"
rows="25"
value={this.state.text || ""}
value={this.state.text || ''}
onChange={this.handleChange}
/>
</div>