Skip to content

Commit 9256023

Browse files
committed
[Enh] Inline edit user
1 parent 15cb2af commit 9256023

File tree

5 files changed

+191
-95
lines changed

5 files changed

+191
-95
lines changed

src/components/UserCreation/index.js

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/components/UserForm/index.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import React, { PureComponent } from 'react';
2+
import PropTypes from 'prop-types';
3+
import { Row, Input, Button } from 'rebass';
4+
import logger from '../../utils/logger';
5+
6+
class UserForm extends PureComponent {
7+
static propTypes = {
8+
name: PropTypes.string.isRequired,
9+
age: PropTypes.number.isRequired,
10+
nickname: PropTypes.string.isRequired,
11+
onChange: PropTypes.func.isRequired,
12+
onSave: PropTypes.func.isRequired,
13+
onCancel: PropTypes.func.isRequired,
14+
isAdd: PropTypes.bool
15+
};
16+
17+
static defaultProps = {
18+
name: '',
19+
age: 0,
20+
nickname: '',
21+
onChange: (field, value) => {},
22+
onSave: user => {},
23+
onCancel: () => {},
24+
isAdd: true
25+
};
26+
27+
onSubmit = evt => {
28+
evt.preventDefault();
29+
logger.warn('onSubmit');
30+
};
31+
32+
render() {
33+
const { age, name, nickname, isAdd } = this.props;
34+
return (
35+
<Row>
36+
<Input
37+
required
38+
placeholder="Name"
39+
name="name"
40+
value={name}
41+
onChange={evt => this.props.onChange('name', evt.target.value)}
42+
/>
43+
<Input
44+
required
45+
type="number"
46+
placeholder="0"
47+
name="age"
48+
value={age}
49+
onChange={evt => this.props.onChange('age', evt.target.value)}
50+
/>
51+
<Input
52+
required
53+
placeholder="Nickname"
54+
name="nickname"
55+
value={nickname}
56+
onChange={evt => this.props.onChange('nickname', evt.target.value)}
57+
/>
58+
<Button
59+
onClick={this.props.onSave}
60+
children={isAdd ? 'Save' : 'Update'}
61+
/>
62+
<Button onClick={this.props.onCancel} children="Cancel" />
63+
</Row>
64+
);
65+
}
66+
}
67+
68+
export default UserForm;

src/components/UserList/UserItem.js

Lines changed: 96 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,78 @@
11
import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
33
import { Row, Column, Button } from 'rebass';
4+
import UserForm from '../UserForm';
5+
import logger from '../../utils/logger';
46

