Skip to content

Commit 9347ce3

Browse files
baseline for episode 11
1 parent 36de484 commit 9347ce3

File tree

8 files changed

+213
-0
lines changed

8 files changed

+213
-0
lines changed

ep11-switch-to-todo-part2/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#### Setting up the application
2+
3+
```
4+
npm install
5+
npm start
6+
```
7+
8+
Visit http://localhost:8080 in browser.
9+
10+
#### Notes
11+
12+
* [Source code](...)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React from 'react';
2+
import DisplayList from './DisplayList';
3+
4+
export default class App extends React.Component {
5+
6+
constructor () {
7+
super();
8+
this.state = { title: '', todos: ['eggs', 'banana', 'bread'] };
9+
}
10+
11+
handleDelete (titleToBeDeleted) {
12+
var newTodos = this.state.todos.filter( (_title) => {
13+
return _title != titleToBeDeleted
14+
} )
15+
16+
this.setState({ todos: newTodos});
17+
}
18+
19+
handleSubmit (event) {
20+
event.preventDefault();
21+
22+
var title = this.state.title;
23+
var newTodos = this.state.todos.concat(title);
24+
25+
this.setState({ title: '', todos: newTodos });
26+
}
27+
28+
handleChange (event) {
29+
var title = event.target.value;
30+
this.setState({ title: title });
31+
}
32+
33+
render () {
34+
return <div>
35+
<p> TODO </p>
36+
<form onSubmit={this.handleSubmit.bind(this)}>
37+
<input onChange={this.handleChange.bind(this)} value={this.state.title} />
38+
<button> Submit </button>
39+
</form>
40+
41+
<p>
42+
Number of total tasks: { this.state.todos.length }
43+
</p>
44+
<p>
45+
Number of total tasks done: { this.state.todos.filter((title) => { title.done }).length }
46+
</p>
47+
48+
<DisplayList
49+
handleDelete={this.handleDelete.bind(this)}
50+
todos={this.state.todos} />
51+
</div>;
52+
}
53+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React from 'react';
2+
3+
export default class DisplayItem extends React.Component {
4+
5+
constructor () {
6+
super();
7+
this.state = { done: false };
8+
}
9+
10+
handleDone (event) {
11+
var _done = !this.state.done;
12+
this.setState({ done: _done });
13+
}
14+
15+
render () {
16+
var title = this.props.title;
17+
18+
return <li>
19+
<input
20+
checked={this.state.done}
21+
onChange={this.handleDone.bind(this)}
22+
type="checkbox"
23+
style={{ fontSize: 'x-large' }} />
24+
25+
{ title }
26+
<a href='#' onClick={ this.props.handleDelete.bind(null, title) }>
27+
[x]
28+
</a>
29+
</li>;
30+
}
31+
32+
}
33+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React from 'react';
2+
import DisplayItem from './DisplayItem';
3+
4+
export default class DisplayList extends React.Component {
5+
6+
render () {
7+
return <ul>
8+
{ this.props.todos.map((title, i) => {
9+
return <DisplayItem
10+
key={title}
11+
title={title}
12+
handleDelete={this.props.handleDelete.bind(null, title)} />;
13+
}) }
14+
</ul>
15+
}
16+
17+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import './stylesheets/main.css';
2+
3+
import React from 'react';
4+
import App from './components/App';
5+
6+
main();
7+
8+
function main() {
9+
var app = document.createElement('div');
10+
document.body.appendChild(app);
11+
12+
React.render(<App />, app);
13+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
body{
2+
font-size: 200%;
3+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "learning-reactjs-in-steps",
3+
"version": "0.0.1",
4+
"description": "Learn ReactJS in steps",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"build": "TAGET=build webpack",
9+
"start": "TARGET=dev webpack-dev-server --devtool eval --progress --colors --hot"
10+
},
11+
"author": "Neeraj Singh",
12+
"license": "ISC",
13+
"devDependencies": {
14+
"babel-core": "^5.6.15",
15+
"babel-loader": "^5.3.1",
16+
"css-loader": "^0.15.1",
17+
"html-webpack-plugin": "^1.5.2",
18+
"node-libs-browser": "^0.5.2",
19+
"react-hot-loader": "^1.2.7",
20+
"style-loader": "^0.12.3",
21+
"webpack": "^1.10.1",
22+
"webpack-dev-server": "^1.10.1",
23+
"webpack-merge": "^0.1.2"
24+
},
25+
"dependencies": {
26+
"react": "^0.13.3"
27+
}
28+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
var path = require('path');
2+
var HtmlWebpackPlugin = require('html-webpack-plugin');
3+
var merge = require('webpack-merge');
4+
5+
var TARGET = process.env.TARGET;
6+
var ROOT_PATH = path.resolve(__dirname);
7+
8+
var common = {
9+
entry: [path.resolve(ROOT_PATH, 'app/main')],
10+
resolve: {
11+
extensions: ['', '.js', '.jsx'],
12+
},
13+
output: {
14+
path: path.resolve(ROOT_PATH, 'build'),
15+
filename: 'bundle.js',
16+
},
17+
plugins: [
18+
new HtmlWebpackPlugin({ title: 'Todo app', }),
19+
],
20+
module: {
21+
loaders: [
22+
{
23+
test: /\.css$/,
24+
loaders: ['style', 'css'],
25+
},
26+
{
27+
test: /\.jsx?$/,
28+
loader: 'babel?stage=1',
29+
include: path.resolve(ROOT_PATH, 'app'),
30+
}
31+
],
32+
},
33+
};
34+
35+
if (TARGET === 'build') {
36+
module.exports = common;
37+
}
38+
39+
if (TARGET === 'dev') {
40+
module.exports = merge(common, {
41+
entry: [
42+
'webpack-dev-server/client?http://0.0.0.0:8080',
43+
'webpack/hot/dev-server'
44+
],
45+
module: {
46+
loaders: [ {
47+
test: /\.jsx?$/,
48+
loaders: ['react-hot', 'babel?stage=1'],
49+
include: path.resolve(ROOT_PATH, 'app'),
50+
},
51+
],
52+
},
53+
});
54+
}

0 commit comments

Comments
 (0)