UNPKG

boldr-ui

Version:

UI components for Boldr

293 lines (251 loc) 8.87 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _Search = require('./components/Search'); var _Search2 = _interopRequireDefault(_Search); var _Option = require('./components/Option'); var _Option2 = _interopRequireDefault(_Option); var _constants = require('./constants'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } if (typeof exports !== 'undefined') Object.defineProperty(exports, 'babelPluginFlowReactPropTypes_proptype_Props', { value: { cid: require('prop-types').string, keyword: require('prop-types').any, selectedItems: require('prop-types').arrayOf(require('prop-types').any), searchPlaceholder: require('prop-types').string, emptyText: require('prop-types').any, prefixCls: require('prop-types').string, extraFilter: require('prop-types').bool, filter: require('prop-types').func, onAsyncFilter: require('prop-types').func, onFocus: require('prop-types').func, onBlur: require('prop-types').func } }); var Popup = function (_Component) { (0, _inherits3.default)(Popup, _Component); function Popup(props) { (0, _classCallCheck3.default)(this, Popup); var _this = (0, _possibleConstructorReturn3.default)(this, (Popup.__proto__ || (0, _getPrototypeOf2.default)(Popup)).call(this, props)); _this.state = { data: props.data, currentId: 0, keyword: props.keyword || '' }; _this.currentId = 0; _this.sourceData = props.data; _this.searchFilterHandler = _this.searchFilterHandler.bind(_this); _this.optionChangedHandler = _this.optionChangedHandler.bind(_this); _this.keydownHandler = _this.keydownHandler.bind(_this); return _this; } (0, _createClass3.default)(Popup, [{ key: 'componentDidMount', value: function componentDidMount() { if (!this.props.filter) { this.popup.focus(); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { this.sourceData = nextProps.data; if (nextProps.keyword !== null) { this.setState({ data: nextProps.data, keyword: nextProps.keyword }); } } }, { key: 'optionChangedHandler', value: function optionChangedHandler(ev, cid) { this.setState({ keyword: '' }); this.props.onBlur(); this.props.onChange(ev, this.props.data.filter(function (item) { return item.cid === cid; })[0]); } }, { key: 'searchFilterHandler', value: function searchFilterHandler(keyword) { var _this2 = this; var _props = this.props, filter = _props.filter, onAsyncFilter = _props.onAsyncFilter; if (typeof onAsyncFilter === 'function') { onAsyncFilter('' + keyword, function (data) { _this2.setState({ keyword: keyword, data: _this2.sourceData.filter(function (item) { return (0, _isArray2.default)(data) && data.indexOf(item.value) > -1; }) }); }); } else { this.setState({ keyword: keyword, data: this.sourceData.filter(function (item) { return !keyword || !filter || filter(item, '' + keyword); }) }); } } }, { key: 'keydownHandler', value: function keydownHandler(ev) { var code = ev.keyCode; var itemIds = this.itemIds; var _state = this.state, currentId = _state.currentId, keyword = _state.keyword; var index = itemIds.indexOf(currentId); switch (code) { case _constants.KEY_DOWN: ev.preventDefault(); if (this.itemIds[index + 1]) { currentId = this.itemIds[index + 1]; this.currentIdUpdated = true; } break; case _constants.KEY_UP: ev.preventDefault(); if (index > 0) { currentId = this.itemIds[index - 1]; this.currentIdUpdated = true; } break; case _constants.KEY_EN: ev.preventDefault(); this.optionChangedHandler(keyword, currentId); this.currentIdUpdated = false; break; default: break; } this.setState({ currentId: currentId }); } }, { key: 'updateCurrentId', value: function updateCurrentId(cid) { this.setState({ currentId: cid }); } }, { key: 'render', value: function render() { var _this3 = this; var _props2 = this.props, cid = _props2.cid, selectedItems = _props2.selectedItems, emptyText = _props2.emptyText, prefixCls = _props2.prefixCls, extraFilter = _props2.extraFilter, searchPlaceholder = _props2.searchPlaceholder, filter = _props2.filter, onFocus = _props2.onFocus, onBlur = _props2.onBlur; var _state2 = this.state, keyword = _state2.keyword, data = _state2.data, currentId = _state2.currentId; var filterData = data.filter(function (item) { return !keyword || !filter || filter(item, '' + keyword); }); var showEmpty = data.length === 0 || filterData.length === 0; this.itemIds = filterData.map(function (item) { return item.cid; }); return _react2.default.createElement( 'div', { ref: function ref(popup) { return _this3.popup = popup; }, tabIndex: '0', className: prefixCls + '-popup', onFocus: onFocus, onBlur: onBlur, onKeyDown: this.keydownHandler }, !extraFilter && filter ? _react2.default.createElement(_Search2.default, { keyword: keyword, prefixCls: prefixCls, placeholder: searchPlaceholder, onChange: this.searchFilterHandler }) : '', filterData.map(function (item, index) { if (index === 0 && !currentId) { currentId = item.cid; _this3.state.currentId = currentId; } if (keyword && item.text === keyword) { currentId = item.cid; } var currentCls = item.cid === currentId ? 'current' : ''; var activeCls = selectedItems.filter(function (o) { return o.cid === item.cid; }).length > 0 || item.cid === cid ? 'active' : ''; return _react2.default.createElement(_Option2.default, (0, _extends3.default)({ key: index, className: prefixCls + '-option ' + activeCls + ' ' + currentCls }, item, { onClick: _this3.optionChangedHandler, onMouseEnter: _this3.updateCurrentId.bind(_this3, item.cid) })); }), showEmpty && _react2.default.createElement(_Option2.default, { className: prefixCls + '-empty', text: emptyText, onClick: this.optionChangedHandler }) ); } }]); return Popup; }(_react.Component); Popup.propTypes = process.env.NODE_ENV !== "production" ? { cid: require('prop-types').string, keyword: require('prop-types').any, selectedItems: require('prop-types').arrayOf(require('prop-types').any), searchPlaceholder: require('prop-types').string, emptyText: require('prop-types').any, prefixCls: require('prop-types').string, extraFilter: require('prop-types').bool, filter: require('prop-types').func, onAsyncFilter: require('prop-types').func, onFocus: require('prop-types').func, onBlur: require('prop-types').func } : {}; Popup.defaultProps = { cid: -1, keyword: '', selectedItems: [], emptyText: '', prefixCls: '', extraFilter: false, searchPlaceholder: '' }; exports.default = Popup;