feat(board): 支持批量添加与批量删除任务
- 批量添加面板:一行一条,整批共用目标列、优先级、标签与截止日期 - 快速新增支持粘贴多行文本,直接拆成多条任务 - 多选模式支持全选可见任务、整批删除,撤销时连原顺序一起还原 - 批量创建与删除走 store 的批量方法,一次落盘、一次广播 - 补充单元测试与 E2E 用例
This commit is contained in:
@@ -92,6 +92,66 @@ test('编辑任务时可以直接选已有标签', async ({ page }) => {
|
||||
await expect(page.locator('article').filter({ hasText: '任务乙' })).toContainText('#设计')
|
||||
})
|
||||
|
||||
/**
|
||||
* 批量添加要打通「工具栏 → 抽屉 → store → 看板」四层,单测只到组件边界,
|
||||
* 所以这里走一遍真实点击:填清单、改目标列、提交、刷新后仍存在。
|
||||
*/
|
||||
test('批量添加:一次录入多行并出现在看板上', async ({ page }) => {
|
||||
await page.getByRole('button', { name: '批量添加' }).click()
|
||||
|
||||
const list = page.getByLabel('批量任务清单')
|
||||
// 打开面板就该能直接粘贴,焦点应落在清单上
|
||||
await expect(list).toBeFocused()
|
||||
|
||||
await list.fill('- 写周报\n- 评审 PR\n- 回归测试')
|
||||
await page.getByRole('dialog').getByRole('button', { name: '进行中' }).click()
|
||||
await page.getByRole('dialog').getByRole('button', { name: '高' }).click()
|
||||
await page.getByRole('button', { name: '添加 3 个任务' }).click()
|
||||
|
||||
await expect(page.getByText('已添加 3 个任务')).toBeVisible()
|
||||
|
||||
const doing = page.locator('[data-column-id="doing"] article')
|
||||
await expect(doing).toHaveCount(3)
|
||||
// 卡片顺序与清单顺序一致(第 1 行在最上面)
|
||||
expect(await doing.locator('h3').allInnerTexts()).toEqual(['写周报', '评审 PR', '回归测试'])
|
||||
|
||||
await page.reload()
|
||||
await expect(doing).toHaveCount(3)
|
||||
})
|
||||
|
||||
/**
|
||||
* 批量删除同样跨了「工具栏 → 卡片多选 → 操作条 → store → Toast」,
|
||||
* 关键要验证三件事:勾选能选/能取消、删除后整批消失、撤销能还原。
|
||||
*/
|
||||
test('批量删除:多选后整批删除,撤销可还原', async ({ page }) => {
|
||||
await addTask(page, '任务一')
|
||||
await addTask(page, '任务二')
|
||||
await addTask(page, '任务三')
|
||||
|
||||
await page.getByRole('button', { name: '多选', exact: true }).click()
|
||||
await expect(page.getByText('已选 0 个任务')).toBeVisible()
|
||||
|
||||
await page.getByRole('button', { name: '全选 3 个' }).click()
|
||||
await expect(page.getByText('已选 3 个任务')).toBeVisible()
|
||||
|
||||
// 再点一张取消勾选,验证「点选 / 取消」这一对行为
|
||||
await page.locator('[data-column-id="todo"] article').filter({ hasText: '任务二' }).click()
|
||||
await expect(page.getByText('已选 2 个任务')).toBeVisible()
|
||||
|
||||
await page.getByRole('button', { name: '删除 2 个' }).click()
|
||||
await expect(page.getByText('已删除 2 个任务')).toBeVisible()
|
||||
|
||||
const cards = page.locator('[data-column-id="todo"] article')
|
||||
await expect(cards).toHaveCount(1)
|
||||
await expect(cards.first()).toContainText('任务二')
|
||||
|
||||
await page.getByRole('button', { name: '撤销' }).click()
|
||||
await expect(cards).toHaveCount(3)
|
||||
|
||||
await page.reload()
|
||||
await expect(cards).toHaveCount(3)
|
||||
})
|
||||
|
||||
test('删除后可撤销', async ({ page }) => {
|
||||
await addTask(page, '待删除任务')
|
||||
await page.locator('article').filter({ hasText: '待删除任务' }).click()
|
||||
|
||||
Reference in New Issue
Block a user