57
class UserItem extends Component {
8+
state = {
9+
updateUser: {
10+
name: '',
11+
age: 0,
12+
nickname: '',
13+
id: ''
14+
}
15+
};
16+
617
static propTypes = {
718
id: PropTypes.string.isRequired,
819
name: PropTypes.string.isRequired,
920
age: PropTypes.number.isRequired,
1021
nickname: PropTypes.string.isRequired,
1122
isEdit: PropTypes.bool.isRequired,
1223
onEdit: PropTypes.func.isRequired,
24+
onInlineEdit: PropTypes.func.isRequired,
1325
onRemove: PropTypes.func.isRequired
1426
};
1527

1628
static defaultProps = {
17-
id: 0,
29+
id: '',
1830
name: '',
1931
age: 0,
2032
nickname: '',
2133
isEdit: false,
2234
onEdit: (userId, user) => {},
23-
onRemove: userId => {}
35+
onRemove: userId => {},
36+
onInlineEdit: (userId, isEdit) => {}
2437
};
2538

26-
renderAction = ({ id, isEdit }) => {
27-
if (isEdit) {
28-
return (
29-
<Column>
30-
<Button children="Edit" />
31-
<Button children="Cancel" />
32-
</Column>
33-
);
39+
onChangeInput = (field, value) => {
40+
const { updateUser } = this.state;
41+
let updateData = {};
42+
let hasChange = false;
43+
switch (field) {
44+
case 'name':
45+
updateData = Object.assign({}, updateUser, { name: value });
46+
hasChange = true;
47+
break;
48+
case 'age':
49+
updateData = Object.assign({}, updateUser, { age: Number(value) });
50+
hasChange = true;
51+
break;
52+
case 'nickname':
53+
updateData = Object.assign({}, updateUser, { nickname: value });
54+
hasChange = true;
55+
break;
56+
default:
57+
logger.warn('unsupport field', field);
3458
}
59+
logger.warn('onChangeInput updateUser', field, value, updateData);
60+
if (hasChange) {
61+
this.setState(prevState => ({
62+
updateUser: updateData
63+
}));
64+
}
65+
};
66+
67+
renderAction = ({ id }) => {
3568
return (
3669
<Column>
37-
<Button children="Edit" />
70+
<Button
71+
onClick={() => {
72+
this.props.onInlineEdit(id);
73+
}}
74+
children="Edit"
75+
/>
3876
<Button
3977
onClick={() => {
4078
this.props.onRemove(id);
@@ -45,22 +83,54 @@ class UserItem extends Component {
4583
);
4684
};
4785

48-
render() {
86+
onCancelInlineEdit = () => {
87+
const { id } = this.props;
88+
const { name, age, nickname } = this.props;
89+
this.setState(prevState => ({
90+
updateUser: { id, name, age, nickname }
91+
}));
92+
this.props.onInlineEdit(id, false);
93+
};
94+
95+
saveChange = () => {
96+
const { id } = this.props;
97+
const { updateUser } = this.state;
98+
this.props.onEdit(id, updateUser);
99+
this.props.onInlineEdit(id, false);
100+
};
101+
102+
componentDidMount() {
49103
const { id, name, age, nickname } = this.props;
50-
return (
51-
<Row key={`${id}-${nickname}`}>
52-
<Column>
53-
{name}
54-
</Column>
55-
<Column>
56-
{age}
57-
</Column>
58-
<Column>
59-
{nickname}
60-
</Column>
61-
{this.renderAction(this.props)}
62-
</Row>
63-
);
104+
this.setState(prevState => ({
105+
updateUser: { id, name, age, nickname }
106+
}));
107+
}
108+
109+
render() {
110+
const { id, isEdit } = this.props;
111+
const { updateUser: { name, age, nickname } } = this.state;
112+
return isEdit
113+
? <UserForm
114+
name={name}
115+
age={age}
116+
nickname={nickname}
117+
isAdd={false}
118+
onSave={this.saveChange}
119+
onCancel={this.onCancelInlineEdit}
120+
onChange={this.onChangeInput}
121+
/>
122+
: <Row key={`${id}-${nickname}-${name}`}>
123+
<Column>
124+
{name}
125+
</Column>
126+
<Column>
127+
{age}
128+
</Column>
129+
<Column>
130+
{nickname}
131+
</Column>
132+
{this.renderAction(this.props)}
133+
</Row>;
64134
}
65135
}
66136

src/components/UserList/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ import logger from '../../utils/logger';
77
class UserList extends Component {
88
static propTypes = {
99
users: PropTypes.array.isRequired,
10+
editIds: PropTypes.array.isRequired,
1011
onEdit: PropTypes.func.isRequired,
12+
onInlineEdit: PropTypes.func.isRequired,
1113
onRemove: PropTypes.func.isRequired
1214
};
1315

1416
static defaultProps = {
1517
users: [],
18+
editIds: [],
1619
onEdit: (userId, user) => {},
20+
onInlineEdit: (userId, isEdit) => {},
1721
onRemove: userId => {}
1822
};
1923

@@ -25,7 +29,9 @@ class UserList extends Component {
2529
<UserItem
2630
key={`${item.id}-${item.nickname}`}
2731
{...item}
32+
isEdit={this.props.editIds.indexOf(item.id) !== -1}
2833
onEdit={this.props.onEdit}
34+
onInlineEdit={this.props.onInlineEdit}
2935
onRemove={this.props.onRemove}
3036
/>
3137
)

src/containers/Users/index.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { Component } from 'react';
22
import { Flex, Box, Button } from 'rebass';
33
import UserList from '../../components/UserList';
4-
import UserCreation from '../../components/UserCreation';
4+
import UserForm from '../../components/UserForm';
55
import { getUsers, addUser, updateUser, removeUser } from '../../store/user';
66
import logger from '../../utils/logger';
77

@@ -13,7 +13,8 @@ class Users extends Component {
1313
name: '',
1414
age: 0,
1515
nickname: ''
16-
}
16+
},
17+
editIds: []
1718
};
1819

1920
onShowNewUserForm = () => {
@@ -24,6 +25,18 @@ class Users extends Component {
2425
this.setState(prevState => ({ isAdding: false }));
2526
};
2627

28+
onInlineEdit = (id, isEdit = true) => {
29+
if (isEdit) {
30+
this.setState(prevState => ({
31+
editIds: [].concat(prevState.editIds, id)
32+
}));
33+
} else {
34+
this.setState(prevState => ({
35+
editIds: prevState.editIds.filter(item => item !== id)
36+
}));
37+
}
38+
};
39+
2740
onAddUser = () => {
2841
const { newUser } = this.state;
2942
logger.warn('onAddUser', newUser);
@@ -77,6 +90,8 @@ class Users extends Component {
7790
default:
7891
logger.warn('unsupport field', field);
7992
}
93+
logger.warn('onChangeInput newUser', field, value, updateData);
94+
8095
if (hasChange) {
8196
this.setState(prevState => ({
8297
newUser: updateData
@@ -92,20 +107,22 @@ class Users extends Component {
92107
}
93108

94109
render() {
95-
const { users, isAdding, newUser } = this.state;
110+
const { users, editIds, isAdding, newUser } = this.state;
96111
logger.warn('Users render', users, isAdding, newUser);
97112
return (
98113
<Flex column align="center">
99114
<Box m="auto">
100115
<UserList
101116
users={users}
117+
editIds={editIds}
102118
onEdit={this.onUpdateUser}
119+
onInlineEdit={this.onInlineEdit}
103120
onRemove={this.onRemoveUser}
104121
/>
105122
</Box>
106123
{isAdding &&
107124
<Box m="auto">
108-
<UserCreation
125+
<UserForm
109126
{...newUser}
110127
onSave={this.onAddUser}
111128
onCancel={this.onCloseNewUserForm}

0 commit comments

Comments
 (0)