重构 PC 首页与报销列表降噪(frontend-simplification-refactor)
这个提交包含在:
@@ -36,8 +36,10 @@ test("E2E 公告与团队状态:公告可见 + 今日状态更新 + Portal 汇
|
||||
await page.getByRole("button", { name: "保存状态" }).click();
|
||||
await expect(page.getByText("今日状态已更新")).toBeVisible({ timeout: 30_000 });
|
||||
await page.goto("/portal");
|
||||
await page.locator("summary").filter({ hasText: "团队与通知" }).click();
|
||||
await page.getByRole("tab", { name: "公告" }).click();
|
||||
await expect(page.getByText(announcementTitle)).toBeVisible();
|
||||
await page.locator("summary").filter({ hasText: "更多入口" }).click();
|
||||
await expect(page.locator('[aria-label="portal-card-today_presence"]')).toBeVisible();
|
||||
|
||||
await logout(page, EMPLOYEE.name);
|
||||
|
||||
@@ -24,7 +24,7 @@ type Envelope<T> = {
|
||||
export async function assertPortalLoaded(page: Page) {
|
||||
await expect(page).toHaveURL(/\/portal/);
|
||||
await expect(page.getByRole("link", { name: "Portal" }).first()).toBeVisible();
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
}
|
||||
|
||||
export async function assertForbiddenPage(page: Page) {
|
||||
|
||||
@@ -512,25 +512,26 @@ test("Portal 员工视角优先显示今日动作顺序", async ({ page }) => {
|
||||
|
||||
await login(page, EMPLOYEE);
|
||||
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByText("当前焦点")).toBeVisible();
|
||||
await expect(page.getByText("下一步")).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: "新建报销" })).toBeVisible();
|
||||
|
||||
await page.locator("summary").filter({ hasText: "更多入口" }).click();
|
||||
const labels = await page.locator('[aria-label^="portal-card-"]').evaluateAll((nodes) =>
|
||||
nodes.map((node) => node.getAttribute("aria-label")),
|
||||
);
|
||||
expect(labels).toEqual([
|
||||
expect(labels.slice(0, 4)).toEqual([
|
||||
"portal-card-my_todos",
|
||||
"portal-card-today_presence",
|
||||
"portal-card-my_weekly_report",
|
||||
"portal-card-my_projects",
|
||||
]);
|
||||
|
||||
await expect(page.locator("summary").filter({ hasText: "更多入口" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "团队与通知" })).toBeVisible();
|
||||
await page.locator("summary").filter({ hasText: "团队与通知" }).click();
|
||||
await expect(page.getByRole("tab", { name: "公告" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "常用" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "团队状态" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今天先处理" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "通知" })).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -544,19 +545,21 @@ test("Portal 管理视角重排正确,更多入口默认折叠", async ({ page
|
||||
|
||||
await login(page, MANAGER);
|
||||
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: "处理待办" })).toBeVisible();
|
||||
|
||||
await page.locator("summary").filter({ hasText: "角色重点" }).click();
|
||||
const labels = await page.locator('[aria-label^="portal-card-"]').evaluateAll((nodes) =>
|
||||
nodes.map((node) => node.getAttribute("aria-label")),
|
||||
);
|
||||
expect(labels).toEqual([
|
||||
expect(labels.slice(0, 4)).toEqual([
|
||||
"portal-card-pending_approvals",
|
||||
"portal-card-team_presence",
|
||||
"portal-card-weekly_missing",
|
||||
"portal-card-weekly_help",
|
||||
]);
|
||||
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "团队与通知" })).toBeVisible();
|
||||
await expect(page.getByText("试点观测摘要")).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: "采购申请" })).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: "差旅申请" })).not.toBeVisible();
|
||||
@@ -636,7 +639,7 @@ test("Portal bootstrap refresh 首次瞬时失败后重试成功仍保留登录
|
||||
await page.goto("/portal");
|
||||
|
||||
await expect(page).toHaveURL(/\/portal/);
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
expect(refreshAttempts).toBeGreaterThanOrEqual(2);
|
||||
});
|
||||
|
||||
@@ -650,7 +653,9 @@ test("Portal 域管理角色也进入经理视图", async ({ page }) => {
|
||||
|
||||
await login(page, EMPLOYEE);
|
||||
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点" })).toBeVisible();
|
||||
await page.locator("summary").filter({ hasText: "角色重点" }).click();
|
||||
await expect(page.locator('[aria-label="portal-card-pending_approvals"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-team_presence"]')).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -194,8 +194,10 @@ test("R70 深层自动辅助试运行:周报待办、公告团队状态、真
|
||||
await expect(page.getByText("今日状态已更新")).toBeVisible({ timeout: 30_000 });
|
||||
|
||||
await page.goto("/portal");
|
||||
await page.locator("summary").filter({ hasText: "团队与通知" }).click();
|
||||
await page.getByRole("tab", { name: "公告" }).click();
|
||||
await expect(page.getByText(announcementTitle)).toBeVisible({ timeout: 30_000 });
|
||||
await page.locator("summary").filter({ hasText: "更多入口" }).click();
|
||||
await expect(page.locator('[aria-label="portal-card-today_presence"]')).toBeVisible();
|
||||
return announcementTitle;
|
||||
});
|
||||
|
||||
@@ -316,7 +316,8 @@ test("PC 核心工作流 Wave2 视觉截图", async ({ page }) => {
|
||||
await page.getByTestId("login-password").fill(visualUser.password);
|
||||
await page.getByTestId("login-submit").click();
|
||||
await expect(page).toHaveURL(/\/portal/);
|
||||
await expect(page.locator('[aria-label="portal-card-pending_approvals"]')).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByRole("link", { name: "处理待办" })).toBeVisible();
|
||||
await capture(page, "02-portal");
|
||||
|
||||
await page.goto("/reimbursements?status=reviewing&scope=all");
|
||||
|
||||
@@ -323,7 +323,8 @@ test.describe("R102 reimbursement main flow", () => {
|
||||
await expect(page.getByTestId("reimbursement-row").getByText(formNumber)).toBeVisible();
|
||||
await expect(page.getByText(reimbursementId)).toHaveCount(0);
|
||||
|
||||
await page.getByRole("button", { name: "删除" }).first().click();
|
||||
await page.getByRole("button", { name: "更多" }).first().click();
|
||||
await page.getByRole("menuitem", { name: "删除草稿" }).click();
|
||||
await expect(page.getByTestId("action-confirm-dialog")).toContainText(formNumber);
|
||||
await page.getByTestId("action-confirm-submit").click();
|
||||
await expect(page.getByTestId("reimbursement-row")).toHaveCount(0);
|
||||
|
||||
@@ -120,7 +120,7 @@ test.describe("R105 pretrial visual acceptance", () => {
|
||||
await loginLiveUser(page, "employee");
|
||||
|
||||
await page.goto("/portal");
|
||||
await expect(page.locator('[aria-label^="portal-card-"]').first()).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expectNoLegacyDesignCopy(page);
|
||||
await page.screenshot({ path: screenshotPath("desktop-portal.png"), fullPage: true });
|
||||
|
||||
|
||||
@@ -277,17 +277,20 @@ test.describe("R7E 全站高风险操作二次确认", () => {
|
||||
await page.goto("/reimbursements");
|
||||
await expect(page.getByTestId("reimbursements-table")).toBeVisible();
|
||||
|
||||
await page.getByTestId("reimbursement-row").getByRole("button", { name: "删除" }).click();
|
||||
await page.getByTestId("reimbursement-row").getByRole("button", { name: "更多" }).click();
|
||||
await page.getByRole("menuitem", { name: "删除草稿" }).click();
|
||||
await expect(page.getByTestId("action-confirm-dialog")).toContainText("删除后无法恢复");
|
||||
expect(calls.deleteReimbursement).toBe(0);
|
||||
|
||||
await page.getByTestId("action-confirm-cancel").click();
|
||||
expect(calls.deleteReimbursement).toBe(0);
|
||||
|
||||
await page.getByTestId("reimbursement-row").getByRole("button", { name: "删除" }).click();
|
||||
await page.getByTestId("reimbursement-row").getByRole("button", { name: "更多" }).click();
|
||||
await page.getByRole("menuitem", { name: "删除草稿" }).click();
|
||||
await page.getByTestId("action-confirm-submit").click();
|
||||
await expect.poll(() => calls.deleteReimbursement).toBe(1);
|
||||
|
||||
await page.getByRole("button", { name: "高级 / 台账" }).click();
|
||||
await page.getByTestId("reimbursements-export").click();
|
||||
await page.getByTestId("reimbursements-export-csv").click();
|
||||
await expect(page.getByTestId("action-confirm-dialog")).toContainText("导出文件可能包含业务或个人信息");
|
||||
|
||||
@@ -20,12 +20,11 @@ test.describe("visual portal", () => {
|
||||
await page.setViewportSize({ width: 1440, height: 1200 });
|
||||
await login(page, EMPLOYEE);
|
||||
|
||||
await expect(page.locator('[aria-label="portal-card-my_todos"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-today_presence"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-my_weekly_report"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-my_projects"]')).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "我的申请与资产 / 继续工作" })).toBeVisible();
|
||||
await expect(page.getByRole("tab", { name: "公告" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByText("当前焦点")).toBeVisible();
|
||||
await expect(page.getByText("下一步")).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "团队与通知" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "更多入口" })).toBeVisible();
|
||||
|
||||
await attachScreenshot(page, testInfo, "portal-employee.png");
|
||||
});
|
||||
@@ -35,12 +34,11 @@ test.describe("visual portal", () => {
|
||||
await login(page, ADMIN);
|
||||
|
||||
await expect(page.locator('[aria-label="portal-card-pending_approvals"]')).toHaveCount(0);
|
||||
await expect(page.locator('[aria-label="portal-card-team_presence"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-weekly_missing"]')).toBeVisible();
|
||||
await expect(page.locator('[aria-label="portal-card-weekly_help"]')).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点 / 常用入口" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByText("下一步")).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "团队与通知" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点" })).toBeVisible();
|
||||
await expect(page.getByText("试点观测摘要")).toBeVisible();
|
||||
await expect(page.getByRole("tab", { name: "公告" })).toBeVisible();
|
||||
|
||||
await attachScreenshot(page, testInfo, "portal-admin.png");
|
||||
await logout(page, ADMIN.name);
|
||||
@@ -51,8 +49,8 @@ test.describe("visual portal", () => {
|
||||
await login(page, FINANCE);
|
||||
|
||||
await expect(page.getByText("财务工作台")).toBeVisible();
|
||||
await expect(page.getByText("财务处理")).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点 / 常用入口" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "角色重点" })).toBeVisible();
|
||||
|
||||
await attachScreenshot(page, testInfo, "portal-finance.png");
|
||||
await logout(page, FINANCE.name);
|
||||
|
||||
@@ -334,15 +334,17 @@ test.describe("visual shell", () => {
|
||||
await page.setViewportSize({ width: 1440, height: 1024 });
|
||||
await loginVisualUser(page);
|
||||
|
||||
await expect(page.getByRole("heading", { name: "今天先处理" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "常用动作" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "今日任务" })).toBeVisible();
|
||||
await expect(page.getByText("下一步")).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: "团队与通知" })).toBeVisible();
|
||||
await expect(page.locator("summary").filter({ hasText: /角色重点|更多入口/ })).toBeVisible();
|
||||
await attachScreenshot(page, testInfo, "pc-portal-wave1.png");
|
||||
|
||||
await page.goto("/reimbursements");
|
||||
await expect(page.getByRole("heading", { name: "我的报销" })).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursements-create")).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursements-export")).toBeVisible();
|
||||
await expect(page.getByRole("button", { name: "高级 / 台账" })).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursements-export")).not.toBeVisible();
|
||||
await expect(page.getByTestId("reimbursements-status-tabs")).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursements-table")).toBeVisible();
|
||||
await attachScreenshot(page, testInfo, "pc-reimbursements-wave1.png");
|
||||
|
||||
在新工单中引用
屏蔽一个用户