UNPKG

14.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
8
9var _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; };
10
11exports.browser = browser;
12exports.getOffset = getOffset;
13exports.loopAllChildren = loopAllChildren;
14exports.isInclude = isInclude;
15exports.filterParentPosition = filterParentPosition;
16exports.handleCheckState = handleCheckState;
17exports.getCheck = getCheck;
18exports.getStrictlyValue = getStrictlyValue;
19exports.arraysEqual = arraysEqual;
20exports.closest = closest;
21exports.isTreeNode = isTreeNode;
22exports.toArray = toArray;
23exports.getNodeChildren = getNodeChildren;
24exports.warnOnlyTreeNode = warnOnlyTreeNode;
25exports.convertListToTree = convertListToTree;
26exports.throttle = throttle;
27
28var _react = require('react');
29
30var _react2 = _interopRequireDefault(_react);
31
32function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
33
34function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } /* eslint no-loop-func: 0*/
35
36function browser(navigator) {
37 var tem = void 0;
38 var ua = navigator.userAgent;
39 var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
40 if (/trident/i.test(M[1])) {
41 tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
42 return 'IE ' + (tem[1] || '');
43 }
44 if (M[1] === 'Chrome') {
45 tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
46 if (tem) return tem.slice(1).join(' ').replace('OPR', 'Opera');
47 }
48 M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
49 tem = ua.match(/version\/(\d+)/i);
50 if (tem) {
51 M.splice(1, 1, tem[1]);
52 }
53 return M.join(' ');
54}
55
56// export function getOffset(el) {
57// const obj = el.getBoundingClientRect();
58// return {
59// left: obj.left + document.body.scrollLeft,
60// top: obj.top + document.body.scrollTop,
61// width: obj.width,
62// height: obj.height
63// };
64// }
65
66// // iscroll offset
67// offset = function (el) {
68// var left = -el.offsetLeft,
69// top = -el.offsetTop;
70
71// // jshint -W084
72// while (el = el.offsetParent) {
73// left -= el.offsetLeft;
74// top -= el.offsetTop;
75// }
76// // jshint +W084
77
78// return {
79// left: left,
80// top: top
81// };
82// }
83
84/* eslint-disable */
85function getOffset(ele) {
86 var doc = void 0,
87 win = void 0,
88 docElem = void 0,
89 rect = void 0;
90
91 if (!ele.getClientRects().length) {
92 return { top: 0, left: 0 };
93 }
94
95 rect = ele.getBoundingClientRect();
96
97 if (rect.width || rect.height) {
98 doc = ele.ownerDocument;
99 win = doc.defaultView;
100 docElem = doc.documentElement;
101
102 return {
103 top: rect.top + win.pageYOffset - docElem.clientTop,
104 left: rect.left + win.pageXOffset - docElem.clientLeft
105 };
106 }
107
108 return rect;
109}
110/* eslint-enable */
111
112function getChildrenlength(children) {
113 var len = 1;
114 if (Array.isArray(children)) {
115 len = children.length;
116 }
117 return len;
118}
119
120function getSiblingPosition(index, len, siblingPosition) {
121 if (len === 1) {
122 siblingPosition.first = true;
123 siblingPosition.last = true;
124 } else {
125 siblingPosition.first = index === 0;
126 siblingPosition.last = index === len - 1;
127 }
128 return siblingPosition;
129}
130
131function loopAllChildren(childs, callback, parent) {
132 var baseNum = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
133
134 var loop = function loop(children, level, _parent) {
135 var len = getChildrenlength(children);
136 _react2["default"].Children.forEach(children, function (item, index) {
137 var pos = level + '-' + (index + parseInt(baseNum));
138 if (item.props.children && item.type && item.type.isTreeNode) {
139 loop(item.props.children, pos, { node: item, pos: pos });
140 }
141 callback(item, index, pos, item.key || pos, getSiblingPosition(index, len, {}), _parent);
142 });
143 };
144 loop(childs, 0, parent);
145}
146
147function isInclude(smallArray, bigArray) {
148 return smallArray.every(function (ii, i) {
149 return ii === bigArray[i];
150 });
151}
152// console.log(isInclude(['0', '1'], ['0', '10', '1']));
153
154
155// arr.length === 628, use time: ~20ms
156function filterParentPosition(arr) {
157 var levelObj = {};
158 arr.forEach(function (item) {
159 var posLen = item.split('-').length;
160 if (!levelObj[posLen]) {
161 levelObj[posLen] = [];
162 }
163 levelObj[posLen].push(item);
164 });
165 var levelArr = Object.keys(levelObj).sort();
166
167 var _loop = function _loop(i) {
168 if (levelArr[i + 1]) {
169 levelObj[levelArr[i]].forEach(function (ii) {
170 var _loop2 = function _loop2(j) {
171 levelObj[levelArr[j]].forEach(function (_i, index) {
172 if (isInclude(ii.split('-'), _i.split('-'))) {
173 levelObj[levelArr[j]][index] = null;
174 }
175 });
176 levelObj[levelArr[j]] = levelObj[levelArr[j]].filter(function (p) {
177 return p;
178 });
179 };
180
181 for (var j = i + 1; j < levelArr.length; j++) {
182 _loop2(j);
183 }
184 });
185 }
186 };
187
188 for (var i = 0; i < levelArr.length; i++) {
189 _loop(i);
190 }
191 var nArr = [];
192 levelArr.forEach(function (i) {
193 nArr = nArr.concat(levelObj[i]);
194 });
195 return nArr;
196}
197// console.log(filterParentPosition(
198// ['0-2', '0-3-3', '0-10', '0-10-0', '0-0-1', '0-0', '0-1-1', '0-1']
199// ));
200
201
202function stripTail(str) {
203 var arr = str.match(/(.+)(-[^-]+)$/);
204 var st = '';
205 if (arr && arr.length === 3) {
206 st = arr[1];
207 }
208 return st;
209}
210function splitPosition(pos) {
211 return pos.split('-');
212}
213
214function handleCheckState(obj, checkedPositionArr, checkIt) {
215 // console.log(stripTail('0-101-000'));
216 var objKeys = Object.keys(obj);
217 // let s = Date.now();
218 objKeys.forEach(function (i, index) {
219 var iArr = splitPosition(i);
220 var saved = false;
221 checkedPositionArr.forEach(function (_pos) {
222 // 设置子节点,全选或全不选
223 var _posArr = splitPosition(_pos);
224 if (iArr.length > _posArr.length && isInclude(_posArr, iArr)) {
225 obj[i].halfChecked = false;
226 obj[i].checked = checkIt;
227 objKeys[index] = null;
228 }
229 if (iArr[0] === _posArr[0] && iArr[1] === _posArr[1]) {
230 // 如果
231 saved = true;
232 }
233 });
234 if (!saved) {
235 objKeys[index] = null;
236 }
237 });
238 // TODO: 循环 2470000 次耗时约 1400 ms。 性能瓶颈!
239 // console.log(Date.now()-s, checkedPositionArr.length * objKeys.length);
240 objKeys = objKeys.filter(function (i) {
241 return i;
242 }); // filter non null;
243
244 var _loop3 = function _loop3(_pIndex) {
245 // 循环设置父节点的 选中 或 半选状态
246 var loop = function loop(__pos) {
247 var _posLen = splitPosition(__pos).length;
248 if (_posLen <= 2) {
249 // e.g. '0-0', '0-1'
250 return;
251 }
252 var sibling = 0;
253 var siblingChecked = 0;
254 var parentPosition = stripTail(__pos);
255 objKeys.forEach(function (i /* , index*/) {
256 var iArr = splitPosition(i);
257 if (iArr.length === _posLen && isInclude(splitPosition(parentPosition), iArr)) {
258 sibling++;
259 if (obj[i].checked) {
260 siblingChecked++;
261 var _i = checkedPositionArr.indexOf(i);
262 if (_i > -1) {
263 checkedPositionArr.splice(_i, 1);
264 if (_i <= _pIndex) {
265 _pIndex--;
266 }
267 }
268 } else if (obj[i].halfChecked) {
269 siblingChecked += 0.5;
270 }
271 // objKeys[index] = null;
272 }
273 });
274 // objKeys = objKeys.filter(i => i); // filter non null;
275 var parent = obj[parentPosition];
276 // sibling 不会等于0
277 // 全不选 - 全选 - 半选
278 if (siblingChecked === 0) {
279 parent.checked = false;
280 parent.halfChecked = false;
281 } else if (siblingChecked === sibling) {
282 parent.checked = true;
283 parent.halfChecked = false;
284 } else {
285 parent.halfChecked = true;
286 parent.checked = false;
287 }
288 loop(parentPosition);
289 };
290 loop(checkedPositionArr[_pIndex], _pIndex);
291 pIndex = _pIndex;
292 };
293
294 for (var pIndex = 0; pIndex < checkedPositionArr.length; pIndex++) {
295 _loop3(pIndex);
296 }
297 // console.log(Date.now()-s, objKeys.length, checkIt);
298}
299
300function getCheck(treeNodesStates) {
301 var halfCheckedKeys = [];
302 var checkedKeys = [];
303 var checkedNodes = [];
304 var checkedNodesPositions = [];
305 Object.keys(treeNodesStates).forEach(function (item) {
306 var itemObj = treeNodesStates[item];
307 if (itemObj.checked) {
308 checkedKeys.push(itemObj.key);
309 checkedNodes.push(itemObj.node);
310 checkedNodesPositions.push({ node: itemObj.node, pos: item });
311 } else if (itemObj.halfChecked) {
312 halfCheckedKeys.push(itemObj.key);
313 }
314 });
315 return {
316 halfCheckedKeys: halfCheckedKeys, checkedKeys: checkedKeys, checkedNodes: checkedNodes, checkedNodesPositions: checkedNodesPositions, treeNodesStates: treeNodesStates
317 };
318}
319
320function getStrictlyValue(checkedKeys, halfChecked) {
321 if (halfChecked) {
322 return { checked: checkedKeys, halfChecked: halfChecked };
323 }
324 return checkedKeys;
325}
326
327function arraysEqual(a, b) {
328 if (a === b) return true;
329 if (a === null || typeof a === 'undefined' || b === null || typeof b === 'undefined') {
330 return false;
331 }
332 if (a.length !== b.length) return false;
333
334 // If you don't care about the order of the elements inside
335 // the array, you should sort both arrays here.
336
337 for (var i = 0; i < a.length; ++i) {
338 if (a[i] !== b[i]) return false;
339 }
340 return true;
341}
342
343function closest(el, selector) {
344 var matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;
345
346 while (el) {
347 if (matchesSelector.call(el, selector)) {
348 return el;
349 } else {
350 el = el.parentElement;
351 }
352 }
353 return null;
354}
355
356function isTreeNode(node) {
357 return node && node.type && node.type.isTreeNode;
358}
359
360function toArray(children) {
361 var ret = [];
362 _react2["default"].Children.forEach(children, function (c) {
363 ret.push(c);
364 });
365 return ret;
366}
367
368function getNodeChildren(children) {
369 return toArray(children).filter(isTreeNode);
370}
371
372var onlyTreeNodeWarned = false;
373
374function warnOnlyTreeNode() {
375 if (onlyTreeNodeWarned) return;
376 onlyTreeNodeWarned = true;
377 console.warn('Tree only accept TreeNode as children.');
378}
379
380/**
381 * 将一维数组转换为树结构
382 * @param {*} treeData 扁平结构的 List 数组
383 * @param {*} attr 属性配置设置
384 * @param {*} flatTreeKeysMap 存储所有 key-value 的映射,方便获取各节点信息
385 */
386function convertListToTree(treeData, attr, flatTreeKeysMap) {
387 var tree = []; //存储所有一级节点
388 var resData = treeData,
389 //resData 存储截取的节点 + 父节点(除一级节点外)
390 resKeysMap = {},
391 //resData 的Map映射
392 treeKeysMap = {}; //tree 的Map映射
393 resData.map(function (element) {
394 var key = attr.id;
395 resKeysMap[element[key]] = element;
396 });
397 // 查找父节点,为了补充不完整的数据结构
398 var findParentNode = function findParentNode(node) {
399 var parentKey = node[attr.parendId];
400 if (parentKey !== attr.rootId) {
401 //如果不是根节点,则继续递归
402 var item = flatTreeKeysMap[parentKey];
403 // 用 resKeysMap 判断,避免重复计算某节点的父节点
404 if (resKeysMap.hasOwnProperty(item[attr.id])) return;
405 resData.unshift(item);
406 resKeysMap[item[attr.id]] = item;
407 findParentNode(item);
408 } else {
409 // 用 treeKeysMap 判断,避免重复累加
410 if (!treeKeysMap.hasOwnProperty(node[attr.id])) {
411 var key = node.key,
412 title = node.title,
413 children = node.children,
414 isLeaf = node.isLeaf,
415 otherProps = _objectWithoutProperties(node, ['key', 'title', 'children', 'isLeaf']);
416
417 var obj = {
418 key: key,
419 title: title,
420 isLeaf: isLeaf,
421 children: []
422 };
423 tree.push(_extends(obj, _extends({}, otherProps)));
424 treeKeysMap[key] = node;
425 }
426 }
427 };
428 // 遍历 resData ,找到所有的一级节点
429 for (var i = 0; i < resData.length; i++) {
430 var item = resData[i];
431 if (item[attr.parendId] === attr.rootId && !treeKeysMap.hasOwnProperty(item[attr.id])) {
432 //如果是根节点,就存放进 tree 对象中
433 var key = item.key,
434 title = item.title,
435 children = item.children,
436 otherProps = _objectWithoutProperties(item, ['key', 'title', 'children']);
437
438 var obj = {
439 key: item[attr.id],
440 title: item[attr.name],
441 isLeaf: item[attr.isLeaf],
442 children: []
443 };
444 tree.push(_extends(obj, _extends({}, otherProps)));
445 treeKeysMap[key] = item;
446 resData.splice(i, 1);
447 i--;
448 } else {
449 //递归查找根节点信息
450 findParentNode(item);
451 }
452 }
453 // console.log('resData',resKeysMap);
454 var run = function run(treeArrs) {
455 if (resData.length > 0) {
456 for (var _i2 = 0; _i2 < treeArrs.length; _i2++) {
457 for (var j = 0; j < resData.length; j++) {
458 var _item = resData[j];
459 if (treeArrs[_i2].key === _item[attr.parendId]) {
460 var _key = _item.key,
461 _title = _item.title,
462 _children = _item.children,
463 _otherProps = _objectWithoutProperties(_item, ['key', 'title', 'children']);
464
465 var _obj = {
466 key: _item[attr.id],
467 title: _item[attr.name],
468 isLeaf: _item[attr.isLeaf],
469 children: []
470 };
471 treeArrs[_i2].children.push(_extends(_obj, _extends({}, _otherProps)));
472 resData.splice(j, 1);
473 j--;
474 }
475 }
476 run(treeArrs[_i2].children);
477 }
478 }
479 };
480 run(tree);
481 return tree;
482}
483
484function isObject(value) {
485 var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
486 return value != null && (type == 'object' || type == 'function');
487}
488
489/**
490 * 函数节流
491 * @param {*} func 延时调用函数
492 * @param {*} wait 延迟多长时间
493 * @return Function 延迟执行的方法
494 */
495function throttle(fn, wait) {
496 var last = void 0;
497 return function () {
498 var now = Date.now();
499 if (!last) {
500 fn.apply(this, arguments);
501 last = now;
502 return;
503 }
504 if (now - last >= wait) {
505 fn.apply(this, arguments);
506 last = now;
507 }
508 };
509}
\No newline at end of file