UNPKG

generator-bingo-dig-h5

Version:

Bingo-dig-h5 generator by BINGO.DIG

223 lines (186 loc) 6.52 kB
var React = require('react/addons'); var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup; var Classable = require('../../mixins/classable'); var SlideInTransitionGroup = require('../transition-groups/slide-in'); var FontIcon = require('../font-icon'); var Checkbox = require('../Checkbox'); var Toggle = require('../toggle'); var IconButton = require('../icon-button'); var ListItem = require('./list-item'); var List = React.createClass({ mixins: [Classable], propTypes: { type: React.PropTypes.oneOf(['SingleLine', 'TwoLine', 'ThreeLine']), leftElementType: React.PropTypes.oneOf(['Image', 'Checkbox', 'Icon', 'IconButton', 'Toggle']), rightElementType: React.PropTypes.oneOf(['Image', 'Checkbox', 'Icon', 'IconButton', 'Toggle']), canClick: React.PropTypes.bool, listItems: React.PropTypes.array.isRequired, animationDirection: React.PropTypes.oneOf(['left', 'right']), keyFieldName: React.PropTypes.string, onLeftButtonClick: React.PropTypes.func, onRightButtonClick: React.PropTypes.func, onLeftCheck: React.PropTypes.func, onRightCheck: React.PropTypes.func, onLeftToggle: React.PropTypes.func, onRightToggle: React.PropTypes.func, onItemTap: React.PropTypes.func, onItemClick: React.PropTypes.func }, getDefaultProps: function() { return { keyFieldName: 'Id', type: 'SingleLine', listItems: [], animationDirection: 'left', canClick: false }; }, getInitialState: function() { return { currentItems: this.props.listItems }; }, render: function() { var classes = this.getClasses('dig-list'); var items = this.state.currentItems.map(function(listItem, i) { var { primaryText, secondaryText, thirdText, leftImageSrc, rightImageSrc, leftIconClassName, rightIconClassName, leftDefaultChecked, rightDefaultChecked, leftDefaultToggleed, rightDefaultToggleed, ...other } = listItem; var leftElement = this._getElement(this.props.leftElementType, listItem, 'left'); var rightElement = this._getElement(this.props.rightElementType, listItem, 'right'); var key = listItem[this.props.keyFieldName]; return ( <div ref="listContainer" key={key} className="dig-list-item-container"> <ListItem key={key} index={i} type={this.props.type} leftElement = {leftElement} rightElement = {rightElement} primaryText={primaryText} secondaryText={secondaryText} thirdText={thirdText} canClick={this.props.canClick} onClick={this._onItemClick} onTouchTap={this._onItemTap} /> </div> ); }.bind(this)); return ( <div className={classes}> <SlideInTransitionGroup direction="right"> {items} </SlideInTransitionGroup> </div> ); }, _getElement: function(elementType, listItem, direction){ var element; var { leftImageSrc, rightImageSrc, leftIconClassName, rightIconClassName, leftDefaultChecked, rightDefaultChecked, leftDefaultToggleed, rightDefaultToggleed, } = listItem; switch(elementType){ case 'Image': element = direction === 'left' ? (<img src={leftImageSrc} className="dig-avatar" />) : (<img src={rightImageSrc} className="dig-avatar" />); break; case 'Checkbox': var classes = direction === 'left' ? '' : 'dig-secondary'; element = direction === 'left' ? (<Checkbox className={classes} defaultChecked={leftDefaultChecked} onCheck={this._onLeftCheck.bind(this, listItem)}/>) : (<Checkbox className={classes} defaultChecked={rightDefaultChecked} onCheck={this._onRightCheck.bind(this, listItem)}/>); break; case 'Icon': var classes = direction === 'left' ? leftIconClassName : rightIconClassName + ' dig-secondary'; element = (<FontIcon className={classes}></FontIcon>); break; case 'IconButton': var iconClasses = direction === 'left' ? leftIconClassName : rightIconClassName; var classes = direction === 'left' ? '' : 'dig-secondary'; var action = direction === 'left' ? this._onLeftClick.bind(this, listItem) : this._onRightClick.bind(this, listItem); element = (<IconButton className={classes} iconClassName={iconClasses} onClick={action}></IconButton>); break; case 'Toggle': var classes = direction === 'left' ? '' : 'dig-secondary'; element = direction === 'left' ? (<Toggle className={classes} defaultToggled={leftDefaultToggleed} onToggle={this._onLeftToggle.bind(this, listItem)}/>) : (<Toggle className={classes} defaultToggled={rightDefaultToggleed} onToggle={this._onRightToggle.bind(this, listItem)}/>); break; default: } return element; }, _onLeftCheck: function (listItem, e, isChecked) { if (this.props.onLeftCheck){ this.props.onLeftCheck(listItem, e, isChecked); } }, _onRightCheck: function (listItem, e, isChecked) { if (this.props.onRightCheck){ this.props.onRightCheck(listItem, e, isChecked); } }, _onLeftToggle: function (listItem, e, isToggled) { if (this.props.onLeftToggle){ this.props.onLeftToggle(listItem, e, isToggled); } }, _onRightToggle: function (listItem, e, isToggled) { if (this.props.onRightToggle){ this.props.onRightToggle(listItem, e, isToggled); } }, _onLeftClick: function (listItem, e) { if (this.props.onLeftButtonClick){ this.props.onLeftButtonClick(listItem, e); } }, _onRightClick: function (listItem, e) { if (this.props.onRightButtonClick){ this.props.onRightButtonClick(listItem, e); } }, _onItemClick: function(e, index) { if (this.props.onItemClick){ this.props.onItemClick(this.props.listItems[index], e, index); } }, _onItemTap: function(e, index) { if (this.props.onItemTap){ this.props.onItemTap(this.props.listItems[index], e, index); } }, AddItem: function(item) { var newItems = this.state.currentItems.concat([item]); this.setState({currentItems: newItems}); }, RemoveItem: function(index) { var newItems = this.state.currentItems; newItems.splice(index, 1); this.setState({currentItems: newItems}); }, SetItems: function(newItems) { this.setState({currentItems: newItems}); } }); module.exports = List;