UNPKG

ant-design-vue

Version:

An enterprise-class UI design language and Vue-based implementation

244 lines (208 loc) 7.53 kB
import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties'; import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray'; import _extends from 'babel-runtime/helpers/extends'; import omit from 'omit.js'; import debounce from 'lodash/debounce'; import PropTypes from '../_util/vue-types'; import { conductExpandParent, convertTreeToEntities } from '../vc-tree/src/util'; import Tree, { TreeProps } from './Tree'; import { calcRangeKeys, getFullKeyList } from './util'; import Icon from '../icon'; import BaseMixin from '../_util/BaseMixin'; import { initDefaultProps, getOptionProps } from '../_util/props-util'; // export type ExpandAction = false | 'click' | 'doubleClick'; // export interface DirectoryTreeProps extends TreeProps { // expandAction?: ExpandAction; // } // export interface DirectoryTreeState { // expandedKeys?: string[]; // selectedKeys?: string[]; // } function getIcon(h, props) { var isLeaf = props.isLeaf, expanded = props.expanded; if (isLeaf) { return h(Icon, { attrs: { type: 'file' } }); } return h(Icon, { attrs: { type: expanded ? 'folder-open' : 'folder' } }); } export default { mixins: [BaseMixin], name: 'ADirectoryTree', model: { prop: 'checkedKeys', event: 'check' }, props: initDefaultProps(_extends({}, TreeProps(), { expandAction: PropTypes.oneOf([false, 'click', 'doubleclick']) }), { prefixCls: 'ant-tree', showIcon: true, expandAction: 'click' }), // state: DirectoryTreeState; // onDebounceExpand: (event, node: AntTreeNode) => void; // // Shift click usage // lastSelectedKey?: string; // cachedSelectedKeys?: string[]; data: function data() { var props = getOptionProps(this); var defaultExpandAll = props.defaultExpandAll, defaultExpandParent = props.defaultExpandParent, expandedKeys = props.expandedKeys, defaultExpandedKeys = props.defaultExpandedKeys; var _convertTreeToEntitie = convertTreeToEntities(this.$slots['default']), keyEntities = _convertTreeToEntitie.keyEntities; var state = {}; // Selected keys state._selectedKeys = props.selectedKeys || props.defaultSelectedKeys || []; // Expanded keys if (defaultExpandAll) { state._expandedKeys = getFullKeyList(this.$slots['default']); } else if (defaultExpandParent) { state._expandedKeys = conductExpandParent(expandedKeys || defaultExpandedKeys, keyEntities); } else { state._expandedKeys = defaultExpandedKeys; } this.onDebounceExpand = debounce(this.expandFolderNode, 200, { leading: true }); return _extends({ _selectedKeys: [], _expandedKeys: [] }, state); }, watch: { expandedKeys: function expandedKeys(val) { this.setState({ _expandedKeys: val }); }, selectedKeys: function selectedKeys(val) { this.setState({ _selectedKeys: val }); } }, methods: { onExpand: function onExpand(expandedKeys, info) { this.setUncontrolledState({ _expandedKeys: expandedKeys }); this.$emit('expand', expandedKeys, info); return undefined; }, onClick: function onClick(event, node) { var expandAction = this.$props.expandAction; // Expand the tree if (expandAction === 'click') { this.onDebounceExpand(event, node); } this.$emit('click', event, node); }, onDoubleClick: function onDoubleClick(event, node) { var expandAction = this.$props.expandAction; // Expand the tree if (expandAction === 'doubleclick') { this.onDebounceExpand(event, node); } this.$emit('doubleclick', event, node); }, onSelect: function onSelect(keys, event) { var multiple = this.$props.multiple; var children = this.$slots['default'] || []; var _$data = this.$data, _$data$_expandedKeys = _$data._expandedKeys, expandedKeys = _$data$_expandedKeys === undefined ? [] : _$data$_expandedKeys, _$data$_selectedKeys = _$data._selectedKeys, selectedKeys = _$data$_selectedKeys === undefined ? [] : _$data$_selectedKeys; var node = event.node, nativeEvent = event.nativeEvent; var _node$eventKey = node.eventKey, eventKey = _node$eventKey === undefined ? '' : _node$eventKey; var newState = {}; // Windows / Mac single pick var ctrlPick = nativeEvent.ctrlKey || nativeEvent.metaKey; var shiftPick = nativeEvent.shiftKey; // Generate new selected keys var newSelectedKeys = selectedKeys.slice(); if (multiple && ctrlPick) { // Control click newSelectedKeys = keys; this.lastSelectedKey = eventKey; this.cachedSelectedKeys = newSelectedKeys; } else if (multiple && shiftPick) { // Shift click newSelectedKeys = Array.from(new Set([].concat(_toConsumableArray(this.cachedSelectedKeys || []), _toConsumableArray(calcRangeKeys(children, expandedKeys, eventKey, this.lastSelectedKey))))); } else { // Single click newSelectedKeys = [eventKey]; this.lastSelectedKey = eventKey; this.cachedSelectedKeys = newSelectedKeys; } newState._selectedKeys = newSelectedKeys; this.$emit('select', newSelectedKeys, event); this.setUncontrolledState(newState); }, expandFolderNode: function expandFolderNode(event, node) { var _$data$_expandedKeys2 = this.$data._expandedKeys, expandedKeys = _$data$_expandedKeys2 === undefined ? [] : _$data$_expandedKeys2; var _node$eventKey2 = node.eventKey, eventKey = _node$eventKey2 === undefined ? '' : _node$eventKey2, expanded = node.expanded, isLeaf = node.isLeaf; if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) { return; } var newExpandedKeys = expandedKeys.slice(); var index = newExpandedKeys.indexOf(eventKey); if (expanded && index >= 0) { newExpandedKeys.splice(index, 1); } else if (!expanded && index === -1) { newExpandedKeys.push(eventKey); } this.setUncontrolledState({ _expandedKeys: newExpandedKeys }); this.$emit('expand', newExpandedKeys, { expanded: !expanded, node: node, nativeEvent: event }); }, setUncontrolledState: function setUncontrolledState(state) { var newState = omit(state, Object.keys(getOptionProps(this)).map(function (p) { return '_' + p; })); if (Object.keys(newState).length) { this.setState(newState); } } }, render: function render() { var h = arguments[0]; var _getOptionProps = getOptionProps(this), prefixCls = _getOptionProps.prefixCls, props = _objectWithoutProperties(_getOptionProps, ['prefixCls']); var _$data2 = this.$data, expandedKeys = _$data2._expandedKeys, selectedKeys = _$data2._selectedKeys; var treeProps = { props: _extends({ icon: getIcon }, props, { prefixCls: prefixCls, expandedKeys: expandedKeys, selectedKeys: selectedKeys }), 'class': prefixCls + '-directory', on: _extends({}, this.$listeners, { select: this.onSelect, click: this.onClick, doubleclick: this.onDoubleClick, expand: this.onExpand }) }; return h( Tree, treeProps, [this.$slots['default']] ); } };