import { tag, WeElement, h, extractClass, classNames } from 'omi' import * as css from './index.scss' //@ts-ignore import '../theme.ts' interface Props { checkbox?: boolean, node: object } interface Data { } @tag('m-tree') export default class Tree extends WeElement{ static css = css static propTypes = { checkbox: Boolean, node: Object } _preSelected = null toggle = (id, open) => { this.fire('toggle', { id, open }) } _check = (node, state) => { if (node.disabled) return this.fire('check', { id: node.id, checked: !node.checked, state: state }) } onNodeClick = (id) => { this.fire('nodeClick', { id, pre: this._preSelected }) } renderNode(node) { if (node.selected) { this._preSelected = node.id } let state if (this.props.checkbox && node.children && node.children.length > 0) { state = this._isChecked(node, { checked: 0, unchecked: 0 }, true) } return } _isChecked(node, obj, tag) { if (!node.children) return for (let i = 0, len = node.children.length; i < len; i++) { let child = node.children[i] if (child.children && child.children.length === 0 || !child.children) { if (!child.disabled) { if (child.checked) { obj.checked++ } else { obj.unchecked++ } } } if (obj.unchecked && obj.checked) { break } this._isChecked(child, obj, false) } if (tag) { if (obj.unchecked && obj.checked) { return 'indeterminate' } if (obj.unchecked === 0) return 'checked' return 'unchecked' } } _getChildCount(node) { let count = 0 if (node.children && !node.close) { count += node.children.length node.children.forEach(child => { count += this._getChildCount(child) }) } return count } render(props) { return this.renderNode(props.node) } }