UNPKG

boldr-ui

Version:

UI components for Boldr

454 lines (384 loc) 14.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); 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 _assign = require('lodash/assign'); var _assign2 = _interopRequireDefault(_assign); var _omit = require('lodash/omit'); var _omit2 = _interopRequireDefault(_omit); var _cloneDeep = require('lodash/cloneDeep'); var _cloneDeep2 = _interopRequireDefault(_cloneDeep); var _isEqual = require('lodash/isEqual'); var _isEqual2 = _interopRequireDefault(_isEqual); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _noop = require('lodash/noop'); var _noop2 = _interopRequireDefault(_noop); var _Index = require('./triggers/Index'); var _Index2 = _interopRequireDefault(_Index); var _Popup = require('./Popup'); var _Popup2 = _interopRequireDefault(_Popup); var _SimpleTrigger = require('./triggers/SimpleTrigger'); var _SimpleTrigger2 = _interopRequireDefault(_SimpleTrigger); var _SelectTrigger = require('./triggers/SelectTrigger'); var _SelectTrigger2 = _interopRequireDefault(_SelectTrigger); var _InputTrigger = require('./triggers/InputTrigger'); var _InputTrigger2 = _interopRequireDefault(_InputTrigger); var _TagsTrigger = require('./triggers/TagsTrigger'); var _TagsTrigger2 = _interopRequireDefault(_TagsTrigger); 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: { data: require('prop-types').arrayOf(require('prop-types').any), prefix: require('prop-types').string, className: require('prop-types').string, disabled: require('prop-types').bool, placeholder: require('prop-types').string, searchPlaceholder: require('prop-types').string, emptyText: require('prop-types').string, selectedItem: require('prop-types').shape({ value: require('prop-types').any, text: require('prop-types').string }), trigger: require('prop-types').func, optionValue: require('prop-types').string, optionText: require('prop-types').string, onChange: require('prop-types').func, onDelete: require('prop-types').func, filter: require('prop-types').func, onAsyncFilter: require('prop-types').func, onEmptySelected: require('prop-types').func, onOpen: require('prop-types').func } }); var Select = function (_Component) { (0, _inherits3.default)(Select, _Component); function Select(props) { (0, _classCallCheck3.default)(this, Select); var _this = (0, _possibleConstructorReturn3.default)(this, (Select.__proto__ || (0, _getPrototypeOf2.default)(Select)).call(this, props)); var data = []; /** * Takes arrays of strings or objects * @return {object} */ if (props.children) { var children = props.children; if (!(0, _isArray2.default)(children)) { children = [children]; } data = children.map(function (item) { var value = item.props.value; value = typeof value === 'undefined' ? item : value; return (0, _assign2.default)({}, item.props, { value: value, text: item.props.children }); }); } if (props.data) { data = props.data; } if (props.simple) { _this.trigger = _SimpleTrigger2.default; } else if (props.search) { _this.trigger = _InputTrigger2.default; } else if (props.tags) { _this.trigger = _TagsTrigger2.default; } else { _this.trigger = props.trigger; } _this.state = (0, _assign2.default)({ selectedItems: [] }, props); _this.formateData(data); _this.blurHandler = _this.blurHandler.bind(_this); _this.keyupHandler = _this.keyupHandler.bind(_this); _this.triggerChangeHandler = _this.triggerChangeHandler.bind(_this); _this.triggerDeleteHandler = _this.triggerDeleteHandler.bind(_this); _this.optionChangedHandler = _this.optionChangedHandler.bind(_this); _this.popupFocusHandler = _this.popupFocusHandler.bind(_this); _this.popupBlurHandler = _this.popupBlurHandler.bind(_this); return _this; } (0, _createClass3.default)(Select, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { var open = this.state.open; open = nextProps.open || this.focus; var nextState = (0, _extends3.default)({}, nextProps, { open: open }); var selectedItems = []; if ('' + nextProps.value || '' + nextProps.index) { this.state.selectedItem = this.props.selectedItem; } this.formateData(nextProps.data, nextProps); if ((0, _isArray2.default)(nextProps.value)) { this.sourceData.forEach(function (item) { if (nextProps.value.indexOf(item.value) > -1) { selectedItems.push(item); } }); } nextState.selectedItem = this.state.selectedItem; nextState.selectedItems = selectedItems; this.setState(nextState); } }, { key: 'formateData', value: function formateData(data, props) { var selectedItems = []; data = data || this.sourceData; props = props || this.props; var that = this; this.sourceData = (0, _cloneDeep2.default)(data).map(function (item) { var result = {}; if ((typeof item === 'undefined' ? 'undefined' : (0, _typeof3.default)(item)) === 'object') { result.value = item[props.optionValue]; result.text = item[props.optionText]; result = (0, _extends3.default)({}, item, result); } else { result.value = item; result.text = item; } return result; }).map(function (item, index) { item.cid = '' + index; if ((0, _isArray2.default)(props.value) && props.value.indexOf(item.value) > -1) { selectedItems.push(item); } else if ((0, _typeof3.default)(props.value) === 'object' && (0, _isEqual2.default)(props.value, item.value)) { that.state.selectedItem = item; } else if (typeof props.value !== 'undefined' && (0, _typeof3.default)(props.value) !== 'object' && '' + item.value === '' + props.value || props.index !== 'undefined' && '' + index === '' + props.index) { that.state.selectedItem = item; } return item; }); this.state.selectedItems = selectedItems; return this.sourceData; } }, { key: 'triggerChangeHandler', value: function triggerChangeHandler(data) { if (data.open) { this.props.onOpen(); } this.setState(data); } }, { key: 'triggerDeleteHandler', value: function triggerDeleteHandler(data) { var _this2 = this; var selectedItems = this.state.selectedItems; selectedItems = selectedItems.filter(function (item) { return item.cid !== data.cid; }); this.setState({ selectedItems: selectedItems }, function () { _this2.props.onDelete(data); }); } }, { key: 'optionChangedHandler', value: function optionChangedHandler(ev, selectedItem) { var result = {}; ev = ev || { preventDefault: _noop2.default, stopPropagation: _noop2.default }; var _props = this.props, onEmptySelected = _props.onEmptySelected, optionValue = _props.optionValue, optionText = _props.optionText, tags = _props.tags, onChange = _props.onChange; var selectedItems = this.state.selectedItems; if (!selectedItem) { onEmptySelected(ev); return; } var args = (0, _omit2.default)(selectedItem, ['cid']); result[optionValue] = selectedItem.value; result[optionText] = selectedItem.text; var data = (0, _extends3.default)({}, args, result); if (tags) { if (!selectedItems.some(function (item) { return item.cid === selectedItem.cid; })) { selectedItems.push(selectedItem); } } onChange({ target: (0, _extends3.default)({}, this.props, { type: tags ? 'select-multiple' : 'select-one', value: selectedItem.value }), preventDefault: function preventDefault() { ev.preventDefault(); }, stopPropagation: function stopPropagation() { ev.stopPropagation(); } }, data); this.setState({ keyword: null, selectedItems: selectedItems, selectedItem: selectedItem, open: this.focus }); } }, { key: 'popupFocusHandler', value: function popupFocusHandler() { this.focus = this.state.open; } }, { key: 'popupBlurHandler', value: function popupBlurHandler() { this.focus = false; } }, { key: 'blurHandler', value: function blurHandler() { var _this3 = this; var that = this; setTimeout(function () { that.setState({ open: _this3.focus }); }, 0); } }, { key: 'keyupHandler', value: function keyupHandler(ev) { var code = ev.keyCode; if (!this.state.open) return false; if (code === _constants.KEY_ESC) { this.setState({ open: false }); } } }, { key: 'render', value: function render() { var _props2 = this.props, placeholder = _props2.placeholder, className = _props2.className, disabled = _props2.disabled, emptyText = _props2.emptyText, _props2$filter = _props2.filter, filter = _props2$filter === undefined ? this.props.onFilter : _props2$filter, onAsyncFilter = _props2.onAsyncFilter, searchPlaceholder = _props2.searchPlaceholder; var _state = this.state, selectedItems = _state.selectedItems, _state$selectedItem = _state.selectedItem, selectedItem = _state$selectedItem === undefined ? {} : _state$selectedItem, extraFilter = _state.extraFilter, open = _state.open, _state$keyword = _state.keyword, keyword = _state$keyword === undefined ? null : _state$keyword; var _selectedItem$cid = selectedItem.cid, cid = _selectedItem$cid === undefined ? '' : _selectedItem$cid; var openCls = open && !disabled ? 'open' : ''; var disabledCls = disabled ? 'disabled' : ''; var prefixCls = this.props.prefix + '-select'; return _react2.default.createElement( 'div', { tabIndex: '0', className: prefixCls + ' ' + className + ' ' + openCls + ' ' + disabledCls, onBlur: this.blurHandler, onKeyDown: this.keyupHandler }, _react2.default.createElement(_Index2.default, (0, _extends3.default)({ prefixCls: prefixCls, trigger: this.trigger, placeholder: placeholder, selectedItems: selectedItems, open: open, keyword: keyword }, selectedItem, { onChange: this.triggerChangeHandler, onDelete: this.triggerDeleteHandler })), open ? _react2.default.createElement(_Popup2.default, { cid: cid, prefixCls: prefixCls, data: this.sourceData, selectedItems: selectedItems, extraFilter: extraFilter, searchPlaceholder: searchPlaceholder, emptyText: emptyText, keyword: keyword, filter: filter, onAsyncFilter: onAsyncFilter, onChange: this.optionChangedHandler, onFocus: this.popupFocusHandler, onBlur: this.popupBlurHandler }) : '' ); } }]); return Select; }(_react.Component); Select.propTypes = process.env.NODE_ENV !== "production" ? { data: require('prop-types').arrayOf(require('prop-types').any), prefix: require('prop-types').string, className: require('prop-types').string, disabled: require('prop-types').bool, placeholder: require('prop-types').string, searchPlaceholder: require('prop-types').string, emptyText: require('prop-types').string, selectedItem: require('prop-types').shape({ value: require('prop-types').any, text: require('prop-types').string }), trigger: require('prop-types').func, optionValue: require('prop-types').string, optionText: require('prop-types').string, onChange: require('prop-types').func, onDelete: require('prop-types').func, filter: require('prop-types').func, onAsyncFilter: require('prop-types').func, onEmptySelected: require('prop-types').func, onOpen: require('prop-types').func } : {}; Select.defaultProps = { prefix: 'boldrui', disabled: false, className: '', trigger: _SelectTrigger2.default, open: false, placeholder: 'Choose an option', searchPlaceholder: '', emptyText: 'No results', selectedItem: { value: '', text: '' }, selectedItems: [], optionValue: 'value', optionText: 'text', onChange: _noop2.default, onDelete: _noop2.default, onEmptySelected: _noop2.default, onOpen: _noop2.default }; exports.default = Select;