Show localized creation and completion dates directly on task cards. - Render compact, locale-aware lifecycle timestamps with accessible full-date titles. - Persist archive timestamps for completed archived-task fallbacks and add coverage. - Add translated labels, documentation, and a minor release changeset. Files changed: .changeset/fn-8561-task-card-dates.md | 7 +++ docs/dashboard-guide.md | 1 + .../__tests__/archive-entry-serialization.test.ts | 35 ++++++++++++++ packages/core/src/task-store/serialization.ts | 8 ++++ packages/core/src/types/task-core.ts | 5 ++ packages/dashboard/app/components/TaskCard.css | 27 +++++++++++ packages/dashboard/app/components/TaskCard.tsx | 55 ++++++++++++++++++++++ .../__tests__/TaskCard.host-inventory.test.tsx | 21 +++++++++ .../app/components/__tests__/TaskCard.test.tsx | 17 +++++++ .../dashboard/app/i18n/__tests__/format.test.ts | 19 +++++++- packages/dashboard/app/i18n/format.ts | 38 +++++++++++++++ packages/i18n/locales/en/app.json | 4 ++ packages/i18n/locales/es/app.json | 4 ++ packages/i18n/locales/fr/app.json | 4 ++ packages/i18n/locales/ko/app.json | 4 ++ packages/i18n/locales/zh-CN/app.json | 4 ++ packages/i18n/locales/zh-TW/app.json | 4 ++ 17 files changed, 256 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-8561 Fusion-Task-Lineage: 474b949b-d8e7-469a-b564-00acae66e58a Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
22 lines
744 B
TypeScript
22 lines
744 B
TypeScript
import { readFileSync } from "node:fs";
|
|
import { fileURLToPath } from "node:url";
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
const taskCardHosts = [
|
|
"../Column.tsx",
|
|
"../DockTaskList.tsx",
|
|
"../useRightDockController.tsx",
|
|
"../WorktreeGroup.tsx",
|
|
"../dashboard/MainContent.tsx",
|
|
] as const;
|
|
|
|
describe("TaskCard host inventory (FN-8561)", () => {
|
|
it("keeps every shared-card host delegated to the canonical TaskCard", () => {
|
|
for (const relativePath of taskCardHosts) {
|
|
const source = readFileSync(fileURLToPath(new URL(relativePath, import.meta.url)), "utf8");
|
|
expect(source, relativePath).toMatch(/import\s+\{\s*TaskCard\s*\}\s+from/);
|
|
expect(source, relativePath).toMatch(/<TaskCard\b/);
|
|
}
|
|
});
|
|
});
|