react-adminlte-components
Version:
React Components that use AdminLTE theme
193 lines (164 loc) • 4.52 kB
JSX
import React, {PropTypes} from 'react';
import {MainLayout} from 'components/layouts';
import {Link} from 'react-router-dom';
import {Users} from 'base/api';
import {User} from 'components/users';
import {toastr} from 'react-redux-toastr';
import ReactPaginate from 'react-paginate';
import {connect} from 'react-redux';
class ListUsers extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
users: [],
pageCount: 0,
offset: 0,
total: 0,
items: {},
selected: 0,
searchTerm: ''
}
this.fnList = Users.actions.list.request;
}
componentDidMount() {
let fnCount = Users.actions.count.request;
switch (this.props.status) {
case 'MODERATOR':
this.fnList = Users.actions.listClosed.request;
fnCount = Users.actions.countClosed.request;
break;
default:
this.fnList = Users.actions.list.request;
fnCount = Users.actions.count.request;
}
fnCount().then(response => {;
this.setState({
total: response.data.total
});
this.loadUsers();
});
}
loadUsers() {
let search = this.state.searchTerm || '.*';
Users.actions.list.request({
filter: {
skip: this.state.offset,
limit: this.props.limit,
order: 'createdAt DESC',
where: {
fullname: {
regexp: `${search}`
}
}
}
}).then(response => {
this.postLoadUsers(response.data);
});
}
postLoadUsers(users) {
this.setState({
users
});
let itemKeys = {};
users.map(item => {
itemKeys[item.id] = item;
});
let pageCount = Math.ceil(this.state.total / this.props.limit);
this.setState({
items: itemKeys,
pageCount
});
}
handlePageClick = (data) => {
let selected = data.selected;
let offset = Math.ceil(selected * this.props.limit);
this.setState({
offset: offset,
selected
}, () => {
this.loadUsers();
});
};
handleSearch(e) {
let value = e.target.value;
this.setState({
searchTerm: e.target.value
});
if (this.timeout) {
clearTimeout(this.timeout);
}
this.timeout = setTimeout(() => {
Users.actions.count.request({
where: {
fullname: {
regexp: `/${encodeURIComponent(this.state.searchTerm || '.*')}/i`
}
}
}).then(response => {;
this.setState({
total: response.data.total
});
this.loadUsers();
});
}, 1000);
}
render() {
return (
<div>
<div className="form-group">
<label>Tìm người dùng theo tên</label>
<input type="text" className="form-control" value={this.state.searchTerm} placeholder="Business Name" onChange={this.handleSearch.bind(this)}/>
</div>
<table className="table table-striped">
<thead>
<tr>
<th>#</th>
<th>Avatar</th>
<th>
Thông tin
</th>
<th>Ngày tạo</th>
<th>Hành động</th>
</tr>
</thead>
{
this.state.users.map((item, i) => {
return (
<User {...item} className='' index={(i + 1 + ((this.state.selected) * this.props.limit))}
actionPanel={this.props.actionPanel(item, this.loadUsers.bind(this))}
/>
);
})
}
<tfoot>
<tr>
<td colSpan='4'>
<ReactPaginate previousLabel={"previous"}
nextLabel={"next"}
breakLabel={<a href="">...</a>}
breakClassName={"break-me"}
pageCount={this.state.pageCount}
marginPagesDisplayed={2}
pageRangeDisplayed={5}
onPageChange={this.handlePageClick}
containerClassName={"pagination"}
subContainerClassName={"pages pagination"}
activeClassName={"active"} />
</td>
</tr>
</tfoot>
</table>
</div>
);
}
}
ListUsers.PropTypes = {
status: PropTypes.oneOf(['MODERATOR', 'NORMAL']),
limit: PropTypes.number
}
ListUsers.defaultProps = {
status: 'NORMAL',
limit: 30,
actionPanel: function(item, reload) {}
}
export default connect()(ListUsers);