UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

1,137 lines (960 loc) 38 kB
'use strict'; exports.__esModule = true; var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); 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 _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _class, _temp; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactLifecyclesCompat = require('react-lifecycles-compat'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _select = require('../select'); var _select2 = _interopRequireDefault(_select); var _tree = require('../tree'); var _tree2 = _interopRequireDefault(_tree); var _util = require('../tree/view/util'); var _util2 = require('../util'); var _zhCn = require('../locale/zh-cn'); var _zhCn2 = _interopRequireDefault(_zhCn); var _util3 = require('../select/util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var noop = function noop() {}; var TreeNode = _tree2.default.Node; var bindCtx = _util2.func.bindCtx; var flatDataSource = function flatDataSource(props) { var _k2n = {}; var _p2n = {}; var _v2n = {}; if ('dataSource' in props) { var loop = function loop(data) { var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '0'; return data.map(function (item, index) { var value = item.value, children = item.children; var pos = prefix + '-' + index; var key = item.key || pos; var newItem = (0, _extends3.default)({}, item, { key: key, pos: pos }); if (children && children.length) { newItem.children = loop(children, pos); } _k2n[key] = _p2n[pos] = _v2n[value] = newItem; return newItem; }); }; loop(props.dataSource); } else if ('children' in props) { var _loop = function _loop(children) { var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '0'; return _react.Children.map(children, function (node, index) { if (!_react2.default.isValidElement(node)) { return; } var _node$props = node.props, value = _node$props.value, children = _node$props.children; var pos = prefix + '-' + index; var key = node.key || pos; var newItem = (0, _extends3.default)({}, node.props, { key: key, pos: pos }); if (children && _react.Children.count(children)) { newItem.children = _loop(children, pos); } _k2n[key] = _p2n[pos] = _v2n[value] = newItem; return newItem; }); }; _loop(props.children); } return { _k2n: _k2n, _p2n: _p2n, _v2n: _v2n }; }; var isSearched = function isSearched(label, searchedValue) { var labelString = ''; searchedValue = String(searchedValue); var loop = function loop(arg) { if ((0, _react.isValidElement)(arg) && arg.props.children) { _react.Children.forEach(arg.props.children, loop); } else { labelString += arg; } }; loop(label); if (labelString.length >= searchedValue.length && labelString.toLowerCase().indexOf(searchedValue.toLowerCase()) > -1) { return true; } return false; }; var getSearchKeys = function getSearchKeys(searchedValue, _k2n, _p2n) { var searchedKeys = []; var retainedKeys = []; Object.keys(_k2n).forEach(function (k) { var _k2n$k = _k2n[k], label = _k2n$k.label, pos = _k2n$k.pos; if (isSearched(label, searchedValue)) { searchedKeys.push(k); var posArr = pos.split('-'); posArr.forEach(function (n, i) { if (i > 0) { var p = posArr.slice(0, i + 1).join('-'); var kk = _p2n[p].key; if (retainedKeys.indexOf(kk) === -1) { retainedKeys.push(kk); } } }); } }); return { searchedKeys: searchedKeys, retainedKeys: retainedKeys }; }; /** * TreeSelect */ var TreeSelect = (_temp = _class = function (_Component) { (0, _inherits3.default)(TreeSelect, _Component); function TreeSelect(props, context) { (0, _classCallCheck3.default)(this, TreeSelect); var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props, context)); var defaultVisible = props.defaultVisible, visible = props.visible, defaultValue = props.defaultValue, value = props.value; _this.state = (0, _extends3.default)({ visible: typeof visible === 'undefined' ? defaultVisible : visible, value: (0, _util.normalizeToArray)(typeof value === 'undefined' ? defaultValue : value), searchedValue: '', expandedKeys: [], searchedKeys: [], retainedKeys: [], autoExpandParent: false, // map of value => item, includes value not exist in dataSource mapValueDS: {} }, flatDataSource(props)); // init value/mapValueDS when defaultValue is not undefined if (_this.state.value !== undefined) { _this.state.mapValueDS = (0, _util3.getValueDataSource)(_this.state.value, _this.state.mapValueDS).mapValueDS; _this.state.value = _this.state.value.map(function (v) { return (0, _util3.valueToSelectKey)(v); }); } bindCtx(_this, ['handleSelect', 'handleCheck', 'handleSearch', 'handleSearchClear', 'handleVisibleChange', 'handleChange', 'handleRemove', 'handleExpand', 'handleKeyDown', 'saveTreeRef', 'saveSelectRef', 'renderMaxTagPlaceholder']); return _this; } TreeSelect.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { var st = {}; if ('value' in props) { var valueArray = (0, _util.normalizeToArray)(props.value); // convert value to string[] st.value = valueArray.map(function (v) { return (0, _util3.valueToSelectKey)(v); }); // re-calculate map st.mapValueDS = (0, _util3.getValueDataSource)(props.value, state.mapValueDS).mapValueDS; } if ('visible' in props) { st.visible = props.visible; } var _flatDataSource = flatDataSource(props), _k2n = _flatDataSource._k2n, _p2n = _flatDataSource._p2n, _v2n = _flatDataSource._v2n; if (props.showSearch && state.searchedValue) { var _getSearchKeys = getSearchKeys(state.searchedValue, _k2n, _p2n), searchedKeys = _getSearchKeys.searchedKeys, retainedKeys = _getSearchKeys.retainedKeys; st.searchedKeys = searchedKeys; st.retainedKeys = retainedKeys; } return (0, _extends3.default)({}, st, { _k2n: _k2n, _p2n: _p2n, _v2n: _v2n }); }; TreeSelect.prototype.getKeysByValue = function getKeysByValue(value) { var _this2 = this; return value.reduce(function (ret, v) { var k = _this2.state._v2n[v] && _this2.state._v2n[v].key; if (k) { ret.push(k); } return ret; }, []); }; TreeSelect.prototype.getValueByKeys = function getValueByKeys(keys) { var _this3 = this; return keys.map(function (k) { return _this3.state._k2n[k].value; }); }; TreeSelect.prototype.getValueForSelect = function getValueForSelect(value) { var treeCheckedStrategy = this.props.treeCheckedStrategy; var nonExistentValueKeys = this.getNonExistentValueKeys(); var keys = this.getKeysByValue(value); keys = (0, _util.getAllCheckedKeys)(keys, this.state._k2n, this.state._p2n); switch (treeCheckedStrategy) { case 'parent': keys = (0, _util.filterChildKey)(keys, this.state._k2n, this.state._p2n); break; case 'child': keys = (0, _util.filterParentKey)(keys, this.state._k2n, this.state._p2n); break; default: break; } var values = this.getValueByKeys(keys); return [].concat(values, nonExistentValueKeys); }; TreeSelect.prototype.getData = function getData(value, forSelect) { var _this4 = this; var preserveNonExistentValue = this.props.preserveNonExistentValue; var mapValueDS = this.state.mapValueDS; var ret = value.reduce(function (ret, v) { var k = _this4.state._v2n[v] && _this4.state._v2n[v].key; if (k) { var _state$_k2n$k = _this4.state._k2n[k], label = _state$_k2n$k.label, pos = _state$_k2n$k.pos, disabled = _state$_k2n$k.disabled, checkboxDisabled = _state$_k2n$k.checkboxDisabled; var d = { value: v, label: label, pos: pos }; if (forSelect) { d.disabled = disabled || checkboxDisabled; } else { d.key = k; } ret.push(d); } else if (preserveNonExistentValue) { // 需要保留 dataSource 中不存在的 value var item = mapValueDS[v]; if (item) { ret.push(item); } } return ret; }, []); return ret; }; TreeSelect.prototype.getNonExistentValues = function getNonExistentValues() { var _this5 = this; var preserveNonExistentValue = this.props.preserveNonExistentValue; var value = this.state.value; if (!preserveNonExistentValue) { return []; } var nonExistentValues = value.filter(function (v) { return !_this5.state._v2n[v]; }); return nonExistentValues; }; TreeSelect.prototype.getNonExistentValueKeys = function getNonExistentValueKeys() { var nonExistentValues = this.getNonExistentValues(); return nonExistentValues.map(function (v) { if ((typeof v === 'undefined' ? 'undefined' : (0, _typeof3.default)(v)) === 'object' && v.hasOwnProperty('value')) { return v.value; } return v; }); }; TreeSelect.prototype.saveTreeRef = function saveTreeRef(ref) { this.tree = ref; }; TreeSelect.prototype.saveSelectRef = function saveSelectRef(ref) { this.select = ref; }; TreeSelect.prototype.handleVisibleChange = function handleVisibleChange(visible, type) { if (!('visible' in this.props)) { this.setState({ visible: visible }); } if (['fromTree', 'keyboard'].indexOf(type) !== -1 && !visible) { this.select.focusInput(); } this.props.onVisibleChange(visible, type); }; TreeSelect.prototype.handleSelect = function handleSelect(selectedKeys, extra) { var _props = this.props, multiple = _props.multiple, onChange = _props.onChange; var selected = extra.selected; if (multiple || selected) { var value = this.getValueByKeys(selectedKeys); var nonExistentValues = this.getNonExistentValues(); value = [].concat(nonExistentValues, value); if (!('value' in this.props)) { this.setState({ value: value }); } if (!multiple) { this.handleVisibleChange(false, 'fromTree'); } var data = this.getData(value); multiple ? onChange(value, data) : onChange(value[0], data[0]); // clear search value manually this.select.handleSearchClear('select'); } else { this.handleVisibleChange(false, 'fromTree'); } }; TreeSelect.prototype.handleCheck = function handleCheck(checkedKeys) { var onChange = this.props.onChange; var value = this.getValueByKeys(checkedKeys); var nonExistentValues = this.getNonExistentValues(); value = [].concat(nonExistentValues, value); if (!('value' in this.props)) { this.setState({ value: value }); } onChange(value, this.getData(value)); // clear search value manually this.select.handleSearchClear('select'); }; TreeSelect.prototype.handleRemove = function handleRemove(removedItem) { var _this6 = this; var removedValue = removedItem.value; var _props2 = this.props, treeCheckable = _props2.treeCheckable, treeCheckStrictly = _props2.treeCheckStrictly, treeCheckedStrategy = _props2.treeCheckedStrategy, onChange = _props2.onChange; var value = void 0; if ( // there's linkage relationship among nodes treeCheckable && !treeCheckStrictly && ['parent', 'all'].indexOf(treeCheckedStrategy) !== -1 && // value exits in datasource this.state._v2n[removedValue]) { var removedPos = this.state._v2n[removedValue].pos; value = this.state.value.filter(function (v) { var p = _this6.state._v2n[v].pos; return !(0, _util.isDescendantOrSelf)(removedPos, p); }); var nums = removedPos.split('-'); for (var i = nums.length; i > 2; i--) { var parentPos = nums.slice(0, i - 1).join('-'); var parentValue = this.state._p2n[parentPos].value; var parentIndex = value.indexOf(parentValue); if (parentIndex > -1) { value.splice(parentIndex, 1); } else { break; } } } else { value = this.state.value.filter(function (v) { return v !== removedValue; }); } if (!('value' in this.props)) { this.setState({ value: value }); } var data = this.getData(value); onChange(value, data); }; TreeSelect.prototype.handleSearch = function handleSearch(searchedValue) { var _state = this.state, _k2n = _state._k2n, _p2n = _state._p2n; var _getSearchKeys2 = getSearchKeys(searchedValue, _k2n, _p2n), searchedKeys = _getSearchKeys2.searchedKeys, retainedKeys = _getSearchKeys2.retainedKeys; this.setState({ searchedValue: searchedValue, expandedKeys: searchedKeys, searchedKeys: searchedKeys, retainedKeys: retainedKeys, autoExpandParent: true }); this.props.onSearch(searchedValue); }; TreeSelect.prototype.handleSearchClear = function handleSearchClear(triggerType) { this.setState({ searchedValue: '', expandedKeys: [] }); this.props.onSearchClear(triggerType); }; TreeSelect.prototype.handleExpand = function handleExpand(expandedKeys) { this.setState({ expandedKeys: expandedKeys, autoExpandParent: false }); }; TreeSelect.prototype.handleKeyDown = function handleKeyDown(e) { var onKeyDown = this.props.onKeyDown; var visible = this.state.visible; if (onKeyDown) { onKeyDown(e); } if (!visible) { return; } switch (e.keyCode) { case _util2.KEYCODE.UP: case _util2.KEYCODE.DOWN: this.tree.setFocusKey(); e.preventDefault(); break; default: break; } }; TreeSelect.prototype.handleChange = function handleChange(value, triggerType) { if (this.props.hasClear && triggerType === 'clear') { if (!('value' in this.props)) { this.setState({ value: [] }); } this.props.onChange(null, null); } }; TreeSelect.prototype.searchNodes = function searchNodes(children) { var _state2 = this.state, searchedKeys = _state2.searchedKeys, retainedKeys = _state2.retainedKeys; var loop = function loop(children) { var retainedNodes = []; _react.Children.forEach(children, function (child) { if (searchedKeys.indexOf(child.key) > -1) { retainedNodes.push(child); } else if (retainedKeys.indexOf(child.key) > -1) { var retainedNode = child.props.children ? (0, _react.cloneElement)(child, {}, loop(child.props.children)) : child; retainedNodes.push(retainedNode); } else { var hideNode = (0, _react.cloneElement)(child, { style: { display: 'none' } }); retainedNodes.push(hideNode); } }); return retainedNodes; }; return loop(children); }; TreeSelect.prototype.createNodesByData = function createNodesByData(data, searching) { var _this7 = this; var _state3 = this.state, searchedKeys = _state3.searchedKeys, retainedKeys = _state3.retainedKeys; var loop = function loop(data, isParentMatched) { var prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0'; var retainedNodes = []; data.forEach(function (item, index) { var children = item.children, others = (0, _objectWithoutProperties3.default)(item, ['children']); var pos = prefix + '-' + index; var key = _this7.state._p2n[pos].key; var addNode = function addNode(isParentMatched, hide) { if (hide) { others.style = { display: 'none' }; } retainedNodes.push(_react2.default.createElement( TreeNode, (0, _extends3.default)({}, others, { key: key }), children && children.length ? loop(children, isParentMatched, pos) : null )); }; if (searching) { if (searchedKeys.indexOf(key) > -1 || isParentMatched) { addNode(true); } else if (retainedKeys.indexOf(key) > -1) { addNode(false); } else { addNode(false, true); } } else { addNode(); } }); return retainedNodes; }; return loop(data, false); }; /*eslint-disable max-statements*/ TreeSelect.prototype.renderPopupContent = function renderPopupContent() { var prefix = this.props.prefix; var treeSelectPrefix = prefix + 'tree-select-'; if (!this.state.visible) { return _react2.default.createElement('div', { className: treeSelectPrefix + 'dropdown' }); } var _props3 = this.props, multiple = _props3.multiple, treeCheckable = _props3.treeCheckable, treeCheckStrictly = _props3.treeCheckStrictly, treeCheckedStrategy = _props3.treeCheckedStrategy, treeDefaultExpandAll = _props3.treeDefaultExpandAll, treeDefaultExpandedKeys = _props3.treeDefaultExpandedKeys, treeLoadData = _props3.treeLoadData, _props3$treeProps = _props3.treeProps, customTreeProps = _props3$treeProps === undefined ? {} : _props3$treeProps, showSearch = _props3.showSearch, dataSource = _props3.dataSource, children = _props3.children, readOnly = _props3.readOnly, notFoundContent = _props3.notFoundContent, useVirtual = _props3.useVirtual; var _state4 = this.state, value = _state4.value, searchedValue = _state4.searchedValue, expandedKeys = _state4.expandedKeys, autoExpandParent = _state4.autoExpandParent, searchedKeys = _state4.searchedKeys; var treeProps = { multiple: multiple, ref: this.saveTreeRef, loadData: treeLoadData, defaultExpandAll: treeDefaultExpandAll, defaultExpandedKeys: treeDefaultExpandedKeys, useVirtual: useVirtual }; // 使用虚拟滚动 设置默认高度 if (useVirtual) { customTreeProps.style = (0, _extends3.default)({ maxHeight: '260px', overflow: 'auto', boxSizing: 'border-box' }, customTreeProps.style); } var keys = this.getKeysByValue(value); if (treeCheckable) { treeProps.checkable = treeCheckable; treeProps.checkStrictly = treeCheckStrictly; treeProps.checkedStrategy = treeCheckStrictly ? 'all' : treeCheckedStrategy; treeProps.checkedKeys = keys; if (!readOnly) { treeProps.onCheck = this.handleCheck; } } else { treeProps.selectedKeys = keys; if (!readOnly) { treeProps.onSelect = this.handleSelect; } } var notFound = false; var newChildren = void 0; if (showSearch && searchedValue) { treeProps.expandedKeys = expandedKeys; treeProps.autoExpandParent = autoExpandParent; treeProps.onExpand = this.handleExpand; treeProps.filterTreeNode = function (node) { return searchedKeys.indexOf(node.props.eventKey) > -1; }; if (searchedKeys.length) { newChildren = dataSource ? this.createNodesByData(dataSource, true) : this.searchNodes(children); } else { notFound = true; } } else { // eslint-disable-next-line if (dataSource) { if (dataSource.length) { newChildren = this.createNodesByData(dataSource); } else { notFound = true; } } else { // eslint-disable-next-line if (_react.Children.count(children)) { newChildren = children; } else { notFound = true; } } } var contentClass = treeSelectPrefix + 'dropdown-content'; return _react2.default.createElement( 'div', { className: treeSelectPrefix + 'dropdown' }, notFound ? _react2.default.createElement( 'div', { className: treeSelectPrefix + 'not-found contentClass' }, notFoundContent ) : _react2.default.createElement( _tree2.default, (0, _extends3.default)({}, treeProps, customTreeProps, { className: contentClass }), newChildren ) ); }; TreeSelect.prototype.renderPreview = function renderPreview(data, others) { var _props4 = this.props, prefix = _props4.prefix, className = _props4.className, renderPreview = _props4.renderPreview; var previewCls = (0, _classnames2.default)(className, prefix + 'form-preview'); var items = data && !Array.isArray(data) ? [data] : data; if (typeof renderPreview === 'function') { return _react2.default.createElement( 'div', (0, _extends3.default)({}, others, { className: previewCls }), renderPreview(items, this.props) ); } return _react2.default.createElement( 'p', (0, _extends3.default)({}, others, { className: previewCls }), items && items.map(function (_ref) { var label = _ref.label; return label; }).join(', ') ); }; /** * TreeSelect 无法直接使用 Select 的 maxTagPlaceholder 逻辑 * Select 的 totalValue 是所有 leaf 节点,TreeSelect 的 totalValue 受 treeCheckedStrategy 和 treeCheckStrictly 影响 * * treeCheckStrictly = true: totalValue 为所有节点 * * treeCheckStrictly = false: 根据 treeCheckedStrategy 判断 * treeCheckedStrategy = 'all': totalValue 为所有节点 * treeCheckedStrategy = 'parent': totalValue 无意义,不返回 * treeCheckedStrategy = 'child': totalValue 为所有 leaf 节点 */ TreeSelect.prototype.renderMaxTagPlaceholder = function renderMaxTagPlaceholder(value, totalValue) { // 这里的 totalValue 为所有 leaf 节点 var _props5 = this.props, treeCheckStrictly = _props5.treeCheckStrictly, maxTagPlaceholder = _props5.maxTagPlaceholder, treeCheckedStrategy = _props5.treeCheckedStrategy, locale = _props5.locale; var _v2n = this.state._v2n; var treeSelectTotalValue = totalValue; // all the leaf nodes // calculate total value if (treeCheckStrictly) { // all the nodes treeSelectTotalValue = _util2.obj.values(_v2n); } else if (treeCheckedStrategy === 'all') { // all treeSelectTotalValue = _util2.obj.values(_v2n); } else if (treeCheckedStrategy === 'parent') { // totalValue is pointless when treeCheckedStrategy = 'parent' treeSelectTotalValue = undefined; } // custom render function if (maxTagPlaceholder) { return maxTagPlaceholder(value, treeSelectTotalValue); } // default render function if (treeCheckedStrategy === 'parent') { // don't show totalValue when treeCheckedStrategy = 'parent' return '' + _util2.str.template(locale.shortMaxTagPlaceholder, { selected: value.length }); } return '' + _util2.str.template(locale.maxTagPlaceholder, { selected: value.length, total: treeSelectTotalValue.length }); }; /*eslint-enable*/ TreeSelect.prototype.render = function render() { var _props6 = this.props, prefix = _props6.prefix, size = _props6.size, placeholder = _props6.placeholder, disabled = _props6.disabled, hasArrow = _props6.hasArrow, hasBorder = _props6.hasBorder, hasClear = _props6.hasClear, label = _props6.label, readOnly = _props6.readOnly, autoWidth = _props6.autoWidth, popupStyle = _props6.popupStyle, popupClassName = _props6.popupClassName, showSearch = _props6.showSearch, multiple = _props6.multiple, treeCheckable = _props6.treeCheckable, treeCheckStrictly = _props6.treeCheckStrictly, className = _props6.className, popupContainer = _props6.popupContainer, popupProps = _props6.popupProps, followTrigger = _props6.followTrigger, isPreview = _props6.isPreview, dataSource = _props6.dataSource, tagInline = _props6.tagInline; var others = _util2.obj.pickOthers(Object.keys(TreeSelect.propTypes), this.props); var _state5 = this.state, value = _state5.value, visible = _state5.visible; // if (non-leaf 节点可选 & 父子节点选中状态需要联动),需要额外计算父子节点间的联动关系 var valueForSelect = treeCheckable && !treeCheckStrictly ? this.getValueForSelect(value) : value; var data = this.getData(valueForSelect, true); if (!multiple && !treeCheckable) { data = data[0]; } if (isPreview) { return this.renderPreview(data, others); } return _react2.default.createElement(_select2.default, (0, _extends3.default)({ prefix: prefix, className: className, size: size, hasBorder: hasBorder, hasArrow: hasArrow, hasClear: hasClear, placeholder: placeholder, disabled: disabled, autoWidth: autoWidth, label: label, readOnly: readOnly, ref: this.saveSelectRef, dataSource: dataSource, value: data, onChange: this.handleChange, visible: visible, onVisibleChange: this.handleVisibleChange, showSearch: showSearch, onSearch: this.handleSearch, onSearchClear: this.handleSearchClear, popupContainer: popupContainer, popupStyle: popupStyle, popupClassName: popupClassName, popupProps: popupProps, followTrigger: followTrigger, tagInline: tagInline, maxTagPlaceholder: this.renderMaxTagPlaceholder }, others, { onRemove: this.handleRemove, onKeyDown: this.handleKeyDown, popupContent: this.renderPopupContent(), mode: treeCheckable || multiple ? 'multiple' : 'single' })); }; return TreeSelect; }(_react.Component), _class.propTypes = { prefix: _propTypes2.default.string, pure: _propTypes2.default.bool, locale: _propTypes2.default.object, className: _propTypes2.default.string, /** * 树节点 */ children: _propTypes2.default.node, /** * 选择框大小 */ size: _propTypes2.default.oneOf(['small', 'medium', 'large']), /** * 选择框占位符 */ placeholder: _propTypes2.default.string, /** * 是否禁用 */ disabled: _propTypes2.default.bool, /** * 是否有下拉箭头 */ hasArrow: _propTypes2.default.bool, /** * 是否有边框 */ hasBorder: _propTypes2.default.bool, /** * 是否有清空按钮 */ hasClear: _propTypes2.default.bool, /** * 自定义内联 label */ label: _propTypes2.default.node, /** * 是否只读,只读模式下可以展开弹层但不能选择 */ readOnly: _propTypes2.default.bool, /** * 下拉框是否与选择器对齐 */ autoWidth: _propTypes2.default.bool, /** * 数据源,该属性优先级高于 children */ dataSource: _propTypes2.default.arrayOf(_propTypes2.default.object), /** * value/defaultValue 在 dataSource 中不存在时,是否展示 * @version 1.25 */ preserveNonExistentValue: _propTypes2.default.bool, /** * (受控)当前值 */ value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object, _propTypes2.default.arrayOf(_propTypes2.default.any)]), /** * (非受控)默认值 */ defaultValue: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object, _propTypes2.default.arrayOf(_propTypes2.default.any)]), /** * 选中值改变时触发的回调函数 * @param {String|Array} value 选中的值,单选时返回单个值,多选时返回数组 * @param {Object|Array} data 选中的数据,包括 value, label, pos, key属性,单选时返回单个值,多选时返回数组,父子节点选中关联时,同时选中,只返回父节点 */ onChange: _propTypes2.default.func, /** * 是否一行显示,仅在 multiple 和 treeCheckable 为 true 时生效 * @version 1.25 */ tagInline: _propTypes2.default.bool, /** * 隐藏多余 tag 时显示的内容,在 tagInline 生效时起作用 * @param {Object[]} selectedValues 当前已选中的元素 * @param {Object[]} totalValues 总待选元素 * @returns {reactNode} * @version 1.25 */ maxTagPlaceholder: _propTypes2.default.func, /** * 是否显示搜索框 */ showSearch: _propTypes2.default.bool, /** * 在搜索框中输入时触发的回调函数 * @param {String} keyword 输入的关键字 */ onSearch: _propTypes2.default.func, onSearchClear: _propTypes2.default.func, /** * 无数据时显示内容 */ notFoundContent: _propTypes2.default.node, /** * 是否支持多选 */ multiple: _propTypes2.default.bool, /** * 下拉框中的树是否支持勾选节点的复选框 */ treeCheckable: _propTypes2.default.bool, /** * 下拉框中的树勾选节点复选框是否完全受控(父子节点选中状态不再关联) */ treeCheckStrictly: _propTypes2.default.bool, /** * 定义选中时回填的方式 * @enumdesc 返回所有选中的节点, 父子节点都选中时只返回父节点, 父子节点都选中时只返回子节点 */ treeCheckedStrategy: _propTypes2.default.oneOf(['all', 'parent', 'child']), /** * 下拉框中的树是否默认展开所有节点 */ treeDefaultExpandAll: _propTypes2.default.bool, /** * 下拉框中的树默认展开节点key的数组 */ treeDefaultExpandedKeys: _propTypes2.default.arrayOf(_propTypes2.default.string), /** * 下拉框中的树异步加载数据的函数,使用请参考[Tree的异步加载数据Demo](https://fusion.design/pc/component/basic/tree#%E5%BC%82%E6%AD%A5%E5%8A%A0%E8%BD%BD%E6%95%B0%E6%8D%AE) * @param {ReactElement} node 被点击展开的节点 */ treeLoadData: _propTypes2.default.func, /** * 透传到 Tree 的属性对象 */ treeProps: _propTypes2.default.object, /** * 初始下拉框是否显示 */ defaultVisible: _propTypes2.default.bool, /** * 当前下拉框是否显示 */ visible: _propTypes2.default.bool, /** * 下拉框显示或关闭时触发事件的回调函数 * @param {Boolean} visible 是否显示 * @param {String} type 触发显示关闭的操作类型 */ onVisibleChange: _propTypes2.default.func, /** * 下拉框自定义样式对象 */ popupStyle: _propTypes2.default.object, /** * 下拉框样式自定义类名 */ popupClassName: _propTypes2.default.string, /** * 下拉框挂载的容器节点 */ popupContainer: _propTypes2.default.any, /** * 透传到 Popup 的属性对象 */ popupProps: _propTypes2.default.object, /** * 是否跟随滚动 */ followTrigger: _propTypes2.default.bool, /** * 是否为预览态 */ isPreview: _propTypes2.default.bool, /** * 预览态模式下渲染的内容 * @param {Array<data>} value 选择值 { label: , value:} */ renderPreview: _propTypes2.default.func, /** * 是否开启虚拟滚动 */ useVirtual: _propTypes2.default.bool, /** * 是否是不可变数据 * @version 1.23 */ immutable: _propTypes2.default.bool }, _class.defaultProps = { prefix: 'next-', pure: false, locale: _zhCn2.default.TreeSelect, size: 'medium', disabled: false, hasArrow: true, hasBorder: true, hasClear: false, autoWidth: true, defaultValue: null, onChange: noop, tagInline: false, showSearch: false, onSearch: noop, onSearchClear: noop, notFoundContent: 'Not Found', multiple: false, treeCheckable: false, treeCheckStrictly: false, treeCheckedStrategy: 'parent', treeDefaultExpandAll: false, treeDefaultExpandedKeys: [], treeProps: {}, defaultVisible: false, onVisibleChange: noop, useVirtual: false, /** * TODO * 目前 select/cascade select 是默认支持的,在 2.x 版本中 tree-select 也将默认支持 */ preserveNonExistentValue: false }, _temp); TreeSelect.displayName = 'TreeSelect'; TreeSelect.Node = TreeNode; exports.default = (0, _reactLifecyclesCompat.polyfill)(TreeSelect); module.exports = exports['default'];