90ca061db8
1、为文档增加编辑接口和前端编辑抽屉,文档列表与详情页统一按创建、更新、删除权限展示操作。 2、将文档版本上传和分发改为抽屉交互,并在详情页补充版本删除权限检查。 3、增强全局面包屑上下文和详情页标题同步,避免详情页重复或缺失导航信息。 4、按项目权限过滤快捷入口、首页费用指标和 eTMF 新建入口,并补充对应前端测试。
67 lines
3.2 KiB
TypeScript
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");
|
|
});
|
|
});
|