bee-tree/build/Tree.js

894 lines
31 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _util = require('./util');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _tinperBeeCore = require('tinper-bee-core');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
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) : _defaults(subClass, superClass); } /* eslint no-console:0 */
function noop() {}
var Tree = function (_React$Component) {
_inherits(Tree, _React$Component);
function Tree(props) {
_classCallCheck(this, Tree);
var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
['onKeyDown', 'onCheck'].forEach(function (m) {
_this[m] = _this[m].bind(_this);
});
_this.contextmenuKeys = [];
_this.checkedKeysChange = true;
_this.state = {
expandedKeys: _this.getDefaultExpandedKeys(props),
checkedKeys: _this.getDefaultCheckedKeys(props),
selectedKeys: _this.getDefaultSelectedKeys(props),
dragNodesKeys: '',
dragOverNodeKey: '',
dropNodeKey: ''
};
return _this;
}
Tree.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var expandedKeys = this.getDefaultExpandedKeys(nextProps, true);
var checkedKeys = this.getDefaultCheckedKeys(nextProps, true);
var selectedKeys = this.getDefaultSelectedKeys(nextProps, true);
var st = {};
if (expandedKeys) {
st.expandedKeys = expandedKeys;
}
if (checkedKeys) {
if (nextProps.checkedKeys === this.props.checkedKeys) {
this.checkedKeysChange = false;
} else {
this.checkedKeysChange = true;
}
st.checkedKeys = checkedKeys;
}
if (selectedKeys) {
st.selectedKeys = selectedKeys;
}
this.setState(st);
};
Tree.prototype.onDragStart = function onDragStart(e, treeNode) {
this.dragNode = treeNode;
this.dragNodesKeys = this.getDragNodes(treeNode);
var st = {
dragNodesKeys: this.dragNodesKeys
};
var expandedKeys = this.getExpandedKeys(treeNode, false);
if (expandedKeys) {
// Controlled expand, save and then reset
this.getRawExpandedKeys();
st.expandedKeys = expandedKeys;
}
this.setState(st);
this.props.onDragStart({
event: e,
node: treeNode
});
this._dropTrigger = false;
};
Tree.prototype.onDragEnterGap = function onDragEnterGap(e, treeNode) {
var offsetTop = (0, _util.getOffset)(treeNode.refs.selectHandle).top;
var offsetHeight = treeNode.refs.selectHandle.offsetHeight;
var pageY = e.pageY;
var gapHeight = 2;
if (pageY > offsetTop + offsetHeight - gapHeight) {
this.dropPosition = 1;
return 1;
}
if (pageY < offsetTop + gapHeight) {
this.dropPosition = -1;
return -1;
}
this.dropPosition = 0;
return 0;
};
Tree.prototype.onDragEnter = function onDragEnter(e, treeNode) {
var enterGap = this.onDragEnterGap(e, treeNode);
if (this.dragNode.props.eventKey === treeNode.props.eventKey && enterGap === 0) {
this.setState({
dragOverNodeKey: ''
});
return;
}
var st = {
dragOverNodeKey: treeNode.props.eventKey
};
var expandedKeys = this.getExpandedKeys(treeNode, true);
if (expandedKeys) {
this.getRawExpandedKeys();
st.expandedKeys = expandedKeys;
}
this.setState(st);
this.props.onDragEnter({
event: e,
node: treeNode,
expandedKeys: expandedKeys && [].concat(_toConsumableArray(expandedKeys)) || [].concat(_toConsumableArray(this.state.expandedKeys))
});
};
Tree.prototype.onDragOver = function onDragOver(e, treeNode) {
this.props.onDragOver({
event: e,
node: treeNode
});
};
Tree.prototype.onDragLeave = function onDragLeave(e, treeNode) {
this.props.onDragLeave({
event: e,
node: treeNode
});
};
Tree.prototype.onDrop = function onDrop(e, treeNode) {
var key = treeNode.props.eventKey;
this.setState({
dragOverNodeKey: '',
dropNodeKey: key
});
if (this.dragNodesKeys.indexOf(key) > -1) {
if (console.warn) {
console.warn('can not drop to dragNode(include it\'s children node)');
}
return false;
}
var posArr = treeNode.props.pos.split('-');
var res = {
event: e,
node: treeNode,
dragNode: this.dragNode,
dragNodesKeys: [].concat(_toConsumableArray(this.dragNodesKeys)),
dropPosition: this.dropPosition + Number(posArr[posArr.length - 1])
};
if (this.dropPosition !== 0) {
res.dropToGap = true;
}
if ('expandedKeys' in this.props) {
res.rawExpandedKeys = [].concat(_toConsumableArray(this._rawExpandedKeys)) || [].concat(_toConsumableArray(this.state.expandedKeys));
}
this.props.onDrop(res);
this._dropTrigger = true;
};
Tree.prototype.onDragEnd = function onDragEnd(e, treeNode) {
this.setState({
dragOverNodeKey: ''
});
this.props.onDragEnd({
event: e,
node: treeNode
});
};
/**
*
*
* @param {*} treeNode 当前操作的节点
* @param {*} keyType 键盘事件通用的key类型 left 为收起right为展开
* @returns
* @memberof Tree
*/
Tree.prototype.onExpand = function onExpand(treeNode, keyType) {
var _this2 = this;
var expanded = !treeNode.props.expanded;
var controlled = 'expandedKeys' in this.props;
var expandedKeys = [].concat(_toConsumableArray(this.state.expandedKeys));
var index = expandedKeys.indexOf(treeNode.props.eventKey);
if (keyType == 'left') {
expanded = false;
} else if (keyType == 'right') {
expanded = true;
}
if (expanded && index === -1) {
expandedKeys.push(treeNode.props.eventKey);
} else if (!expanded && index > -1) {
expandedKeys.splice(index, 1);
}
if (!controlled) {
this.setState({
expandedKeys: expandedKeys
});
}
this.props.onExpand(expandedKeys, {
node: treeNode,
expanded: expanded
});
// after data loaded, need set new expandedKeys
if (expanded && this.props.loadData) {
return this.props.loadData(treeNode).then(function () {
if (!controlled) {
_this2.setState({
expandedKeys: expandedKeys
});
}
});
}
};
Tree.prototype.onCheck = function onCheck(treeNode) {
var _this3 = this;
var checked = !treeNode.props.checked;
if (treeNode.props.halfChecked) {
checked = true;
}
var key = treeNode.props.eventKey;
var checkedKeys = [].concat(_toConsumableArray(this.state.checkedKeys));
var index = checkedKeys.indexOf(key);
var newSt = {
event: 'check',
node: treeNode,
checked: checked
};
if (this.props.checkStrictly) {
if (checked && index === -1) {
checkedKeys.push(key);
}
if (!checked && index > -1) {
checkedKeys.splice(index, 1);
}
this.treeNodesStates[treeNode.props.pos].checked = checked;
newSt.checkedNodes = [];
(0, _util.loopAllChildren)(this.props.children, function (item, ind, pos, keyOrPos) {
if (checkedKeys.indexOf(keyOrPos) !== -1) {
newSt.checkedNodes.push(item);
}
});
if (!('checkedKeys' in this.props)) {
this.setState({
checkedKeys: checkedKeys
});
}
var halfChecked = this.props.checkedKeys ? this.props.checkedKeys.halfChecked : [];
this.props.onCheck((0, _util.getStrictlyValue)(checkedKeys, halfChecked), newSt);
} else {
if (checked && index === -1) {
this.treeNodesStates[treeNode.props.pos].checked = true;
var checkedPositions = [];
Object.keys(this.treeNodesStates).forEach(function (i) {
if (_this3.treeNodesStates[i].checked) {
checkedPositions.push(i);
}
});
(0, _util.handleCheckState)(this.treeNodesStates, (0, _util.filterParentPosition)(checkedPositions), true);
}
if (!checked) {
this.treeNodesStates[treeNode.props.pos].checked = false;
this.treeNodesStates[treeNode.props.pos].halfChecked = false;
(0, _util.handleCheckState)(this.treeNodesStates, [treeNode.props.pos], false);
}
var checkKeys = (0, _util.getCheck)(this.treeNodesStates);
newSt.checkedNodes = checkKeys.checkedNodes;
newSt.checkedNodesPositions = checkKeys.checkedNodesPositions;
newSt.halfCheckedKeys = checkKeys.halfCheckedKeys;
this.checkKeys = checkKeys;
this._checkedKeys = checkedKeys = checkKeys.checkedKeys;
if (!('checkedKeys' in this.props)) {
this.setState({
checkedKeys: checkedKeys
});
}
this.props.onCheck(checkedKeys, newSt);
}
};
Tree.prototype.onSelect = function onSelect(treeNode) {
var props = this.props;
var selectedKeys = [].concat(_toConsumableArray(this.state.selectedKeys));
var eventKey = treeNode.props.eventKey || treeNode.key;
var index = selectedKeys.indexOf(eventKey);
var selected = void 0;
//cancelUnSelect为true时第二次点击时不取消选中
if (props.cancelUnSelect) {
if (index == -1) {
selected = true;
if (!props.multiple) {
selectedKeys.length = 0;
}
selectedKeys.push(eventKey);
}
} else {
if (index !== -1) {
selected = false;
selectedKeys.splice(index, 1);
} else {
selected = true;
if (!props.multiple) {
selectedKeys.length = 0;
}
selectedKeys.push(eventKey);
}
}
var selectedNodes = [];
if (selectedKeys.length) {
(0, _util.loopAllChildren)(this.props.children, function (item) {
if (selectedKeys.indexOf(item.key) !== -1) {
selectedNodes.push(item);
}
});
}
var newSt = {
event: 'select',
node: treeNode,
selected: selected,
selectedNodes: selectedNodes
};
if (!('selectedKeys' in this.props)) {
this.setState({
selectedKeys: selectedKeys
});
}
props.onSelect(selectedKeys, newSt);
};
Tree.prototype.onDoubleClick = function onDoubleClick(treeNode) {
var props = this.props;
var eventKey = treeNode.props.eventKey;
var newSt = {
event: 'dblclick',
node: treeNode
};
props.onDoubleClick(eventKey, newSt);
};
Tree.prototype.onMouseEnter = function onMouseEnter(e, treeNode) {
this.props.onMouseEnter({
event: e,
node: treeNode
});
};
Tree.prototype.onMouseLeave = function onMouseLeave(e, treeNode) {
this.props.onMouseLeave({
event: e,
node: treeNode
});
};
Tree.prototype.onContextMenu = function onContextMenu(e, treeNode) {
var selectedKeys = [].concat(_toConsumableArray(this.state.selectedKeys));
var eventKey = treeNode.props.eventKey;
if (this.contextmenuKeys.indexOf(eventKey) === -1) {
this.contextmenuKeys.push(eventKey);
}
this.contextmenuKeys.forEach(function (key) {
var index = selectedKeys.indexOf(key);
if (index !== -1) {
selectedKeys.splice(index, 1);
}
});
if (selectedKeys.indexOf(eventKey) === -1) {
selectedKeys.push(eventKey);
}
this.setState({
selectedKeys: selectedKeys
});
this.props.onRightClick({
event: e,
node: treeNode
});
};
Tree.prototype.getTreeNode = function getTreeNode() {
var props = this.props;
};
Tree.prototype.goDown = function goDown(currentPos, currentIndex, e, treeNode) {
var props = this.props;
var nextIndex = parseInt(currentIndex) + 1;
var nextPos = void 0,
backNextPos = void 0;
var nextTreeNode = void 0,
backNextTreeNode = void 0;
var backNextPosArr = [],
backNextTreeNodeArr = [],
tempBackNextPosArr = [];
//是否为展开的节点,如果展开获取第一个子节点的信息,如果没有取相邻节点,若也没有相邻节点则获取父节点的下一个节点
if (props.expandedKeys.indexOf(treeNode.props.eventKey) > -1) {
nextPos = currentPos + '-0';
} else {
nextPos = currentPos.substr(0, currentPos.lastIndexOf('-') + 1) + nextIndex;
}
//若向下的节点没有了,找到父级相邻节点
var tempPosArr = currentPos.split('-');
var tempPosArrLength = tempPosArr.length;
//将可能是下一个节点的的位置都备份一遍
while (tempPosArrLength > 1) {
backNextPos = tempPosArrLength > 1 && tempPosArr.slice(0, tempPosArrLength - 1).join('-') + '-' + (parseInt(tempPosArr[tempPosArrLength - 1]) + 1);
tempBackNextPosArr.push(backNextPos);
tempPosArr = tempPosArr.slice(0, tempPosArrLength - 1);
tempPosArrLength = tempPosArr.length;
}
//选中下一个相邻的节点
(0, _util.loopAllChildren)(props.children, function (itemNode, index, pos, newKey) {
if (pos == nextPos) {
nextTreeNode = itemNode;
}
tempBackNextPosArr.forEach(function (item) {
if (item && item == pos) {
// backNextTreeNode = item;
backNextTreeNodeArr.push(itemNode);
backNextPosArr.push(pos);
}
});
});
//如果没有下一个节点,则获取父节点的下一个节点
if (!nextTreeNode) {
for (var i = 0; i < backNextTreeNodeArr.length; i++) {
if (backNextTreeNodeArr[i]) {
nextTreeNode = backNextTreeNodeArr[i];
nextPos = backNextPosArr[i];
break;
}
}
}
//查询的下一个节点不为空的话,则选中
if (nextTreeNode) {
var queryInfo = 'a[pos="' + nextPos + '"]';
var parentEle = (0, _util.closest)(e.target, ".u-tree");
var focusEle = parentEle ? parentEle.querySelector(queryInfo) : null;
focusEle && focusEle.focus();
this.onSelect(nextTreeNode);
}
};
Tree.prototype.goUp = function goUp(currentPos, currentIndex, e, treeNode) {
var props = this.props;
if (currentIndex == 0 && currentPos.length === 3) {
return;
}
// 向上键Up
var preIndex = parseInt(currentIndex) - 1;
var prePos = void 0;
if (preIndex >= 0) {
prePos = currentPos.substr(0, currentPos.lastIndexOf('-') + 1) + preIndex;
} else {
prePos = currentPos.substr(0, currentPos.lastIndexOf('-'));
}
var prevTreeNode = void 0,
preElement = void 0;
//选中上一个相邻的节点
(0, _util.loopAllChildren)(props.children, function (item, index, pos, newKey) {
if (pos == prePos) {
prevTreeNode = item;
}
});
//查询的上一个节点不为空的话,则选中
if (prevTreeNode) {
if (preIndex >= 0) {
//如果上面的节点展开则默认选择最后一个子节点
if (props.expandedKeys.indexOf(prevTreeNode.key) > -1) {
var preElementArr = e.target.parentElement.previousElementSibling.querySelectorAll('a');
preElement = preElementArr[preElementArr.length - 1];
prePos = preElement.getAttribute('pos');
(0, _util.loopAllChildren)(props.children, function (item, index, pos, newKey) {
if (pos == prePos) {
prevTreeNode = item;
}
});
} else {
//上一个节点没有展开
preElement = e.target.parentElement.previousElementSibling.querySelector('a');
}
} else {
// 不存在上一个节点时,选中它的父节点
preElement = e.target.parentElement.parentElement.parentElement.querySelector('a');
}
}
preElement && preElement.focus();
this.onSelect(prevTreeNode);
};
// all keyboard events callbacks run from here at first
Tree.prototype.onKeyDown = function onKeyDown(e, treeNode) {
var props = this.props;
var currentPos = treeNode.props.pos;
var currentIndex = currentPos.substr(currentPos.lastIndexOf('-') + 1);
//向下键down
if (e.keyCode == _tinperBeeCore.KeyCode.DOWN) {
this.goDown(currentPos, currentIndex, e, treeNode);
} else if (e.keyCode == _tinperBeeCore.KeyCode.UP) {
this.goUp(currentPos, currentIndex, e, treeNode);
} else if (e.keyCode == _tinperBeeCore.KeyCode.LEFT && !treeNode.props.isLeaf) {
// 收起树节点
this.onExpand(treeNode, 'left');
} else if (e.keyCode == _tinperBeeCore.KeyCode.RIGHT && !treeNode.props.isLeaf) {
// 展开树节点
this.onExpand(treeNode, 'right');
} else if (e.keyCode == _tinperBeeCore.KeyCode.SPACE && props.checkable) {
// 如果是多选tree则进行选中或者反选该节点
this.onCheck(treeNode);
} else if (e.keyCode == _tinperBeeCore.KeyCode.ENTER) {
this.onDoubleClick(treeNode);
}
// e.preventDefault();
};
Tree.prototype.getFilterExpandedKeys = function getFilterExpandedKeys(props, expandKeyProp, expandAll) {
var keys = props[expandKeyProp];
if (!expandAll && !props.autoExpandParent) {
return keys || [];
}
var expandedPositionArr = [];
if (props.autoExpandParent) {
(0, _util.loopAllChildren)(props.children, function (item, index, pos, newKey) {
if (keys.indexOf(newKey) > -1) {
expandedPositionArr.push(pos);
}
});
}
var filterExpandedKeys = [];
(0, _util.loopAllChildren)(props.children, function (item, index, pos, newKey) {
if (expandAll) {
filterExpandedKeys.push(newKey);
} else if (props.autoExpandParent) {
expandedPositionArr.forEach(function (p) {
if ((p.split('-').length > pos.split('-').length && (0, _util.isInclude)(pos.split('-'), p.split('-')) || pos === p) && filterExpandedKeys.indexOf(newKey) === -1) {
filterExpandedKeys.push(newKey);
}
});
}
});
return filterExpandedKeys.length ? filterExpandedKeys : keys;
};
Tree.prototype.getDefaultExpandedKeys = function getDefaultExpandedKeys(props, willReceiveProps) {
var expandedKeys = willReceiveProps ? undefined : this.getFilterExpandedKeys(props, 'defaultExpandedKeys', props.defaultExpandedKeys.length ? false : props.defaultExpandAll);
if ('expandedKeys' in props) {
expandedKeys = (props.autoExpandParent ? this.getFilterExpandedKeys(props, 'expandedKeys', false) : props.expandedKeys) || [];
}
return expandedKeys;
};
Tree.prototype.getDefaultCheckedKeys = function getDefaultCheckedKeys(props, willReceiveProps) {
var checkedKeys = willReceiveProps ? undefined : props.defaultCheckedKeys;
if ('checkedKeys' in props) {
checkedKeys = props.checkedKeys || [];
if (props.checkStrictly) {
if (props.checkedKeys.checked) {
checkedKeys = props.checkedKeys.checked;
} else if (!Array.isArray(props.checkedKeys)) {
checkedKeys = [];
}
}
}
return checkedKeys;
};
Tree.prototype.getDefaultSelectedKeys = function getDefaultSelectedKeys(props, willReceiveProps) {
var getKeys = function getKeys(keys) {
if (props.multiple) {
return [].concat(_toConsumableArray(keys));
}
if (keys.length) {
return [keys[0]];
}
return keys;
};
var selectedKeys = willReceiveProps ? undefined : getKeys(props.defaultSelectedKeys);
if ('selectedKeys' in props) {
selectedKeys = getKeys(props.selectedKeys);
}
return selectedKeys;
};
Tree.prototype.getRawExpandedKeys = function getRawExpandedKeys() {
if (!this._rawExpandedKeys && 'expandedKeys' in this.props) {
this._rawExpandedKeys = [].concat(_toConsumableArray(this.state.expandedKeys));
}
};
Tree.prototype.getOpenTransitionName = function getOpenTransitionName() {
var props = this.props;
var transitionName = props.openTransitionName;
var animationName = props.openAnimation;
if (!transitionName && typeof animationName === 'string') {
transitionName = props.prefixCls + '-open-' + animationName;
}
return transitionName;
};
Tree.prototype.getDragNodes = function getDragNodes(treeNode) {
var dragNodesKeys = [];
var tPArr = treeNode.props.pos.split('-');
(0, _util.loopAllChildren)(this.props.children, function (item, index, pos, newKey) {
var pArr = pos.split('-');
if (treeNode.props.pos === pos || tPArr.length < pArr.length && (0, _util.isInclude)(tPArr, pArr)) {
dragNodesKeys.push(newKey);
}
});
return dragNodesKeys;
};
Tree.prototype.getExpandedKeys = function getExpandedKeys(treeNode, expand) {
var key = treeNode.props.eventKey;
var expandedKeys = this.state.expandedKeys;
var expandedIndex = expandedKeys.indexOf(key);
var exKeys = void 0;
if (expandedIndex > -1 && !expand) {
exKeys = [].concat(_toConsumableArray(expandedKeys));
exKeys.splice(expandedIndex, 1);
return exKeys;
}
if (expand && expandedKeys.indexOf(key) === -1) {
return expandedKeys.concat([key]);
}
};
Tree.prototype.filterTreeNode = function filterTreeNode(treeNode) {
var filterTreeNode = this.props.filterTreeNode;
if (typeof filterTreeNode !== 'function' || treeNode.props.disabled) {
return false;
}
return filterTreeNode.call(this, treeNode);
};
Tree.prototype.renderTreeNode = function renderTreeNode(child, index) {
var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var pos = level + '-' + index;
var key = child.key || pos;
var state = this.state;
var props = this.props;
// prefer to child's own selectable property if passed
var selectable = props.selectable;
if (child.props.hasOwnProperty('selectable')) {
selectable = child.props.selectable;
}
var draggable = props.draggable;
if (child.props.hasOwnProperty('draggable')) {
draggable = child.props.draggable;
}
var cloneProps = {
ref: 'treeNode-' + key,
root: this,
eventKey: key,
pos: pos,
selectable: selectable,
loadData: props.loadData,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
onRightClick: props.onRightClick,
onDoubleClick: props.onDoubleClick,
onKeyDown: props.onKeyDown,
prefixCls: props.prefixCls,
showLine: props.showLine,
showIcon: props.showIcon,
draggable: draggable,
dragOver: state.dragOverNodeKey === key && this.dropPosition === 0,
dragOverGapTop: state.dragOverNodeKey === key && this.dropPosition === -1,
dragOverGapBottom: state.dragOverNodeKey === key && this.dropPosition === 1,
_dropTrigger: this._dropTrigger,
expanded: state.expandedKeys.indexOf(key) !== -1,
selected: state.selectedKeys.indexOf(key) !== -1,
openTransitionName: this.getOpenTransitionName(),
openAnimation: props.openAnimation,
filterTreeNode: this.filterTreeNode.bind(this),
openIcon: props.openIcon,
closeIcon: props.closeIcon,
focusable: props.focusable,
tabIndexKey: state.selectedKeys[0],
tabIndexValue: props.tabIndexValue
};
if (props.checkable) {
cloneProps.checkable = props.checkable;
if (props.checkStrictly) {
if (state.checkedKeys) {
cloneProps.checked = state.checkedKeys.indexOf(key) !== -1 || false;
}
if (props.checkedKeys && props.checkedKeys.halfChecked) {
cloneProps.halfChecked = props.checkedKeys.halfChecked.indexOf(key) !== -1 || false;
} else {
cloneProps.halfChecked = false;
}
} else {
if (this.checkedKeys) {
cloneProps.checked = this.checkedKeys.indexOf(key) !== -1 || false;
}
cloneProps.halfChecked = this.halfCheckedKeys.indexOf(key) !== -1;
}
}
if (this.treeNodesStates && this.treeNodesStates[pos]) {
_extends(cloneProps, this.treeNodesStates[pos].siblingPosition);
}
return _react2["default"].cloneElement(child, cloneProps);
};
Tree.prototype.render = function render() {
var _this4 = this;
var props = this.props;
var showLineCls = "";
if (props.showLine) {
showLineCls = props.prefixCls + '-show-line';
}
var domProps = {
className: (0, _classnames2["default"])(props.className, props.prefixCls, showLineCls),
role: 'tree-node'
};
if (props.focusable) {
// domProps.tabIndex = '0';//需求改成了默认选择第一个节点或者选中的节点
// domProps.onKeyDown = this.onKeyDown;//添加到具体的treeNode上了
}
var getTreeNodesStates = function getTreeNodesStates() {
_this4.treeNodesStates = {};
(0, _util.loopAllChildren)(props.children, function (item, index, pos, keyOrPos, siblingPosition) {
_this4.treeNodesStates[pos] = {
siblingPosition: siblingPosition
};
});
};
if (props.showLine && !props.checkable) {
getTreeNodesStates();
}
if (props.checkable && (this.checkedKeysChange || props.loadData)) {
if (props.checkStrictly) {
getTreeNodesStates();
} else if (props._treeNodesStates) {
this.treeNodesStates = props._treeNodesStates.treeNodesStates;
this.halfCheckedKeys = props._treeNodesStates.halfCheckedKeys;
this.checkedKeys = props._treeNodesStates.checkedKeys;
} else {
var checkedKeys = this.state.checkedKeys;
var checkKeys = void 0;
if (!props.loadData && this.checkKeys && this._checkedKeys && (0, _util.arraysEqual)(this._checkedKeys, checkedKeys)) {
// if checkedKeys the same as _checkedKeys from onCheck, use _checkedKeys.
checkKeys = this.checkKeys;
} else {
var checkedPositions = [];
this.treeNodesStates = {};
(0, _util.loopAllChildren)(props.children, function (item, index, pos, keyOrPos, siblingPosition) {
_this4.treeNodesStates[pos] = {
node: item,
key: keyOrPos,
checked: false,
halfChecked: false,
siblingPosition: siblingPosition
};
if (checkedKeys.indexOf(keyOrPos) !== -1) {
_this4.treeNodesStates[pos].checked = true;
checkedPositions.push(pos);
}
});
// if the parent node's key exists, it all children node will be checked
(0, _util.handleCheckState)(this.treeNodesStates, (0, _util.filterParentPosition)(checkedPositions), true);
checkKeys = (0, _util.getCheck)(this.treeNodesStates);
}
this.halfCheckedKeys = checkKeys.halfCheckedKeys;
this.checkedKeys = checkKeys.checkedKeys;
}
}
return _react2["default"].createElement(
'ul',
_extends({}, domProps, { unselectable: 'true', ref: 'tree' }),
_react2["default"].Children.map(props.children, this.renderTreeNode, this)
);
};
return Tree;
}(_react2["default"].Component);
Tree.propTypes = {
prefixCls: _propTypes2["default"].string,
children: _propTypes2["default"].any,
showLine: _propTypes2["default"].bool,
showIcon: _propTypes2["default"].bool,
selectable: _propTypes2["default"].bool,
multiple: _propTypes2["default"].bool,
checkable: _propTypes2["default"].oneOfType([_propTypes2["default"].bool, _propTypes2["default"].node]),
_treeNodesStates: _propTypes2["default"].object,
checkStrictly: _propTypes2["default"].bool,
draggable: _propTypes2["default"].bool,
autoExpandParent: _propTypes2["default"].bool,
defaultExpandAll: _propTypes2["default"].bool,
defaultExpandedKeys: _propTypes2["default"].arrayOf(_propTypes2["default"].string),
expandedKeys: _propTypes2["default"].arrayOf(_propTypes2["default"].string),
defaultCheckedKeys: _propTypes2["default"].arrayOf(_propTypes2["default"].string),
checkedKeys: _propTypes2["default"].oneOfType([_propTypes2["default"].arrayOf(_propTypes2["default"].string), _propTypes2["default"].object]),
defaultSelectedKeys: _propTypes2["default"].arrayOf(_propTypes2["default"].string),
selectedKeys: _propTypes2["default"].arrayOf(_propTypes2["default"].string),
onExpand: _propTypes2["default"].func,
onCheck: _propTypes2["default"].func,
onSelect: _propTypes2["default"].func,
loadData: _propTypes2["default"].func,
onMouseEnter: _propTypes2["default"].func,
onMouseLeave: _propTypes2["default"].func,
onRightClick: _propTypes2["default"].func,
onDragStart: _propTypes2["default"].func,
onDragEnter: _propTypes2["default"].func,
onDragOver: _propTypes2["default"].func,
onDragLeave: _propTypes2["default"].func,
onDrop: _propTypes2["default"].func,
onDragEnd: _propTypes2["default"].func,
filterTreeNode: _propTypes2["default"].func,
openTransitionName: _propTypes2["default"].string,
focusable: _propTypes2["default"].bool,
openAnimation: _propTypes2["default"].oneOfType([_propTypes2["default"].string, _propTypes2["default"].object])
};
Tree.defaultProps = {
prefixCls: 'rc-tree',
showLine: false,
showIcon: true,
selectable: true,
multiple: false,
checkable: false,
checkStrictly: false,
draggable: false,
autoExpandParent: true,
defaultExpandAll: false,
defaultExpandedKeys: [],
defaultCheckedKeys: [],
defaultSelectedKeys: [],
onExpand: noop,
onCheck: noop,
onSelect: noop,
onDragStart: noop,
onDragEnter: noop,
onDragOver: noop,
onDragLeave: noop,
onDrop: noop,
onDragEnd: noop,
onDoubleClick: noop
};
exports["default"] = Tree;
module.exports = exports['default'];