Files
ctms/frontend/src/views/detailBreadcrumbContext.test.ts
T
Cheng Zhou 90ca061db8 优化文档管理与导航体验
1、为文档增加编辑接口和前端编辑抽屉,文档列表与详情页统一按创建、更新、删除权限展示操作。

2、将文档版本上传和分发改为抽屉交互,并在详情页补充版本删除权限检查。

3、增强全局面包屑上下文和详情页标题同步,避免详情页重复或缺失导航信息。

4、按项目权限过滤快捷入口、首页费用指标和 eTMF 新建入口,并补充对应前端测试。
2026-06-04 11:11:28 +08:00

67 lines
3.2 KiB
TypeScript

import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { describe, expect, it } from "vitest";
const readView = (path: string) => readFileSync(resolve(__dirname, path), "utf8");
describe("detail breadcrumb contexts", () => {
it("uses contract numbers for contract fee detail breadcrumbs", () => {
const source = readView("./fees/ContractFeeDetail.vue");
expect(source).toContain("study.setViewContext({");
expect(source).toContain("siteName");
expect(source).toContain("pageTitle: detail.contract_no || TEXT.menu.feeContracts");
});
it("uses shipment tracking or batch numbers for drug shipment detail breadcrumbs", () => {
const source = readView("./drug/ShipmentDetail.vue");
expect(source).toContain("study.setViewContext({");
expect(source).toContain("siteName: detail.site_name || TEXT.common.fallback");
expect(source).toContain("pageTitle: detail.tracking_no || detail.batch_no || TEXT.modules.drugShipments.detailTitle");
});
it("uses equipment names for material equipment detail breadcrumbs", () => {
const source = readView("./materials/MaterialEquipmentDetail.vue");
expect(source).toContain("study.setViewContext({");
expect(source).toContain("pageTitle: detail.name || TEXT.modules.materialEquipment.detailTitle");
});
it("uses subject numbers and centers for subject detail breadcrumbs", () => {
const source = readView("./subjects/SubjectDetail.vue");
expect(source).toContain("study.setViewContext({");
expect(source).toContain("siteName: siteMap.value[detail.site_id] || TEXT.common.fallback");
expect(source).toContain("pageTitle: detail.subject_no || TEXT.modules.subjectManagement.screeningNo");
});
it("uses startup record identifiers for startup detail breadcrumbs", () => {
const feasibility = readView("./startup/FeasibilityDetail.vue");
const ethics = readView("./startup/EthicsDetail.vue");
const kickoff = readView("./startup/KickoffDetail.vue");
const training = readView("./startup/TrainingDetail.vue");
expect(feasibility).toContain("pageTitle: detail.project_no ||");
expect(ethics).toContain("pageTitle: detail.approval_no ||");
expect(kickoff).toContain("pageTitle: siteInfo.name ? `${siteInfo.name} ${TEXT.modules.startupMeetingAuth.kickoffTab}`");
expect(training).toContain("pageTitle: detail.name || TEXT.modules.startupMeetingAuth.trainingDetailTitle");
});
it("uses knowledge item titles for knowledge detail breadcrumbs", () => {
const precaution = readView("./knowledge/PrecautionDetail.vue");
const faq = readView("./FaqDetail.vue");
expect(precaution).toContain("pageTitle: detail.title || TEXT.modules.knowledgeNotes.detailTitle");
expect(faq).toContain("const questionTitle = String(faqData.question || \"\").trim()");
expect(faq).toContain("pageTitle: questionTitle ? questionTitle.slice(0, 24) : TEXT.modules.knowledgeMedicalConsult.detailTitle");
});
it("uses project names for admin project detail breadcrumbs", () => {
const source = readView("./admin/ProjectDetail.vue");
expect(source).toContain("studyStore.setViewContext({");
expect(source).toContain("pageTitle: project.value.name || TEXT.modules.adminProjects.detailTitle");
});
});