UNPKG

ukelli-ui

Version:

Base on React's UI lib. Make frontend's dev simpler and faster.

182 lines (181 loc) 8.55 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; /* eslint-disable no-nested-ternary */ /* eslint-disable no-prototype-builtins */ import React, { Component } from "react"; import { Call } from "basic-helper"; import { Icon } from '../../core/icon'; var Tree = function (props) { var level = props.level, treeData = props.treeData, parentNode = props.parentNode, activeLevel = props.activeLevel, selectedItems = props.selectedItems, itemFilter = props.itemFilter, onCheck = props.onCheck, onToggle = props.onToggle; return (React.createElement("div", { className: "node-item" }, React.createElement("div", null, treeData.map(function (item) { var _a = itemFilter(item), title = _a.title, id = _a.id, child = _a.child; var hasChild = Array.isArray(child) && child.length > 0; var levelId = id; var isLevelActive = activeLevel[levelId]; if (typeof isLevelActive == 'undefined') isLevelActive = true; return (React.createElement("div", { key: id, className: "list-item" + (isLevelActive ? ' active' : '') + (!hasChild ? ' no-child' : '') }, React.createElement("span", { className: "func-btn" + (!hasChild ? ' disabled' : ''), onClick: function (e) { hasChild && onToggle(levelId, !isLevelActive); } }, React.createElement(Icon, { n: hasChild ? !isLevelActive ? 'plus' : 'minus' : 'circle', s: hasChild ? 's' : "r" })), React.createElement("span", null, React.createElement("input", { className: "check-item", type: "checkbox", onChange: function (e) { onCheck(item, parentNode); }, checked: selectedItems.hasOwnProperty(id) }), React.createElement("span", null, title)), React.createElement("div", { className: "children" }, hasChild && (React.createElement(Tree, { treeData: child, parentNode: item, selectedItems: selectedItems, activeLevel: activeLevel, onToggle: onToggle, itemFilter: itemFilter, onCheck: onCheck, level: level + 1 }))))); })))); }; var TreeList = /** @class */ (function (_super) { __extends(TreeList, _super); function TreeList(props) { var _this = _super.call(this, props) || this; _this.getDefaultActiveItems = function () { var res = {}; var recuresive = function (item) { if (item) { for (var i = 0; i < item.length; i++) { var _item = item[i]; var _a = _this.itemFilter(_item), child = _a.child, active = _a.active; if (active) { _this.onCheck(_item); } else if (Array.isArray(child)) recuresive(child); } } }; recuresive(_this.props.treeData); return res; }; _this.itemFilter = function (item) { var fieldMapper = _this.props.fieldMapper; if (!item || !fieldMapper) return null; var child = fieldMapper.child, value = fieldMapper.value, title = fieldMapper.title, id = fieldMapper.id, active = fieldMapper.active; return __assign(__assign({}, item), { child: item[child], value: item[value], active: item[active], title: item[title], id: item[id] }); }; _this.getChildIDs = function (targetNode) { var res = {}; var recuresive = function (item) { if (item) { for (var i = 0; i < item.length; i++) { var _item = item[i]; var _a = _this.itemFilter(_item), child = _a.child, id = _a.id, value = _a.value; res[id] = value; if (Array.isArray(child)) recuresive(child); } } }; recuresive(targetNode); return res; }; _this.onCheck = function (targetNode, parentNode) { var onChange = _this.props.onChange; var _a = _this.itemFilter(targetNode), child = _a.child, id = _a.id, value = _a.value; _this.setState(function (_a) { var selectedItems = _a.selectedItems; var nextState = __assign({}, selectedItems); var IDs = _this.getChildIDs(child); var isNextNeedCheck = !nextState.hasOwnProperty(id); if (!isNextNeedCheck) { delete nextState[id]; for (var key in IDs) { if (IDs.hasOwnProperty(key)) { delete nextState[key]; delete IDs[key]; } } } else { nextState[id] = value; } /** 检查父节点的所有 child 是否都选中了 */ if (parentNode) { var nextParentNode = _this.itemFilter(parentNode); var parentChildren = nextParentNode.child || []; var parentChildrenLen = parentChildren.length; var activeChildCount = 0; for (var i = 0; i < parentChildrenLen; i++) { var childItem = _this.itemFilter(parentChildren[i]); if (nextState.hasOwnProperty(childItem.id)) activeChildCount++; } if (activeChildCount === parentChildrenLen) { nextState[nextParentNode.id] = nextParentNode.value; } else { delete nextState[nextParentNode.id]; } } Object.assign(nextState, IDs); Call(onChange, nextState); _this.selectedItems = nextState; return { selectedItems: nextState }; }); }; _this.onToggle = function (levelId, nextActiveState) { _this.setState(function (_a) { var activeLevel = _a.activeLevel; var nextState = __assign({}, activeLevel); nextState[levelId] = nextActiveState; return { activeLevel: nextState }; }); }; _this.state = { activeLevel: {}, selectedItems: props.defaultValue }; return _this; } TreeList.prototype.componentDidMount = function () { this.getDefaultActiveItems(); }; TreeList.prototype.render = function () { var treeData = this.props.treeData; var _a = this.state, selectedItems = _a.selectedItems, activeLevel = _a.activeLevel; return (React.createElement("div", { className: "__treelist" }, React.createElement(Tree, { treeData: treeData, activeLevel: activeLevel, itemFilter: this.itemFilter, onToggle: this.onToggle, onCheck: this.onCheck, level: 0, selectedItems: selectedItems }))); }; TreeList.defaultProps = { fieldMapper: { child: 'child', title: 'title', active: 'active', value: 'value', id: 'id', }, defaultValue: {} }; return TreeList; }(Component)); export default TreeList;