mirror of
https://gitee.com/baidu/amis.git
synced 2024-12-05 05:28:37 +08:00
2808790a96
避免父节点是部分选中而祖先节点是未选中状态的问题
180 lines
4.2 KiB
TypeScript
180 lines
4.2 KiB
TypeScript
import React from 'react';
|
|
import {
|
|
fireEvent,
|
|
render,
|
|
waitFor,
|
|
screen,
|
|
within
|
|
} from '@testing-library/react';
|
|
import {render as amisRender} from '../../../src';
|
|
import {makeEnv} from '../../helper';
|
|
|
|
const items = [
|
|
{
|
|
name: '手机维修',
|
|
children: [
|
|
{
|
|
name: '苹果',
|
|
children: [
|
|
{
|
|
name: 'iphone系列'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: '华为',
|
|
children: [
|
|
{
|
|
name: 'mate系列'
|
|
},
|
|
{
|
|
name: 'p系列'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
];
|
|
|
|
const getExpandBtnByText = (text: string) => {
|
|
const tdElement = screen.getByText(text).parentElement as HTMLElement;
|
|
|
|
return tdElement.querySelector('.cxd-Table-expandBtn2') as HTMLAnchorElement;
|
|
};
|
|
|
|
const getCheckMeBtnByText = (text: string) => {
|
|
const trElement = screen.getByText(text).parentElement!
|
|
.parentElement as HTMLElement;
|
|
|
|
return within(trElement!).getByRole('checkbox');
|
|
};
|
|
|
|
const renderTable = () =>
|
|
render(
|
|
amisRender(
|
|
{
|
|
type: 'crud',
|
|
headerToolbar: ['bulkActions'],
|
|
bulkActions: [
|
|
{
|
|
type: 'button',
|
|
label: '批量操作'
|
|
}
|
|
],
|
|
footable: {
|
|
expand: 'first'
|
|
},
|
|
data: {
|
|
items
|
|
},
|
|
columns: [
|
|
{
|
|
name: 'name',
|
|
label: 'name'
|
|
}
|
|
]
|
|
},
|
|
{},
|
|
makeEnv({})
|
|
)
|
|
);
|
|
|
|
describe('层级选择', () => {
|
|
it('选择根节点,所有后代节点都会自动选中', async () => {
|
|
renderTable();
|
|
const checkMeFirst = getCheckMeBtnByText('手机维修');
|
|
|
|
expect(checkMeFirst).toBeInTheDocument();
|
|
|
|
// 选中一级节点
|
|
fireEvent.click(checkMeFirst);
|
|
|
|
// 一级节点选中
|
|
await waitFor(() => {
|
|
expect(checkMeFirst).toBeChecked();
|
|
});
|
|
|
|
const checkMeSecond1 = getCheckMeBtnByText('苹果');
|
|
const checkMeSecond2 = getCheckMeBtnByText('华为');
|
|
|
|
// 二级节点选中
|
|
expect(checkMeSecond1).toBeChecked();
|
|
expect(checkMeSecond2).toBeChecked();
|
|
|
|
const expandSecond1 = getExpandBtnByText('苹果');
|
|
|
|
expect(expandSecond1).toBeInTheDocument();
|
|
|
|
fireEvent.click(expandSecond1);
|
|
|
|
const checkMeThird1 = getCheckMeBtnByText('iphone系列');
|
|
|
|
// 三级节点选中
|
|
await waitFor(() => {
|
|
expect(checkMeThird1).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('选择所有子节点,所有祖先点选中', async () => {
|
|
renderTable();
|
|
const expandSecond1 = getExpandBtnByText('苹果');
|
|
|
|
// 展开三级节点
|
|
fireEvent.click(expandSecond1);
|
|
const checkMeThird1 = getCheckMeBtnByText('iphone系列');
|
|
|
|
await waitFor(() => {
|
|
expect(checkMeThird1).toBeInTheDocument();
|
|
});
|
|
|
|
fireEvent.click(checkMeThird1);
|
|
|
|
const checkMeSecond1 = getCheckMeBtnByText('苹果');
|
|
const checkMeFirst = getCheckMeBtnByText('手机维修');
|
|
|
|
await waitFor(() => {
|
|
expect(checkMeSecond1).toBeChecked();
|
|
expect(checkMeSecond1.parentElement!.classList).toContain(
|
|
'cxd-Checkbox--full'
|
|
);
|
|
});
|
|
|
|
// 根节点下包含苹果和华为两个节点
|
|
// 华为节点是未选中,所以根节点应该显示部分选中的样式
|
|
expect(checkMeFirst).toBeChecked();
|
|
expect(checkMeFirst.parentElement!.classList).not.toContain(
|
|
'cxd-Checkbox--full'
|
|
);
|
|
});
|
|
|
|
it('选择部分子节点,所有祖先点选中,但选中状态是部分选中', async () => {
|
|
renderTable();
|
|
const expandSecond2 = getExpandBtnByText('华为');
|
|
|
|
// 展开三级节点
|
|
fireEvent.click(expandSecond2);
|
|
const checkMeThird1 = getCheckMeBtnByText('mate系列');
|
|
|
|
await waitFor(() => {
|
|
expect(checkMeThird1).toBeInTheDocument();
|
|
});
|
|
|
|
fireEvent.click(checkMeThird1);
|
|
|
|
const checkMeSecond2 = getCheckMeBtnByText('华为');
|
|
const checkMeFirst = getCheckMeBtnByText('手机维修');
|
|
|
|
await waitFor(() => {
|
|
expect(checkMeSecond2).toBeChecked();
|
|
expect(checkMeSecond2.parentElement!.classList).not.toContain(
|
|
'cxd-Checkbox--full'
|
|
);
|
|
});
|
|
|
|
expect(checkMeFirst).toBeChecked();
|
|
expect(checkMeFirst.parentElement!.classList).not.toContain(
|
|
'cxd-Checkbox--full'
|
|
);
|
|
});
|
|
});
|