diff --git a/src/app/record-detail.test.ts b/src/app/record-detail.test.ts new file mode 100644 index 0000000..3dd8383 --- /dev/null +++ b/src/app/record-detail.test.ts @@ -0,0 +1,41 @@ +import { describe, it, expect } from "vitest"; +import { pickRecordTitle, formatCellValue } from "./record-detail"; +import type { DataRow } from "./table-filters"; + +describe("pickRecordTitle", () => { + it("prefers 生产订单号", () => { + const row: DataRow = { 生产订单号: "PO-1", 总排号: "X", ID: 1 }; + expect(pickRecordTitle(row)).toBe("PO-1"); + }); + it("falls back to 总排号 when 生产订单号 blank", () => { + const row: DataRow = { 生产订单号: " ", 总排号: "X-9", ID: 1 }; + expect(pickRecordTitle(row)).toBe("X-9"); + }); + it("falls back to ID when earlier are null/empty", () => { + const row: DataRow = { 生产订单号: null, 总排号: "", ID: 42 }; + expect(pickRecordTitle(row)).toBe("42"); + }); + it("returns (未命名) when all blank", () => { + const row: DataRow = { 生产订单号: null, 总排号: null, ID: null }; + expect(pickRecordTitle(row)).toBe("(未命名)"); + }); +}); + +describe("formatCellValue", () => { + it("null -> em dash", () => { + expect(formatCellValue(null)).toBe("—"); + }); + it("empty / whitespace -> em dash", () => { + expect(formatCellValue("")).toBe("—"); + expect(formatCellValue(" ")).toBe("—"); + }); + it("0 is NOT blank", () => { + expect(formatCellValue(0)).toBe("0"); + }); + it("number stringified", () => { + expect(formatCellValue(123)).toBe("123"); + }); + it("text preserved", () => { + expect(formatCellValue("量程0-1.6MPa")).toBe("量程0-1.6MPa"); + }); +}); diff --git a/src/app/record-detail.ts b/src/app/record-detail.ts new file mode 100644 index 0000000..e7ccb3a --- /dev/null +++ b/src/app/record-detail.ts @@ -0,0 +1,26 @@ +import type { DataRow } from "./table-filters"; + +/** + * 取记录的友好标识(用于详情 Modal 标题)。 + * 优先级:生产订单号 > 总排号 > ID > (未命名)。 + */ +export function pickRecordTitle(record: DataRow): string { + for (const key of ["生产订单号", "总排号", "ID"]) { + const v = record[key]; + if (v !== null && v !== undefined && String(v).trim() !== "") { + return String(v); + } + } + return "(未命名)"; +} + +/** + * 格式化单元格值用于详情 Modal 完整展示。 + * null / 空串 / 纯空白 -> "—";其余 String(value)。0 视为非空(与 isBlank 一致)。 + */ +export function formatCellValue(value: string | number | null): string { + if (value === null || value === undefined) return "—"; + const s = String(value); + if (s.trim() === "") return "—"; + return s; +}