From c2f0d811e76323a7bea96d3762fd5deade0fd8cf Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 30 May 2026 07:12:51 -0400 Subject: [PATCH] fix(ui): guard next run weekday formatting --- ui/src/ui/presenter.test.ts | 13 +++++++++++++ ui/src/ui/presenter.ts | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 ui/src/ui/presenter.test.ts diff --git a/ui/src/ui/presenter.test.ts b/ui/src/ui/presenter.test.ts new file mode 100644 index 00000000000..19e4f4d9ecf --- /dev/null +++ b/ui/src/ui/presenter.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; +import { formatNextRun } from "./presenter.ts"; + +describe("formatNextRun", () => { + it("returns n/a for Date-invalid finite timestamps", () => { + expect(formatNextRun(8_640_000_000_000_001)).toBe("n/a"); + }); + + it("formats valid timestamps with weekday context", () => { + expect(formatNextRun(0)).toBe("n/a"); + expect(formatNextRun(1_700_000_000_000)).toContain(","); + }); +}); diff --git a/ui/src/ui/presenter.ts b/ui/src/ui/presenter.ts index c0e3c42a13d..95aa981400e 100644 --- a/ui/src/ui/presenter.ts +++ b/ui/src/ui/presenter.ts @@ -1,6 +1,7 @@ import { t } from "../i18n/index.ts"; import { resolveCronJobLastRunStatus } from "./cron-status.ts"; import { + formatDateMs, formatRelativeTimestamp, formatDurationHuman, formatMs, @@ -25,7 +26,10 @@ export function formatNextRun(ms?: number | null) { if (!ms) { return t("common.na"); } - const weekday = new Date(ms).toLocaleDateString(undefined, { weekday: "short" }); + const weekday = formatDateMs(ms, { weekday: "short" }); + if (weekday === t("common.na")) { + return weekday; + } return `${weekday}, ${formatMs(ms)} (${formatRelativeTimestamp(ms)})`; }