UNPKG

material-ui-pagination-react

Version:
246 lines (207 loc) 5.79 kB
/** * Created by rachitabansal on 7/7/17. */ var React = require('react'); import PropTypes from "prop-types"; import SelectField from "material-ui/SelectField"; import MenuItem from "material-ui/MenuItem"; import ChevronLeftIcon from "material-ui/svg-icons/navigation/chevron-left"; import ChevronRightIcon from "material-ui/svg-icons/navigation/chevron-right"; import FirstPageIcon from "material-ui/svg-icons/navigation/first-page"; import LastPageIcon from "material-ui/svg-icons/navigation/last-page"; import IconButton from "material-ui/IconButton"; /** * Displays component for Pagination. * */ class Pagination extends React.Component { /** * The constructor. Set initial values. * @param {object} props properties. * */ constructor(props) { super(props); const {activePage, rows, selectedRowSize} = this.props; this.state = { pageEnd: Math.floor(rows / selectedRowSize), selectedPage: activePage }; } /** * @param {object} nextProps the next properties if component gets new * props. * */ componentWillReceiveProps(nextProps) { const {selectedRowSize, rows} = this.props; const {selectedPage} = this.state; if (nextProps.selectedRowSize !== selectedRowSize || nextProps.rows !== rows) { this.setState({ pageEnd: Math.floor(nextProps.rows / nextProps.selectedRowSize), selectedPage: Math.floor(nextProps.rows / nextProps.selectedRowSize) < selectedPage ? 0 : selectedPage }); } }; /** * @param {number} rowSize array for rows per page. * @return {Function} react element. * */ menuItems(rowSize) { return rowSize.map((size, index) => <MenuItem primaryText={size} value={size} key={index}/>); }; /** * @param {object} event event of the select field. * @param {number} index index of the row size array. * @param {number} selectedRowSize selected rows per page. * */ handleRowSizeChange(event, index, selectedRowSize) { const {handleRowSizeChange} = this.props; handleRowSizeChange(event, index, selectedRowSize); }; /** * @param {object} event event fired by previous select button. * */ handleOnSelectPrevious(event) { const {handleOnSelectPrevious} = this.props; const {selectedPage} = this.state; this.setState({selectedPage: selectedPage - 1}); if (handleOnSelectPrevious) { handleOnSelectPrevious(event, selectedPage - 1); } }; /** * @param {object} event event fired by next select button. * */ handleOnSelectNext(event) { const {handleOnSelectNext} = this.props; const {selectedPage} = this.state; this.setState({selectedPage: selectedPage + 1}); if (handleOnSelectNext) { handleOnSelectNext(event, selectedPage + 1); } }; /** * @param {object} event event fired by select first page button. * */ handleOnSelectFirst(event) { const {pageStart, handleOnSelectFirst} = this.props; this.setState({selectedPage: pageStart}); if (handleOnSelectFirst) { handleOnSelectFirst(event, pageStart); } }; /** * event fired by last page select button. * */ handleOnSelectLast(event) { const {handleOnSelectLast} = this.props; const {pageEnd} = this.state; this.setState({selectedPage: pageEnd}); if (handleOnSelectLast) { handleOnSelectLast(event, pageEnd); } }; /** * Change errorClose if prop changes * @return {JSX} react element. */ render() { const { rowSize, rowSizeWidthStyle, rows, selectedRowSize, pageStart, position } = this.props; const {pageEnd, selectedPage} = this.state; console.log(this.state); const menuItems = this.menuItems(rowSize); const rowsSliced = (selectedRowSize * (selectedPage + 1)) >= rows ? rows : (selectedRowSize * (selectedPage + 1)); return (<div style={{ float: position, marginBottom: "24px", marginRight: "-24px" }}> <SelectField value={selectedRowSize} floatingLabelText="Rows per page" style={{ width: rowSizeWidthStyle, fontSize: "0.9em" }} menuItemStyle={{fontSize: "0.8em"}} autoWidth={false} maxHeight={500} onChange={this.handleRowSizeChange}> {menuItems} </SelectField> <div style={{display: "inline-block", verticalAlign: "bottom"}}> <IconButton onTouchTap={this.handleOnSelectFirst} disabled={selectedPage <= (pageStart)}> <FirstPageIcon/> </IconButton> <IconButton onTouchTap={this.handleOnSelectPrevious} disabled={selectedPage <= (pageStart)}> <ChevronLeftIcon/> </IconButton> <span style={{ display: "inline-block", verticalAlign: "middle", paddingBottom: "16px" }}>{rowsSliced} of {rows}</span> <IconButton onTouchTap={this.handleOnSelectNext} disabled={selectedPage >= (pageEnd - 1)}> <ChevronRightIcon/> </IconButton> <IconButton onTouchTap={this.handleOnSelectLast} disabled={selectedPage >= (pageEnd - 1)}> <LastPageIcon/> </IconButton> </div> </div>); } } /** * @type {object} default properties of component. * */ Pagination.defaultProps = { rowSize: [10, 30, 50, 100], activePage: 0, pageStart: 0, selectedRowSize: 10, rowSizeWidthStyle: "20%", rows: 1 }; /** * @type {object} component properties. * */ Pagination.propTypes = { rowSize: PropTypes.array, selectedRowSize: PropTypes.number, pageStart: PropTypes.number, rows: PropTypes.number, rowSizeStyle: PropTypes.object, handleRowSizeChange: PropTypes.func, activePage: PropTypes.number, handleOnSelectPrevious: PropTypes.func, handleOnSelectNext: PropTypes.func, handleOnSelectFirst: PropTypes.func, handleOnSelectLast: PropTypes.func }; export default Pagination; // var Pagination = React.createClass({ // render () { // return <div>Pagination</div>; // } // }); // // export default Pagination;