UNPKG

yqcloud-ui

Version:

An enterprise-class UI design language and React-based implementation

375 lines (312 loc) 12.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); 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 _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _trigger = require('../trigger'); var _trigger2 = _interopRequireDefault(_trigger); var _tree = require('../tree'); var _tree2 = _interopRequireDefault(_tree); var _util = require('./util'); var _toArray = require('../util/Children/toArray'); var _toArray2 = _interopRequireDefault(_toArray); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var BUILT_IN_PLACEMENTS = { bottomLeft: { points: ['tl', 'bl'], offset: [0, 4], overflow: { adjustX: 0, adjustY: 1 } }, topLeft: { points: ['bl', 'tl'], offset: [0, -4], overflow: { adjustX: 0, adjustY: 1 } } }; var SelectTrigger = function (_Component) { (0, _inherits3['default'])(SelectTrigger, _Component); function SelectTrigger() { var _temp, _this, _ret; (0, _classCallCheck3['default'])(this, SelectTrigger); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3['default'])(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.state = { _expandedKeys: [], fireOnExpand: false, dropdownWidth: null }, _this.onExpand = function (expandedKeys) { // rerender _this.setState({ _expandedKeys: expandedKeys, fireOnExpand: true }, function () { // Fix https://github.com/ant-design/ant-design/issues/5689 if (_this.trigger && _this.trigger.forcePopupAlign) { _this.trigger.forcePopupAlign(); } }); }, _this.highlightTreeNode = function (treeNode) { var props = _this.props; var filterVal = treeNode.props[(0, _util.labelCompatible)(props.treeNodeFilterProp)]; if (typeof filterVal === 'string') { return props.inputValue && filterVal.indexOf(props.inputValue) > -1; } return false; }, _this.filterTreeNode = function (input, child) { if (!input) { return true; } var filterTreeNode = _this.props.filterTreeNode; if (!filterTreeNode) { return true; } if (child.props.disabled) { return false; } return filterTreeNode.call(_this, input, child); }, _temp), (0, _possibleConstructorReturn3['default'])(_this, _ret); } SelectTrigger.prototype.componentDidMount = function componentDidMount() { this.setDropdownWidth(); }; SelectTrigger.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if (nextProps.inputValue && nextProps.inputValue !== this.props.inputValue) { // set autoExpandParent to true this.setState({ _expandedKeys: [], fireOnExpand: false }); } }; SelectTrigger.prototype.componentDidUpdate = function componentDidUpdate() { this.setDropdownWidth(); }; SelectTrigger.prototype.setDropdownWidth = function setDropdownWidth() { var width = _reactDom2['default'].findDOMNode(this).offsetWidth; if (width !== this.state.dropdownWidth) { this.setState({ dropdownWidth: width }); } }; SelectTrigger.prototype.getPopupEleRefs = function getPopupEleRefs() { return this.popupEle; }; SelectTrigger.prototype.getPopupDOMNode = function getPopupDOMNode() { return this.trigger.getPopupDomNode(); }; SelectTrigger.prototype.getDropdownTransitionName = function getDropdownTransitionName() { var props = this.props; var transitionName = props.transitionName; if (!transitionName && props.animation) { transitionName = this.getDropdownPrefixCls() + '-' + props.animation; } return transitionName; }; SelectTrigger.prototype.getDropdownPrefixCls = function getDropdownPrefixCls() { return this.props.prefixCls + '-dropdown'; }; SelectTrigger.prototype.processTreeNode = function processTreeNode(treeNodes) { var _this2 = this; var filterPoss = []; this._expandedKeys = []; (0, _util.loopAllChildren)(treeNodes, function (child, index, pos) { if (_this2.filterTreeNode(_this2.props.inputValue, child)) { filterPoss.push(pos); _this2._expandedKeys.push(child.key); } }); // Include the filtered nodes's ancestral nodes. var processedPoss = []; filterPoss.forEach(function (pos) { var arr = pos.split('-'); arr.reduce(function (pre, cur) { var res = pre + '-' + cur; if (processedPoss.indexOf(res) < 0) { processedPoss.push(res); } return res; }); }); var filterNodesPositions = []; (0, _util.loopAllChildren)(treeNodes, function (child, index, pos) { if (processedPoss.indexOf(pos) > -1) { filterNodesPositions.push({ node: child, pos: pos }); } }); var hierarchyNodes = (0, _util.flatToHierarchy)(filterNodesPositions); var recursive = function recursive(children) { return children.map(function (child) { if (child.children) { return _react2['default'].cloneElement(child.node, {}, recursive(child.children)); } return child.node; }); }; return recursive(hierarchyNodes); }; SelectTrigger.prototype.renderTree = function renderTree(keys, halfCheckedKeys, newTreeNodes, multiple) { var props = this.props; var trProps = { multiple: multiple, prefixCls: props.prefixCls + '-tree', showIcon: props.treeIcon, showLine: props.treeLine, defaultExpandAll: props.treeDefaultExpandAll, defaultExpandedKeys: props.treeDefaultExpandedKeys, filterTreeNode: this.highlightTreeNode }; if (props.treeCheckable) { trProps.selectable = false; trProps.checkable = props.treeCheckable; trProps.onCheck = props.onSelect; trProps.checkStrictly = props.treeCheckStrictly; if (props.inputValue) { // enable checkStrictly when search tree. trProps.checkStrictly = true; } else { trProps._treeNodesStates = props._treeNodesStates; } if (trProps.treeCheckStrictly && halfCheckedKeys.length) { trProps.checkedKeys = { checked: keys, halfChecked: halfCheckedKeys }; } else { trProps.checkedKeys = keys; } } else { trProps.selectedKeys = keys; trProps.onSelect = props.onSelect; } // expand keys if (!trProps.defaultExpandAll && !trProps.defaultExpandedKeys && !props.loadData) { trProps.expandedKeys = keys; } trProps.autoExpandParent = true; trProps.onExpand = this.onExpand; if (this._expandedKeys && this._expandedKeys.length) { trProps.expandedKeys = this._expandedKeys; } if (this.state.fireOnExpand) { trProps.expandedKeys = this.state._expandedKeys; trProps.autoExpandParent = false; } // async loadData if (props.loadData) { trProps.loadData = props.loadData; } return _react2['default'].createElement(_tree2['default'], (0, _extends3['default'])({ ref: (0, _util.saveRef)(this, 'popupEle') }, trProps), newTreeNodes); }; SelectTrigger.prototype.render = function render() { var _popupClassName; var props = this.props; var multiple = props.multiple; var dropdownPrefixCls = this.getDropdownPrefixCls(); var popupClassName = (_popupClassName = {}, (0, _defineProperty3['default'])(_popupClassName, props.dropdownClassName, !!props.dropdownClassName), (0, _defineProperty3['default'])(_popupClassName, dropdownPrefixCls + '--' + (multiple ? 'multiple' : 'single'), 1), _popupClassName); var visible = props.visible; var search = multiple || !props.showSearch ? null : _react2['default'].createElement('span', { className: dropdownPrefixCls + '-search' }, props.inputElement); var recursive = function recursive(children) { // Note: if use `React.Children.map`, the node's key will be modified. return (0, _toArray2['default'])(children).map(function handler(child) { // eslint-disable-line if (!child) { return null; } if (child && child.props.children) { // null or String has no Prop return _react2['default'].createElement(_tree.TreeNode, (0, _extends3['default'])({}, child.props, { key: child.key }), recursive(child.props.children)); } return _react2['default'].createElement(_tree.TreeNode, (0, _extends3['default'])({}, child.props, { key: child.key })); }); }; // const s = Date.now(); var treeNodes = void 0; if (props._cachetreeData && this.treeNodes) { treeNodes = this.treeNodes; } else { treeNodes = recursive(props.treeData || props.treeNodes); this.treeNodes = treeNodes; } // console.log(Date.now()-s); if (props.inputValue) { treeNodes = this.processTreeNode(treeNodes); } var keys = []; var halfCheckedKeys = []; (0, _util.loopAllChildren)(treeNodes, function (child) { if (props.value.some(function (item) { return item.value === (0, _util.getValuePropValue)(child); })) { keys.push(child.key); } if (props.halfCheckedValues && props.halfCheckedValues.some(function (item) { return item.value === (0, _util.getValuePropValue)(child); })) { halfCheckedKeys.push(child.key); } }); var notFoundContent = void 0; if (!treeNodes.length) { if (props.notFoundContent) { notFoundContent = _react2['default'].createElement('span', { className: props.prefixCls + '-not-found' }, props.notFoundContent); } else if (!search) { visible = false; } } var popupElement = _react2['default'].createElement('div', null, search, notFoundContent || this.renderTree(keys, halfCheckedKeys, treeNodes, multiple)); var popupStyle = (0, _extends3['default'])({}, props.dropdownStyle); var widthProp = props.dropdownMatchSelectWidth ? 'width' : 'minWidth'; if (this.state.dropdownWidth) { popupStyle[widthProp] = this.state.dropdownWidth + 'px'; } return _react2['default'].createElement(_trigger2['default'], { action: props.disabled ? [] : ['click'], ref: (0, _util.saveRef)(this, 'trigger'), popupPlacement: 'bottomLeft', builtinPlacements: BUILT_IN_PLACEMENTS, popupAlign: props.dropdownPopupAlign, prefixCls: dropdownPrefixCls, popupTransitionName: this.getDropdownTransitionName(), onPopupVisibleChange: props.onDropdownVisibleChange, popup: popupElement, popupVisible: visible, getPopupContainer: props.getPopupContainer, popupClassName: (0, _classnames2['default'])(popupClassName), popupStyle: popupStyle }, this.props.children); }; return SelectTrigger; }(_react.Component); SelectTrigger.propTypes = { dropdownMatchSelectWidth: _propTypes2['default'].bool, dropdownPopupAlign: _propTypes2['default'].object, visible: _propTypes2['default'].bool, filterTreeNode: _propTypes2['default'].any, treeNodes: _propTypes2['default'].any, inputValue: _propTypes2['default'].string, prefixCls: _propTypes2['default'].string, popupClassName: _propTypes2['default'].string, children: _propTypes2['default'].any }; exports['default'] = SelectTrigger; module.exports = exports['default'];