1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180 |
- // @ts-nocheck
- import { nextTick } from 'vue'
- import { NOOP } from '@vue/shared'
- import { describe, expect, test, vi } from 'vitest'
- import { makeMountFunc } from '@element-plus/test-utils/make-mount'
- import Tree from '../src/tree.vue'
- import type {
- FilterMethod,
- TreeData,
- TreeKey,
- TreeNode,
- TreeNodeData,
- TreeOptionProps,
- } from '../src/types'
- let id = 1
- const NODE_NUMBER = 5
- const TREE_NODE_CLASS_NAME = '.el-tree-node'
- const TREE_NODE_CONTENT_CLASS_NAME = '.el-tree-node__content'
- const TREE_NODE_EXPAND_ICON_CLASS_NAME = '.el-tree-node__expand-icon'
- const getUniqueId = () => {
- return id++
- }
- const createData = (
- maxDeep,
- maxChildren,
- minNodesNumber,
- deep = 1,
- disabled = false
- ) => {
- return Array.from({ length: minNodesNumber })
- .fill(deep)
- .map(() => {
- const id = getUniqueId()
- const childrenNumber =
- deep === maxDeep ? 0 : Math.round(Math.random() * maxChildren)
- return {
- id,
- disabled: disabled ? Math.random() > 0.7 : false,
- label: `node-${id}`,
- children: childrenNumber
- ? createData(maxDeep, maxChildren, childrenNumber, deep + 1, disabled)
- : [],
- }
- })
- }
- const data = createData(4, 30, NODE_NUMBER)
- const _mount = makeMountFunc({
- components: {
- 'el-tree': Tree,
- },
- })
- interface TreeProps {
- data?: TreeData
- emptyText?: string
- height?: number
- props?: TreeOptionProps
- highlightCurrent?: boolean
- showCheckbox?: boolean
- defaultCheckedKeys?: TreeKey[]
- checkStrictly?: boolean
- defaultExpandedKeys?: TreeKey[]
- indent?: number
- iconClass?: string
- expandOnClickNode?: boolean
- checkOnClickNode?: boolean
- currentNodeKey?: TreeKey
- filterMethod?: FilterMethod
- }
- interface TreeEvents {
- onNodeClick?: (nodeData?: TreeNodeData, node?: TreeNode) => void
- onNodeExpand?: (nodeData?: TreeNodeData, node?: TreeNode) => void
- onNodeCheck?: (
- nodeData?: TreeNodeData,
- checked?: {
- checkedKeys: TreeKey[]
- checkedNodes: TreeNodeData[]
- halfCheckedKeys: TreeKey[]
- halfCheckedNodes: TreeNodeData[]
- }
- ) => void
- onCurrentChange?: (nodeData?: TreeNodeData, node?: TreeNode) => void
- onNodeContextMenu?: (
- e?: Event,
- nodeData?: TreeNodeData,
- node?: TreeNode
- ) => void
- }
- const createTree = (
- options: {
- data?: () => TreeProps
- methods?: TreeEvents
- slots?: {
- default?: string
- }
- } = {}
- ) => {
- const defaultSlot =
- (options.slots &&
- options.slots.default &&
- `<template #default="{node}">${options.slots.default}</template>`) ||
- ''
- const wrapper = _mount(
- `
- <el-tree
- ref="tree"
- :data="data"
- :empty-text="emptyText"
- :height="height"
- :props="props"
- :highlight-current="highlightCurrent"
- :show-checkbox="showCheckbox"
- :default-checked-keys="defaultCheckedKeys"
- :check-strictly="checkStrictly"
- :default-expanded-keys="defaultExpandedKeys"
- :indent="indent"
- :item-size="itemSize"
- :icon-class="iconClass"
- :expand-on-click-node="expandOnClickNode"
- :check-on-click-node="checkOnClickNode"
- :current-node-key="currentNodeKey"
- :filter-method="filterMethod"
- @node-click="onNodeClick"
- @node-expand="onNodeExpand"
- @check="onNodeCheck"
- @current-change="onCurrentChange"
- @node-contextmenu="onNodeContextMenu"
- >${defaultSlot}</el-tree>
- `,
- {
- data() {
- return {
- data,
- emptyText: undefined,
- height: undefined,
- props: {
- children: 'children',
- label: 'label',
- disabled: 'disabled',
- value: 'id',
- },
- highlightCurrent: false,
- showCheckbox: false,
- defaultCheckedKeys: undefined,
- checkStrictly: false,
- defaultExpandedKeys: undefined,
- indent: 16,
- itemSize: 26,
- iconClass: undefined,
- expandOnClickNode: true,
- checkOnClickNode: false,
- currentNodeKey: undefined,
- filterMethod: undefined,
- ...(options.data && options.data()),
- }
- },
- methods: {
- onNodeClick: NOOP,
- onNodeExpand: NOOP,
- onNodeCheck: NOOP,
- onCurrentChange: NOOP,
- onNodeContextMenu: NOOP,
- ...options.methods,
- },
- }
- )
- const treeWrapper = wrapper.findComponent(Tree)
- const vm = wrapper.vm as any
- return {
- wrapper,
- treeRef: vm.$refs.tree,
- vm,
- treeWrapper,
- treeVm: treeWrapper.vm as any,
- }
- }
- describe('Virtual Tree', () => {
- test('create', async () => {
- const { wrapper, treeVm } = createTree()
- await nextTick()
- expect(treeVm.flattenTree.length).toEqual(NODE_NUMBER)
- const iconWrapper = wrapper.find(TREE_NODE_EXPAND_ICON_CLASS_NAME)
- expect(iconWrapper.find('svg').exists()).toBeTruthy()
- })
- test('click node', async () => {
- const onNodeClick = vi.fn()
- const { wrapper, treeVm } = createTree({
- methods: {
- onNodeClick,
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[0].trigger('click')
- expect(onNodeClick).toBeCalled()
- expect(treeVm.flattenTree.length).toBeGreaterThanOrEqual(NODE_NUMBER)
- })
- test('emptyText', async () => {
- const emptyText = '暂无数据'
- const { wrapper } = createTree({
- data() {
- return {
- emptyText,
- data: [],
- }
- },
- })
- await nextTick()
- expect(wrapper.find('.el-tree__empty-text').text()).toBe(emptyText)
- })
- test('height', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- height: 300,
- }
- },
- })
- await nextTick()
- const el = wrapper.find('.el-tree-virtual-list').element as any
- expect(el.style.height).toBe('300px')
- })
- test('item-size', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- itemSize: 40,
- }
- },
- })
- await nextTick()
- const node = wrapper.find('.el-tree-node').element
- const content = wrapper.find('.el-tree-node__content').element
- expect(node.style.height).toBe('40px')
- expect(content.style.height).toBe('40px')
- })
- test('props', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- data: [
- {
- key: '1',
- text: 'node-1',
- readonly: false,
- sub: [
- {
- key: '1-1',
- text: 'node-1-1',
- readonly: false,
- },
- ],
- },
- {
- key: '2',
- text: 'node-2',
- readonly: false,
- sub: [
- {
- key: '2-1',
- text: 'node-2-1',
- },
- {
- key: '2-2',
- text: 'node-2-2',
- readonly: true,
- },
- ],
- },
- ],
- props: {
- value: 'key',
- label: 'text',
- disabled: 'readonly',
- children: 'sub',
- },
- }
- },
- })
- await nextTick()
- let nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- // test props.label
- expect(nodes[0].text()).toBe('node-1')
- expect(nodes[1].text()).toBe('node-2')
- // expand node-2
- await nodes[1].trigger('click')
- nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- // test props.children
- expect(nodes[2].text()).toBe('node-2-1')
- expect(nodes[3].text()).toBe('node-2-2')
- // test props.disabled
- expect(nodes[3].classes()).not.toContain('is-focusable')
- })
- test('highlightCurrent', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- highlightCurrent: true,
- }
- },
- })
- await nextTick()
- expect(wrapper.classes()).toContain('el-tree--highlight-current')
- })
- test('showCheckbox', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- height: 400,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- showCheckbox: true,
- }
- },
- })
- await nextTick()
- expect(wrapper.find('.el-checkbox').exists()).toBeTruthy()
- // expand all nodes
- let nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[0].trigger('click')
- nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[1].trigger('click')
- nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[4].trigger('click')
- nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- expect(nodes.length).toBe(8)
- // When node-1 is checked, all child nodes should be checked
- await nodes[0].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(7)
- // When cancel node-1 checked, all child nodes should not be checked
- await nodes[0].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(0)
- // When node-1-1 is checked, node-1-1-1 and node-1-1-2 should be checked
- await nodes[1].find('.el-checkbox').trigger('click')
- expect(
- wrapper
- .findAll(`${TREE_NODE_CLASS_NAME}.is-checked`)
- .map((el) => el.text())
- .toString()
- ).toBe(['node-1-1', 'node-1-1-1', 'node-1-1-2'].toString())
- // When cancel node-1-1, node-1-1-1 and node-1-1-2 should not be checked
- await nodes[1].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(0)
- // When node-1-1-1 is checked, node-1 and node-1-1 should be indeterminate
- await nodes[2].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(1)
- expect(wrapper.findAll('.el-checkbox .is-indeterminate').length).toBe(2)
- // When node-1-1-1 and node-1-1-2 are checked, node-1-1 should be checked, node-1 should be indeterminate
- await nodes[3].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(3)
- expect(wrapper.findAll('.el-checkbox .is-indeterminate').length).toBe(1)
- await nodes[3].find('.el-checkbox').trigger('click')
- await nodes[2].find('.el-checkbox').trigger('click')
- // test one leaf node
- // When node-1-2-1 is checked, node-1-2 should be checked
- await nodes[5].find('.el-checkbox').trigger('click')
- expect(
- wrapper
- .findAll(`${TREE_NODE_CLASS_NAME}.is-checked`)
- .map((el) => el.text())
- .toString()
- ).toBe(['node-1-2', 'node-1-2-1'].toString())
- // cancel node-1-2-1, node-1-2 should not be checked
- await nodes[5].find('.el-checkbox').trigger('click')
- expect(wrapper.findAll('.el-checkbox.is-checked').length).toBe(0)
- expect(wrapper.findAll('.el-checkbox .is-indeterminate').length).toBe(0)
- })
- test('defaultCheckedKeys', async () => {
- const { treeRef } = createTree({
- data() {
- return {
- height: 400,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- defaultCheckedKeys: ['1-1-1', '1-1-2'],
- showCheckbox: true,
- }
- },
- })
- await nextTick()
- // node-1-1 should be checked
- expect(treeRef.getCheckedKeys().length).toBe(3)
- // node-1-1 should be indeterminate
- expect(treeRef.getHalfCheckedKeys().length).toBe(1)
- })
- test('checkStrictly', async () => {
- const { treeRef, wrapper } = createTree({
- data() {
- return {
- height: 400,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- defaultCheckedKeys: ['1-1-1', '1-1-2'],
- showCheckbox: true,
- checkStrictly: true,
- }
- },
- })
- await nextTick()
- // node-1-1 should not be checked
- expect(treeRef.getCheckedKeys().length).toBe(2)
- // node-1-1 should not be indeterminate
- expect(treeRef.getHalfCheckedKeys().length).toBe(0)
- // manual
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[0].find('.el-checkbox').trigger('click')
- expect(treeRef.getCheckedKeys().length).toBe(3)
- })
- test('defaultExpandedKeys', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- height: 400,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- defaultExpandedKeys: ['1'],
- }
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- expect(nodes.length).toBe(5)
- })
- test('indent', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- indent: 20,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- defaultExpandedKeys: ['1'],
- }
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- const node = nodes[1].element.querySelector(
- TREE_NODE_CONTENT_CLASS_NAME
- ) as any
- expect(node.style.paddingLeft).toBe('20px')
- })
- test('expandOnClickNode', async () => {
- const onNodeExpand = vi.fn()
- const { wrapper } = createTree({
- data() {
- return {
- expandOnClickNode: false,
- }
- },
- methods: {
- onNodeExpand,
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[0].trigger('click')
- expect(onNodeExpand).not.toHaveBeenCalled()
- await nodes[0].find(TREE_NODE_EXPAND_ICON_CLASS_NAME).trigger('click')
- expect(onNodeExpand).toHaveBeenCalled()
- })
- test('checkOnClickNode', async () => {
- const { wrapper, treeRef } = createTree({
- data() {
- return {
- showCheckbox: true,
- expandOnClickNode: false,
- checkOnClickNode: true,
- checkStrictly: true,
- }
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[0].trigger('click')
- expect(treeRef.getCheckedKeys().toString()).toBe([1].toString())
- })
- test('currentNodeKey', async () => {
- const { wrapper } = createTree({
- data() {
- return {
- currentNodeKey: '2',
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- expect(nodes[1].classes()).toContain('is-current')
- })
- test('custom node content', async () => {
- const { wrapper } = createTree({
- slots: {
- default: `<div class="custom-tree-node-content">cc {{node.label}}</div>`,
- },
- })
- await nextTick()
- expect(wrapper.find('.custom-tree-node-content').text()).toBe('cc node-1')
- })
- test('filter', async () => {
- const { treeRef, wrapper } = createTree({
- data() {
- return {
- currentNodeKey: '2',
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- filterMethod(query: string, node: TreeNodeData) {
- return node.label.includes(query)
- },
- }
- },
- })
- await nextTick()
- treeRef.filter('node-1-1-1')
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- expect(nodes.map((node) => node.text()).toString()).toBe(
- ['node-1', 'node-1-1', 'node-1-1-1'].toString()
- )
- })
- describe('events', () => {
- test('current-change', async () => {
- const onCurrentChange = vi.fn()
- const { wrapper, vm, treeVm } = createTree({
- methods: {
- onCurrentChange,
- },
- })
- await nextTick()
- await wrapper.find(TREE_NODE_CLASS_NAME).trigger('click')
- expect(onCurrentChange).toHaveBeenCalledTimes(1)
- expect(onCurrentChange).toHaveBeenCalledWith(
- vm.data[0],
- treeVm.flattenTree[0]
- )
- })
- test('check', async () => {
- const onNodeCheck = vi.fn()
- const { wrapper } = createTree({
- data() {
- return {
- showCheckbox: true,
- defaultExpandedKeys: ['1-1', '1'],
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- methods: {
- onNodeCheck,
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[2].find('.el-checkbox').trigger('click')
- expect(onNodeCheck).toHaveBeenCalledTimes(1)
- expect(onNodeCheck).toHaveBeenCalledWith(
- { id: '1-1-1', label: 'node-1-1-1' },
- {
- checkedKeys: ['1-1-1'],
- checkedNodes: [{ id: '1-1-1', label: 'node-1-1-1' }],
- halfCheckedKeys: ['1-1', '1'],
- halfCheckedNodes: [
- {
- children: [
- { id: '1-1-1', label: 'node-1-1-1' },
- { id: '1-1-2', label: 'node-1-1-2' },
- ],
- id: '1-1',
- label: 'node-1-1',
- },
- {
- children: [
- {
- children: [
- { id: '1-1-1', label: 'node-1-1-1' },
- { id: '1-1-2', label: 'node-1-1-2' },
- ],
- id: '1-1',
- label: 'node-1-1',
- },
- {
- children: [{ id: '1-2-1', label: 'node-1-2-1' }],
- id: '1-2',
- label: 'node-1-2',
- },
- { id: '1-3', label: 'node-1-3' },
- ],
- id: '1',
- label: 'node-1',
- },
- ],
- }
- )
- })
- test('context-menu', async () => {
- const onNodeContextMenu = vi.fn()
- const { wrapper } = createTree({
- methods: {
- onNodeContextMenu,
- },
- })
- await nextTick()
- await wrapper.find(TREE_NODE_CLASS_NAME).trigger('contextmenu')
- expect(onNodeContextMenu).toHaveBeenCalledTimes(1)
- })
- })
- describe('methods', () => {
- test('getChecked', async () => {
- const { treeRef } = createTree({
- data() {
- return {
- showCheckbox: true,
- defaultCheckedKeys: ['1-1-2'],
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- })
- await nextTick()
- const checkedKeys = treeRef.getCheckedKeys()
- const checkedNodes = treeRef.getCheckedNodes()
- const halfCheckedKeys = treeRef.getHalfCheckedKeys()
- const halfCheckedNodes = treeRef.getHalfCheckedNodes()
- expect(checkedKeys.toString()).toBe(['1-1-2'].toString())
- expect(checkedNodes.map((node) => node.id).toString()).toBe(
- ['1-1-2'].toString()
- )
- expect(halfCheckedKeys.toString()).toBe(['1-1', '1'].toString())
- expect(halfCheckedNodes.map((node) => node.id).toString()).toBe(
- ['1-1', '1'].toString()
- )
- })
- test('setCheckedKeys', async () => {
- const { treeRef } = createTree({
- data() {
- return {
- showCheckbox: true,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- })
- await nextTick()
- treeRef.setCheckedKeys(['1-1'])
- await nextTick()
- const checkedKeys = treeRef.getCheckedKeys()
- const halfCheckedKeys = treeRef.getHalfCheckedKeys()
- expect(checkedKeys.toString()).toBe(['1-1', '1-1-1', '1-1-2'].toString())
- expect(halfCheckedKeys.toString()).toBe(['1'].toString())
- })
- test('setChecked', async () => {
- const { treeRef } = createTree({
- data() {
- return {
- showCheckbox: true,
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- })
- await nextTick()
- treeRef.setChecked('1-1', true)
- const checkedKeys = treeRef.getCheckedKeys()
- const halfCheckedKeys = treeRef.getHalfCheckedKeys()
- expect(checkedKeys.toString()).toBe(['1-1', '1-1-1', '1-1-2'].toString())
- expect(halfCheckedKeys.toString()).toBe(['1'].toString())
- })
- test('getCurrent', async () => {
- const { treeRef, wrapper } = createTree({
- data() {
- return {
- defaultExpandedKeys: ['1', '1-1'],
- data: [
- {
- id: '1',
- label: 'node-1',
- children: [
- {
- id: '1-1',
- label: 'node-1-1',
- children: [
- {
- id: '1-1-1',
- label: 'node-1-1-1',
- },
- {
- id: '1-1-2',
- label: 'node-1-1-2',
- },
- ],
- },
- {
- id: '1-2',
- label: 'node-1-2',
- children: [
- {
- id: '1-2-1',
- label: 'node-1-2-1',
- },
- ],
- },
- {
- id: '1-3',
- label: 'node-1-3',
- },
- ],
- },
- {
- id: '2',
- label: 'node-2',
- },
- ],
- }
- },
- })
- await nextTick()
- const nodes = wrapper.findAll(TREE_NODE_CLASS_NAME)
- await nodes[2].trigger('click')
- expect(treeRef.getCurrentNode()).toMatchObject({
- id: '1-1-1',
- label: 'node-1-1-1',
- })
- expect(treeRef.getCurrentKey()).toBe('1-1-1')
- treeRef.setCurrentKey('1-1-2')
- expect(treeRef.getCurrentNode()).toMatchObject({
- id: '1-1-2',
- label: 'node-1-1-2',
- })
- expect(treeRef.getCurrentKey()).toBe('1-1-2')
- })
- })
- })
|