| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- import { ref, shallowRef, computed, watch } from 'vue';
- import { TreeOptionsEnum, NODE_CLICK, NODE_DROP, CURRENT_CHANGE, NODE_EXPAND, NODE_COLLAPSE } from '../virtual-tree.mjs';
- import { useCheck } from './useCheck.mjs';
- import { useFilter } from './useFilter.mjs';
- import { isObject } from '@vue/shared';
- function useTree(props, emit) {
- const expandedKeySet = ref(/* @__PURE__ */ new Set());
- const currentKey = ref();
- const tree = shallowRef();
- const listRef = ref();
- const {
- isIndeterminate,
- isChecked,
- toggleCheckbox,
- getCheckedKeys,
- getCheckedNodes,
- getHalfCheckedKeys,
- getHalfCheckedNodes,
- setChecked,
- setCheckedKeys
- } = useCheck(props, tree);
- const { doFilter, hiddenNodeKeySet, isForceHiddenExpandIcon } = useFilter(props, tree);
- const valueKey = computed(() => {
- var _a;
- return ((_a = props.props) == null ? void 0 : _a.value) || TreeOptionsEnum.KEY;
- });
- const childrenKey = computed(() => {
- var _a;
- return ((_a = props.props) == null ? void 0 : _a.children) || TreeOptionsEnum.CHILDREN;
- });
- const disabledKey = computed(() => {
- var _a;
- return ((_a = props.props) == null ? void 0 : _a.disabled) || TreeOptionsEnum.DISABLED;
- });
- const labelKey = computed(() => {
- var _a;
- return ((_a = props.props) == null ? void 0 : _a.label) || TreeOptionsEnum.LABEL;
- });
- const flattenTree = computed(() => {
- var _a;
- const expandedKeys = expandedKeySet.value;
- const hiddenKeys = hiddenNodeKeySet.value;
- const flattenNodes = [];
- const nodes = ((_a = tree.value) == null ? void 0 : _a.treeNodes) || [];
- const stack = [];
- for (let i = nodes.length - 1; i >= 0; --i) {
- stack.push(nodes[i]);
- }
- while (stack.length) {
- const node = stack.pop();
- if (hiddenKeys.has(node.key))
- continue;
- flattenNodes.push(node);
- if (node.children && expandedKeys.has(node.key)) {
- for (let i = node.children.length - 1; i >= 0; --i) {
- stack.push(node.children[i]);
- }
- }
- }
- return flattenNodes;
- });
- const isNotEmpty = computed(() => {
- return flattenTree.value.length > 0;
- });
- function createTree(data) {
- const treeNodeMap = /* @__PURE__ */ new Map();
- const levelTreeNodeMap = /* @__PURE__ */ new Map();
- let maxLevel = 1;
- function traverse(nodes, level = 1, parent = void 0) {
- var _a;
- const siblings = [];
- for (const rawNode of nodes) {
- const value = getKey(rawNode);
- const node = {
- level,
- key: value,
- data: rawNode
- };
- node.label = getLabel(rawNode);
- node.parent = parent;
- const children = getChildren(rawNode);
- node.disabled = getDisabled(rawNode);
- node.isLeaf = !children || children.length === 0;
- node.expanded = expandedKeySet.value.has(value);
- if (children && children.length) {
- node.children = traverse(children, level + 1, node);
- }
- siblings.push(node);
- treeNodeMap.set(value, node);
- if (!levelTreeNodeMap.has(level)) {
- levelTreeNodeMap.set(level, []);
- }
- (_a = levelTreeNodeMap.get(level)) == null ? void 0 : _a.push(node);
- }
- if (level > maxLevel) {
- maxLevel = level;
- }
- return siblings;
- }
- const treeNodes = traverse(data);
- return {
- treeNodeMap,
- levelTreeNodeMap,
- maxLevel,
- treeNodes
- };
- }
- function filter(query) {
- const keys = doFilter(query);
- if (keys) {
- expandedKeySet.value = keys;
- }
- }
- function getChildren(node) {
- return node[childrenKey.value];
- }
- function getKey(node) {
- if (!node) {
- return "";
- }
- return node[valueKey.value];
- }
- function getDisabled(node) {
- return node[disabledKey.value];
- }
- function getLabel(node) {
- return node[labelKey.value];
- }
- function toggleExpand(node) {
- const expandedKeys = expandedKeySet.value;
- if (expandedKeys.has(node.key)) {
- collapseNode(node);
- } else {
- expandNode(node);
- }
- }
- function setExpandedKeys(keys) {
- const expandedKeys = /* @__PURE__ */ new Set();
- const nodeMap = tree.value.treeNodeMap;
- expandedKeySet.value.forEach((key) => {
- const node = nodeMap.get(key);
- expandedKeySet.value.delete(node.key);
- node.expanded = false;
- });
- keys.forEach((k) => {
- let node = nodeMap.get(k);
- while (node && !expandedKeys.has(node.key)) {
- expandedKeys.add(node.key);
- node.expanded = true;
- node = node.parent;
- }
- });
- expandedKeySet.value = expandedKeys;
- }
- function handleNodeClick(node, e) {
- emit(NODE_CLICK, node.data, node, e);
- handleCurrentChange(node);
- if (props.expandOnClickNode) {
- toggleExpand(node);
- }
- if (props.showCheckbox && (props.checkOnClickNode || node.isLeaf && props.checkOnClickLeaf) && !node.disabled) {
- toggleCheckbox(node, !isChecked(node), true);
- }
- }
- function handleNodeDrop(node, e) {
- emit(NODE_DROP, node.data, node, e);
- }
- function handleCurrentChange(node) {
- if (!isCurrent(node)) {
- currentKey.value = node.key;
- emit(CURRENT_CHANGE, node.data, node);
- }
- }
- function handleNodeCheck(node, checked) {
- toggleCheckbox(node, checked);
- }
- function expandNode(node) {
- const keySet = expandedKeySet.value;
- if (tree.value && props.accordion) {
- const { treeNodeMap } = tree.value;
- keySet.forEach((key) => {
- const treeNode = treeNodeMap.get(key);
- if (node && node.level === (treeNode == null ? void 0 : treeNode.level)) {
- keySet.delete(key);
- treeNode.expanded = false;
- }
- });
- }
- keySet.add(node.key);
- node.expanded = true;
- emit(NODE_EXPAND, node.data, node);
- }
- function collapseNode(node) {
- expandedKeySet.value.delete(node.key);
- node.expanded = false;
- emit(NODE_COLLAPSE, node.data, node);
- }
- function isDisabled(node) {
- return !!node.disabled;
- }
- function isCurrent(node) {
- const current = currentKey.value;
- return current !== void 0 && current === node.key;
- }
- function getCurrentNode() {
- var _a, _b;
- if (!currentKey.value)
- return void 0;
- return (_b = (_a = tree.value) == null ? void 0 : _a.treeNodeMap.get(currentKey.value)) == null ? void 0 : _b.data;
- }
- function getCurrentKey() {
- return currentKey.value;
- }
- function setCurrentKey(key) {
- currentKey.value = key;
- }
- function setData(data) {
- tree.value = createTree(data);
- }
- function getNode(data) {
- var _a;
- const key = isObject(data) ? getKey(data) : data;
- return (_a = tree.value) == null ? void 0 : _a.treeNodeMap.get(key);
- }
- function scrollToNode(key, strategy = "auto") {
- const node = getNode(key);
- if (node && listRef.value) {
- listRef.value.scrollToItem(flattenTree.value.indexOf(node), strategy);
- }
- }
- function scrollTo(offset) {
- var _a;
- (_a = listRef.value) == null ? void 0 : _a.scrollTo(offset);
- }
- watch(() => props.currentNodeKey, (key) => {
- currentKey.value = key;
- }, {
- immediate: true
- });
- watch(() => props.defaultExpandedKeys, (key) => {
- expandedKeySet.value = new Set(key);
- }, {
- immediate: true
- });
- watch(() => props.data, (data) => {
- setData(data);
- }, {
- immediate: true
- });
- return {
- tree,
- flattenTree,
- isNotEmpty,
- listRef,
- getKey,
- getChildren,
- toggleExpand,
- toggleCheckbox,
- isChecked,
- isIndeterminate,
- isDisabled,
- isCurrent,
- isForceHiddenExpandIcon,
- handleNodeClick,
- handleNodeDrop,
- handleNodeCheck,
- getCurrentNode,
- getCurrentKey,
- setCurrentKey,
- getCheckedKeys,
- getCheckedNodes,
- getHalfCheckedKeys,
- getHalfCheckedNodes,
- setChecked,
- setCheckedKeys,
- filter,
- setData,
- getNode,
- expandNode,
- collapseNode,
- setExpandedKeys,
- scrollToNode,
- scrollTo
- };
- }
- export { useTree };
- //# sourceMappingURL=useTree.mjs.map
|