UNPKG

rsuite

Version:

A suite of react components

354 lines (280 loc) 8.56 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = _default; var _lodash = _interopRequireDefault(require("lodash")); function _default(props) { var valueKey = props.valueKey, childrenKey = props.childrenKey; /** * 获取一个节点的所有子节点的值 * @param {*} item * @param {*} uncheckableItemValues */ function getChildrenValue(item, uncheckableItemValues) { var values = []; if (!item[childrenKey]) { return values; } item[childrenKey].forEach(function (n) { if (uncheckableItemValues && !uncheckableItemValues.some(function (v) { return v === n[valueKey]; })) { values.push(n[valueKey]); } values = values.concat(getChildrenValue(n, uncheckableItemValues)); }); return values; } /** * 获取一个节点的所有父辈节点 * @param {*} item * @param {*} uncheckableItemValues */ function getParents(item) { var parents = []; if (!item.parent) { return parents; } parents.push(item.parent); parents = parents.concat(getParents(item.parent)); return parents; } /** * 删除一个节点下所有已选择的值 * @param {*} value * @param {*} item */ function removeAllChildrenValue(value, item) { var removedValue = []; if (!item[childrenKey]) { return; } item[childrenKey].forEach(function (n) { removedValue = removedValue.concat(_lodash.default.remove(value, function (v) { return v === n[valueKey]; })); if (n[childrenKey]) { removeAllChildrenValue(value, n); } }); return removedValue; } function getOtherItemValuesByUnselectChild(itemNode, value) { var parentValues = []; var itemValues = []; // 通过 value 找到当前节点的父节点 function findParent(item) { parentValues.push(item[valueKey]); if (value.some(function (v) { return v === item[valueKey]; })) { return item; } if (item.parent) { var p = findParent(item.parent); if (p) { return p; } } return null; } // 通过父节点获取子节点 function pushChildValue(item) { if (!item[childrenKey]) { return; } item[childrenKey].forEach(function (n) { //判断是否是直属父级 if (parentValues.some(function (v) { return v === n[valueKey]; }) && n[childrenKey]) { pushChildValue(n); } else if (n[valueKey] !== itemNode[valueKey]) { itemValues.push(n[valueKey]); } }); } var parent = findParent(itemNode); if (!parent) { return []; } pushChildValue(parent); return itemValues; } /** * 拆分值 * @param {*} item * @param {*} checked * @param {*} value * @param {*} uncheckableItemValues */ function splitValue(item, checked, value, uncheckableItemValues) { if (uncheckableItemValues === void 0) { uncheckableItemValues = []; } var itemValue = item[valueKey]; var childrenValue = getChildrenValue(item, uncheckableItemValues); var parents = getParents(item); var nextValue = [].concat(value); var removedValue = []; if (checked) { nextValue.push(itemValue); // 删除当前节点下所有的值 removedValue = removedValue.concat(removeAllChildrenValue(nextValue, item)); /** * 遍历当前节点所有祖宗节点 * 然后判断这些节点的子节点是否是否全部被选中,则自身也要被选中 */ var _loop = function _loop(i) { // 父节点是否可以选择 var isCheckableParent = !uncheckableItemValues.some(function (v) { return v === parents[i][valueKey]; }); if (isCheckableParent) { var isCheckAll = parents[i][childrenKey] // 过滤掉被标识为不可选的选项 .filter(function (n) { return !uncheckableItemValues.some(function (v) { return v === n[valueKey]; }); }) // 检查是否所有节点都被选中 .every(function (n) { return nextValue.some(function (v) { return v === n[valueKey]; }); }); if (isCheckAll) { // 添加父节点值 nextValue.push(parents[i][valueKey]); // 删除父节点下所有的值 removedValue = removedValue.concat(removeAllChildrenValue(nextValue, parents[i])); } } }; for (var i = 0; i < parents.length; i++) { _loop(i); } } else { var tempValue = childrenValue.concat(parents.map(function (item) { return item[valueKey]; })); nextValue = nextValue.concat(getOtherItemValuesByUnselectChild(item, nextValue)); // 删除相关的子父节点 removedValue = _lodash.default.remove(nextValue, function (v) { // 删除自己 if (v === itemValue) { return true; } return tempValue.some(function (n) { return n === v; }); }); } var uniqValue = _lodash.default.uniq(nextValue); var uniqRemovedValue = _lodash.default.uniq(removedValue); return { value: uniqValue, removedValue: uniqRemovedValue }; } /** * 在 value 中的值存在级联的情况下 * 通过 value 重新计算出一个新的 value */ function transformValue(value, flattenData, uncheckableItemValues) { var tempRemovedValue = []; var nextValue = []; var _loop2 = function _loop2(i) { // 如果当前 value 中的值已经在被删除列表中则不处理 if (tempRemovedValue.some(function (v) { return v === value[i]; })) { return "continue"; } var item = flattenData.find(function (v) { return v[valueKey] === value[i]; }); if (!item) { return "continue"; } var sv = splitValue(item, true, value, uncheckableItemValues); tempRemovedValue = _lodash.default.uniq(tempRemovedValue.concat(sv.removedValue)); // 获取到所有相关的值 nextValue = _lodash.default.uniq(nextValue.concat(sv.value)); }; for (var i = 0; i < value.length; i++) { var _ret = _loop2(i); if (_ret === "continue") continue; } // 最后遍历所有的 nextValue, 如果它的父节点也在nextValue则删除 return nextValue.filter(function (v) { var item = flattenData.find(function (n) { return n[valueKey] === v; }); if (item && item.parent && nextValue.some(function (v) { return v === item.parent[valueKey]; })) { return false; } return true; }); } function getItems(selectNode, flattenData) { var items = []; function findParent(item) { if (item[childrenKey]) { items.push(item[childrenKey]); } if (item.parent) { findParent(item.parent); } } if (selectNode) { findParent(selectNode); } items.push(flattenData.filter(function (item) { return item.parent === null; })); return items.reverse(); } function isSomeChildChecked(node, value) { if (value === void 0) { value = []; } if (!node[childrenKey] || !value) { return false; } return node[childrenKey].some(function (child) { if (value.some(function (n) { return n === child[valueKey]; })) { return true; } if (child[childrenKey] && child[childrenKey].length) { return isSomeChildChecked(child, value); } return false; }); } function isSomeParentChecked(node, value) { if (value === void 0) { value = []; } if (!value) { return false; } if (value.some(function (n) { return n === node[valueKey]; })) { return true; } if (node.parent) { return isSomeParentChecked(node.parent, value); } return false; } return { removeAllChildrenValue: removeAllChildrenValue, getChildrenValue: getChildrenValue, splitValue: splitValue, transformValue: transformValue, getOtherItemValuesByUnselectChild: getOtherItemValuesByUnselectChild, getItems: getItems, isSomeChildChecked: isSomeChildChecked, isSomeParentChecked: isSomeParentChecked }; } module.exports = exports.default;