react-cqtoolbox
Version:
[![Travis][build-badge]][build] [![npm package][npm-badge]][npm] [![Coveralls][coveralls-badge]][coveralls]
202 lines (163 loc) • 7.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.autocompleteFactory = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _jsxFileName = '/Users/chenyutian0510/Documents/dev-js/chuangqi/react-cqtoolbox/components/autocomplete/Autocomplete.js';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _pureRender = require('../decorator/pureRender.js');
var _pureRender2 = _interopRequireDefault(_pureRender);
var _clamp = require('ramda/src/clamp');
var _clamp2 = _interopRequireDefault(_clamp);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var factory = function factory(Trigger, Input, Menu, MenuItem) {
var _class, _temp2;
var Autocomplete = (_temp2 = _class = function (_React$Component) {
_inherits(Autocomplete, _React$Component);
function Autocomplete() {
var _ref,
_this2 = this;
var _temp, _this, _ret;
_classCallCheck(this, Autocomplete);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Autocomplete.__proto__ || Object.getPrototypeOf(Autocomplete)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
open: false,
selectedItem: -1
}, _this.getMenus = function (list) {
return _react2.default.createElement(
Menu,
{
__source: {
fileName: _jsxFileName,
lineNumber: 66
},
__self: _this2
},
list.map(_this.getMenu)
);
}, _this.getMenu = function (item, index) {
var theme = _this.props.theme;
var itemTypes = {
'string': item,
'object': item.label
};
return _react2.default.createElement(
MenuItem,
{
selected: _this.state.selectedItem === index,
theme: theme,
key: itemTypes[typeof item === 'undefined' ? 'undefined' : _typeof(item)],
onClick: _this.handleMenuItemClick(item), __source: {
fileName: _jsxFileName,
lineNumber: 81
},
__self: _this2
},
itemTypes[typeof item === 'undefined' ? 'undefined' : _typeof(item)]
);
}, _this.handleInputKeyDown = function (event) {
var dataSource = _this.props.dataSource;
var selectedItem = _this.state.selectedItem;
// 按回车
if (event.which === 13 && selectedItem !== -1) {
_this.handleMenuItemClick(dataSource[selectedItem])();
}
}, _this.handleInputKeyUp = function (event) {
var dataSource = _this.props.dataSource;
// 按上下键
if ([40, 38].indexOf(event.which) !== -1) {
var selectRange = (0, _clamp2.default)(0, dataSource.length - 1);
var _selectedItem = selectRange(_this.state.selectedItem + (event.which === 40 ? +1 : -1));
_this.setState({ selectedItem: _selectedItem });
}
}, _this.handleMenuItemClick = function (item) {
return function () {
_this.closeMenu();
_this.props.onSelect(item);
};
}, _this.closeMenu = function () {
_this.setState({ open: false, selectedItem: -1 });
}, _this.toggleMenu = function () {
_this.setState({
open: _this.props.dataSource.length > 0 && !_this.state.open,
selectedItem: -1
});
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Autocomplete, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps, nextState) {
this.setState({
open: nextProps.dataSource.length > 0 && nextProps.dataSource !== this.props.dataSource
});
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
children = _props.children,
align = _props.align,
dataSource = _props.dataSource,
onChange = _props.onChange,
value = _props.value,
defaultValue = _props.defaultValue;
var state = this.state;
var menu = this.getMenus(dataSource);
var child = children && _react2.default.isValidElement(children) ? _react2.default.Children.only(children) : _react2.default.createElement(Input, {
__source: {
fileName: _jsxFileName,
lineNumber: 143
},
__self: this
});
var inputProps = {
onKeyDown: this.handleInputKeyDown,
onKeyUp: this.handleInputKeyUp,
onChange: onChange,
defaultValue: defaultValue,
value: value
};
var inputElement = _react2.default.cloneElement(child, inputProps);
return _react2.default.createElement(
Trigger,
{
popupAlign: align,
matchTargetWidth: true,
popupVisible: state.open,
onPopupVisibleChange: this.toggleMenu,
popup: menu, __source: {
fileName: _jsxFileName,
lineNumber: 159
},
__self: this
},
inputElement
);
}
}]);
return Autocomplete;
}(_react2.default.Component), _class.defaultProps = {
onChange: function onChange() {
return void 0;
},
onSelect: function onSelect() {
return void 0;
},
dataSource: [],
align: {
points: ['tl', 'bl'],
offset: [0, 10]
}
}, _temp2);
// CHANGED : every time render will update prop of popup and children.
return (0, _pureRender2.default)(Autocomplete);
};
exports.autocompleteFactory = factory;