UNPKG

choerodon-ui

Version:

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

387 lines (327 loc) 11.8 kB
import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _extends from "@babel/runtime/helpers/extends"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/inherits"; import _createSuper from "@babel/runtime/helpers/createSuper"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import React, { cloneElement, Component } from 'react'; import ReactDOM from 'react-dom'; import classnames from 'classnames'; import Trigger from '../trigger'; import Tree, { TreeNode } from '../../tree'; import { flatToHierarchy, getValuePropValue, labelCompatible, loopAllChildren, saveRef } from './util'; import toArray from '../util/Children/toArray'; 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 = /*#__PURE__*/function (_Component) { _inherits(SelectTrigger, _Component); var _super = _createSuper(SelectTrigger); function SelectTrigger() { var _this; _classCallCheck(this, SelectTrigger); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); _defineProperty(_assertThisInitialized(_this), "state", { _expandedKeys: [], fireOnExpand: false, dropdownWidth: null }); _defineProperty(_assertThisInitialized(_this), "onExpand", function (expandedKeys) { // rerender _this.setState({ _expandedKeys: expandedKeys, fireOnExpand: true }, function () { if (_this.trigger && _this.trigger.forcePopupAlign) { _this.trigger.forcePopupAlign(); } }); }); _defineProperty(_assertThisInitialized(_this), "highlightTreeNode", function (treeNode) { var props = _this.props; var filterVal = treeNode.props[labelCompatible(props.treeNodeFilterProp)]; if (typeof filterVal === 'string') { return props.inputValue && filterVal.indexOf(props.inputValue) > -1; } return false; }); _defineProperty(_assertThisInitialized(_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(_assertThisInitialized(_this), input, child); }); return _this; } _createClass(SelectTrigger, [{ key: "componentDidMount", value: function componentDidMount() { this.setDropdownWidth(); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { if (nextProps.inputValue && nextProps.inputValue !== this.props.inputValue) { // set autoExpandParent to true this.setState({ _expandedKeys: [], fireOnExpand: false }); } } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.setDropdownWidth(); } }, { key: "setDropdownWidth", value: function setDropdownWidth() { var width = ReactDOM.findDOMNode(this).offsetWidth; if (width !== this.state.dropdownWidth) { this.setState({ dropdownWidth: width }); } } }, { key: "getPopupEleRefs", value: function getPopupEleRefs() { return this.popupEle; } }, { key: "getPopupDOMNode", value: function getPopupDOMNode() { return this.trigger.getPopupDomNode(); } }, { key: "getDropdownTransitionName", value: function getDropdownTransitionName() { var props = this.props; var transitionName = props.transitionName; if (!transitionName && props.animation) { transitionName = "".concat(this.getDropdownPrefixCls(), "-").concat(props.animation); } return transitionName; } }, { key: "getDropdownPrefixCls", value: function getDropdownPrefixCls() { return "".concat(this.props.prefixCls, "-dropdown"); } }, { key: "processTreeNode", value: function processTreeNode(treeNodes) { var _this2 = this; var filterPoss = []; this._expandedKeys = []; 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 = "".concat(pre, "-").concat(cur); if (processedPoss.indexOf(res) < 0) { processedPoss.push(res); } return res; }); }); var filterNodesPositions = []; loopAllChildren(treeNodes, function (child, index, pos) { if (processedPoss.indexOf(pos) > -1) { filterNodesPositions.push({ node: child, pos: pos }); } }); var hierarchyNodes = flatToHierarchy(filterNodesPositions); var recursive = function recursive(children) { return children.map(function (child) { if (child.children) { return /*#__PURE__*/cloneElement(child.node, {}, recursive(child.children)); } return child.node; }); }; return recursive(hierarchyNodes); } }, { key: "renderTree", value: function renderTree(keys, halfCheckedKeys, newTreeNodes, multiple) { var props = this.props; var trProps = { multiple: multiple, prefixCls: "".concat(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 /*#__PURE__*/React.createElement(Tree, _extends({ ref: saveRef(this, 'popupEle') }, trProps), newTreeNodes); } }, { key: "render", value: function render() { var _popupClassName; var props = this.props; var multiple = props.multiple; var dropdownPrefixCls = this.getDropdownPrefixCls(); var popupClassName = (_popupClassName = {}, _defineProperty(_popupClassName, props.dropdownClassName, !!props.dropdownClassName), _defineProperty(_popupClassName, "".concat(dropdownPrefixCls, "--").concat(multiple ? 'multiple' : 'single'), 1), _popupClassName); var visible = props.visible; var search = multiple || !props.showSearch ? null : /*#__PURE__*/React.createElement("span", { className: "".concat(dropdownPrefixCls, "-search") }, props.inputElement); var recursive = function recursive(children) { // Note: if use `React.Children.map`, the node's key will be modified. return toArray(children).map(function handler(child) { // eslint-disable-line if (!child) { return null; } if (child && child.props.children) { // null or String has no Prop return /*#__PURE__*/React.createElement(TreeNode, _extends({}, child.props, { key: child.key }), recursive(child.props.children)); } return /*#__PURE__*/React.createElement(TreeNode, _extends({}, child.props, { key: child.key })); }); }; // const s = Date.now(); var treeNodes; 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 = []; loopAllChildren(treeNodes, function (child) { if (props.value.some(function (item) { return item.value === getValuePropValue(child); })) { keys.push(child.key); } if (props.halfCheckedValues && props.halfCheckedValues.some(function (item) { return item.value === getValuePropValue(child); })) { halfCheckedKeys.push(child.key); } }); var notFoundContent; if (!treeNodes.length) { if (props.notFoundContent) { notFoundContent = /*#__PURE__*/React.createElement("span", { className: "".concat(props.prefixCls, "-not-found") }, props.notFoundContent); } else if (!search) { visible = false; } } var popupElement = /*#__PURE__*/React.createElement("div", null, search, notFoundContent || this.renderTree(keys, halfCheckedKeys, treeNodes, multiple)); var popupStyle = _objectSpread({}, props.dropdownStyle); var widthProp = props.dropdownMatchSelectWidth ? 'width' : 'minWidth'; if (this.state.dropdownWidth) { popupStyle[widthProp] = "".concat(this.state.dropdownWidth, "px"); } return /*#__PURE__*/React.createElement(Trigger, { action: props.disabled ? [] : ['click'], ref: 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: classnames(popupClassName), popupStyle: popupStyle }, this.props.children); } }]); return SelectTrigger; }(Component); export default SelectTrigger; //# sourceMappingURL=SelectTrigger.js.map