From 5589acdcb6c1e089b31684364de8b1d9e3115c51 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 19 Aug 2026 14:43:37 -0500 Subject: [PATCH] Preserve year-only date issued values --- .../resource/FullDetailsTable.test.tsx | 36 +++++++++++++++++++ .../components/resource/FullDetailsTable.tsx | 9 ++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/frontend/src/__tests__/components/resource/FullDetailsTable.test.tsx b/frontend/src/__tests__/components/resource/FullDetailsTable.test.tsx index efc6c7cf..ea9326cf 100644 --- a/frontend/src/__tests__/components/resource/FullDetailsTable.test.tsx +++ b/frontend/src/__tests__/components/resource/FullDetailsTable.test.tsx @@ -264,6 +264,42 @@ describe('FullDetailsTable', () => { expect(screen.getByText('Restricted')).toBeInTheDocument(); }); + it('preserves a year-only Date Issued value', () => { + const data = { + ...baseData, + attributes: { + ...baseData.attributes, + ogm: { + ...baseData.attributes.ogm, + dct_issued_s: '1950', + }, + }, + }; + + renderWithRouter(); + + expect(screen.getByText('Date Issued')).toBeInTheDocument(); + expect(screen.getByText('1950')).toBeInTheDocument(); + expect(screen.queryByText('January 1, 1950')).not.toBeInTheDocument(); + }); + + it('formats a full Date Issued value with month and day', () => { + const data = { + ...baseData, + attributes: { + ...baseData.attributes, + ogm: { + ...baseData.attributes.ogm, + dct_issued_s: '2019-01-15', + }, + }, + }; + + renderWithRouter(); + + expect(screen.getByText('January 15, 2019')).toBeInTheDocument(); + }); + it('metadata facet labels use sequential heading level (h3 under h2)', () => { const data = { ...baseData, diff --git a/frontend/src/components/resource/FullDetailsTable.tsx b/frontend/src/components/resource/FullDetailsTable.tsx index ceb5ddff..62b446c4 100644 --- a/frontend/src/components/resource/FullDetailsTable.tsx +++ b/frontend/src/components/resource/FullDetailsTable.tsx @@ -360,7 +360,14 @@ export function FullDetailsTable({ data }: FullDetailsTableProps) { // IMPORTANT: make this deterministic across SSR/client. // Manually parse YYYY-MM-DD to avoid `new Date(string)` ambiguity and timezone offsets. // We strictly interpret the date string as UTC YYYY-MM-DD. - const valStr = value.toString(); + const valStr = value.toString().trim(); + + // Date Issued often has year-level precision. Preserve that precision instead + // of allowing `new Date("2024")` to invent January 1 as a month and day. + if (key === 'dct_issued_s' && /^\d{4}$/.test(valStr)) { + return valStr; + } + // Match YYYY-MM-DD pattern (stripping time if present) const match = valStr.match(/^(\d{4})-(\d{2})-(\d{2})/);