UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

281 lines (241 loc) 8.73 kB
'use strict'; exports.__esModule = true; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); exports.normalizeToArray = normalizeToArray; exports.isNodeChecked = isNodeChecked; exports.forEachEnableNode = forEachEnableNode; exports.isNodeDisabledChecked = isNodeDisabledChecked; exports.getCheckableParentNode = getCheckableParentNode; exports.filterChildKey = filterChildKey; exports.filterParentKey = filterParentKey; exports.isDescendantOrSelf = isDescendantOrSelf; exports.isSiblingOrSelf = isSiblingOrSelf; exports.getAllCheckedKeys = getAllCheckedKeys; exports.convertChildren2Data = convertChildren2Data; exports.getAllDescendantKeys = getAllDescendantKeys; var _treeNode = require('./tree-node'); var _treeNode2 = _interopRequireDefault(_treeNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable valid-jsdoc */ function normalizeToArray(keys) { if (keys !== undefined && keys !== null) { if (Array.isArray(keys)) { return [].concat(keys); } return [keys]; } return []; } /** * 判断子节点是否是选中状态,如果 checkable={false} 则向下递归, * @param {Node} child * @param {Array} checkedKeys */ function isNodeChecked(node, checkedKeys) { if (node.disabled || node.checkboxDisabled) return true; /* istanbul ignore next */ if (node.checkable === false) { return !node.children || node.children.length === 0 || node.children.every(function (c) { return isNodeChecked(c, checkedKeys); }); } return checkedKeys.indexOf(node.key) > -1; } /** * 遍历所有可用的子节点 * @param {Node} * @param {Function} callback */ function forEachEnableNode(node) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; if (node.disabled || node.checkboxDisabled) return; // eslint-disable-next-line callback-return callback(node); if (node.children && node.children.length > 0) { node.children.forEach(function (child) { return forEachEnableNode(child, callback); }); } } /** * 判断节点是否禁用checked * @param {Node} node * @returns {Boolean} */ function isNodeDisabledChecked(node) { if (node.disabled || node.checkboxDisabled) return true; /* istanbul ignore next */ if (node.checkable === false) { return !node.children || node.children.length === 0 || node.children.every(isNodeDisabledChecked); } return false; } /** * 递归获取一个 checkable = {true} 的父节点,当 checkable={false} 时继续往上查找 * @param {Node} node * @param {Map} _p2n * @return {Node} */ function getCheckableParentNode(node, _p2n) { var parentPos = node.pos.split(['-']); if (parentPos.length === 2) return node; parentPos.splice(parentPos.length - 1, 1); parentPos = parentPos.join('-'); var parentNode = _p2n[parentPos]; if (parentNode.disabled || parentNode.checkboxDisabled) return false; /* istanbul ignore next */ if (parentNode.checkable === false) { return getCheckableParentNode(parentNode, _p2n); } return parentNode; } /** * 过滤子节点 * @param {Array} keys * @param {Object} _k2n */ function filterChildKey(keys, _k2n, _p2n) { var newKeys = []; keys.forEach(function (key) { var node = getCheckableParentNode(_k2n[key], _p2n); if (!node || node.checkable === false || node === _k2n[key] || keys.indexOf(node.key) === -1) { newKeys.push(key); } }); return newKeys; } function filterParentKey(keys, _k2n) { var newKeys = []; for (var i = 0; i < keys.length; i++) { var node = _k2n[keys[i]]; if (!node.children || node.children.length === 0 || node.children.every(isNodeDisabledChecked)) { newKeys.push(keys[i]); } } return newKeys; } function isDescendantOrSelf(currentPos, targetPos) { if (!currentPos || !targetPos) { return false; } var currentNums = currentPos.split('-'); var targetNums = targetPos.split('-'); return currentNums.length <= targetNums.length && currentNums.every(function (num, index) { return num === targetNums[index]; }); } function isSiblingOrSelf(currentPos, targetPos) { var currentNums = currentPos.split('-').slice(0, -1); var targetNums = targetPos.split('-').slice(0, -1); return currentNums.length === targetNums.length && currentNums.every(function (num, index) { return num === targetNums[index]; }); } // eslint-disable-next-line max-statements function getAllCheckedKeys(checkedKeys, _k2n, _p2n) { checkedKeys = normalizeToArray(checkedKeys); var filteredKeys = checkedKeys.filter(function (key) { return !!_k2n[key]; }); var flatKeys = [].concat(filterChildKey(filteredKeys, _k2n, _p2n).filter(function (key) { return !(_k2n[key].disabled || _k2n[key].checkboxDisabled); }), filteredKeys.filter(function (key) { return _k2n[key].disabled || _k2n[key].checkboxDisabled; })); var removeKey = function removeKey(child) { if (child.disabled || child.checkboxDisabled) return; if (child.checkable === false && child.children && child.children.length > 0) { return child.children.forEach(removeKey); } flatKeys.splice(flatKeys.indexOf(child.key), 1); }; var addParentKey = function addParentKey(i, parent) { return flatKeys.splice(i, 0, parent.key); }; // 所有 child nodes 选中时,取 parent node,删除所有 child nodes var keys = [].concat(flatKeys); for (var i = 0; i < keys.length; i++) { var pos = _k2n[keys[i]].pos; var nums = pos.split('-'); if (nums.length === 2) { continue; } for (var j = nums.length - 2; j > 0; j--) { var parentPos = nums.slice(0, j + 1).join('-'); var parent = _p2n[parentPos]; if (parent.checkable === false || parent.disabled || parent.checkboxDisabled) continue; var parentChecked = parent.children.every(function (child) { return isNodeChecked(child, flatKeys); }); if (parentChecked) { parent.children.forEach(removeKey); addParentKey(i, parent); } else { break; } } } // 重新选中所有 child nodes var newKeys = new Set(); flatKeys.forEach(function (key) { if (_k2n[key].disabled || _k2n[key].checkboxDisabled) { newKeys.add(key); return; } forEachEnableNode(_k2n[key], function (node) { if (node.checkable === false) return; newKeys.add(node.key); }); }); return Array.from(newKeys); } /** * Convert children of Tree into DataSource * @param {React.ReactNode} children * @return {Array} */ function convertChildren2Data(children) { function convert(treeNodes) { treeNodes = normalizeToArray(treeNodes); return treeNodes.map(function (node) { if (node.type && node.type !== _treeNode2.default && node.type.target !== _treeNode2.default) { // 为了兼容之前的实现 保留非法节点 return { illegalFlag: true, node: node }; } var key = node.key, _node$props = node.props, children = _node$props.children, rest = (0, _objectWithoutProperties3.default)(_node$props, ['children']); var nodeData = (0, _extends3.default)({ key: key }, rest); if (children && !(Array.isArray(children) && !children.length)) { nodeData.children = convert(children); } return nodeData; }).filter(function (treeNodeData) { return treeNodeData; }); } return convert(children); } /** * get all descendant`s keys of current node * @param {Object} nodeData * @param {Object} p2n * @return {Array} */ function getAllDescendantKeys(nodeData, p2n) { var posList = nodeData.pos.split('-'); var keys = []; var pos = posList[0]; for (var i = 1; i < posList.length - 1; i++) { pos = [pos, posList[i]].join('-'); keys.push(p2n[pos].key); } return keys; }