From 7c7258d87c024815ebccfb6347ba87fed1973c85 Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Tue, 14 Apr 2026 18:55:23 +0200 Subject: [PATCH] feat: implement native date pickers and YYYY-MM-DD format in Missing Data view --- src/App.tsx | 2 +- src/components/MissingDataView.tsx | 27 +++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e71be52..9b4c8c5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -245,7 +245,7 @@ export default function App() { if (typeof val === 'number' && val >= 25569 && val <= 60000) { const excelEpoch = new Date(1899, 11, 30); const date = new Date(excelEpoch.getTime() + val * 86400000); - return date.toLocaleDateString('en-GB', { day: '2-digit', month: '2-digit', year: 'numeric' }); + return date.toISOString().split('T')[0]; // Returns YYYY-MM-DD } return val; } diff --git a/src/components/MissingDataView.tsx b/src/components/MissingDataView.tsx index 6305d4a..8866d91 100644 --- a/src/components/MissingDataView.tsx +++ b/src/components/MissingDataView.tsx @@ -14,20 +14,19 @@ interface MissingDataViewProps { function formatDateForInput(val: string): string { if (!val) return ''; + // If it's already YYYY-MM-DD, return it + if (/^\d{4}-\d{2}-\d{2}$/.test(val)) return val; + // If it's DD/MM/YYYY, convert to YYYY-MM-DD const parts = val.split('/'); if (parts.length === 3) { - return `${parts[2]}-${parts[1]}-${parts[0]}`; + return `${parts[2]}-${parts[1].padStart(2, '0')}-${parts[0].padStart(2, '0')}`; } return val; } function formatDateFromInput(val: string): string { - if (!val) return ''; - const parts = val.split('-'); - if (parts.length === 3) { - return `${parts[2]}/${parts[1]}/${parts[0]}`; - } - return val; + // Always output YYYY-MM-DD as requested + return val || ''; } function formatDateValue(val: any): string { @@ -36,11 +35,11 @@ function formatDateValue(val: any): string { if (val >= 25569 && val <= 60000) { const excelEpoch = new Date(1899, 11, 30); const date = new Date(excelEpoch.getTime() + val * 86400000); - return date.toLocaleDateString('en-GB', { day: '2-digit', month: '2-digit', year: 'numeric' }); + return date.toISOString().split('T')[0]; // Returns YYYY-MM-DD } return ''; } - return String(val); + return formatDateForInput(String(val)); } function isEmptyOrEpoch(val: any): boolean { @@ -160,12 +159,12 @@ export function MissingDataView({ data, headers, onSaveRow, onCaptureState }: Mi const colIdxNum = parseInt(colIdx); result = result.filter(r => { const val = r.row[colIdxNum]; - const dateStr = formatDateValue(val) || String(val ?? ''); - if (!dateStr) return false; - const parts = dateStr.split('/'); - if (parts.length !== 3) return false; - const rowDate = new Date(`${parts[2]}-${parts[1]}-${parts[0]}`); + const dateStr = formatDateValue(val); + if (!dateStr || !/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return false; + + const rowDate = new Date(dateStr); if (isNaN(rowDate.getTime())) return false; + if (range.start) { const startDate = new Date(range.start); if (rowDate < startDate) return false;