feat: implement native date pickers and YYYY-MM-DD format in Missing Data view

This commit is contained in:
Christian Vidal Wolf
2026-04-14 18:55:23 +02:00
parent d4512aa4e6
commit 7c7258d87c
2 changed files with 14 additions and 15 deletions
+1 -1
View File
@@ -245,7 +245,7 @@ export default function App() {
if (typeof val === 'number' && val >= 25569 && val <= 60000) { if (typeof val === 'number' && val >= 25569 && val <= 60000) {
const excelEpoch = new Date(1899, 11, 30); const excelEpoch = new Date(1899, 11, 30);
const date = new Date(excelEpoch.getTime() + val * 86400000); 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; return val;
} }
+13 -14
View File
@@ -14,20 +14,19 @@ interface MissingDataViewProps {
function formatDateForInput(val: string): string { function formatDateForInput(val: string): string {
if (!val) return ''; 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('/'); const parts = val.split('/');
if (parts.length === 3) { 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; return val;
} }
function formatDateFromInput(val: string): string { function formatDateFromInput(val: string): string {
if (!val) return ''; // Always output YYYY-MM-DD as requested
const parts = val.split('-'); return val || '';
if (parts.length === 3) {
return `${parts[2]}/${parts[1]}/${parts[0]}`;
}
return val;
} }
function formatDateValue(val: any): string { function formatDateValue(val: any): string {
@@ -36,11 +35,11 @@ function formatDateValue(val: any): string {
if (val >= 25569 && val <= 60000) { if (val >= 25569 && val <= 60000) {
const excelEpoch = new Date(1899, 11, 30); const excelEpoch = new Date(1899, 11, 30);
const date = new Date(excelEpoch.getTime() + val * 86400000); 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 '';
} }
return String(val); return formatDateForInput(String(val));
} }
function isEmptyOrEpoch(val: any): boolean { function isEmptyOrEpoch(val: any): boolean {
@@ -160,12 +159,12 @@ export function MissingDataView({ data, headers, onSaveRow, onCaptureState }: Mi
const colIdxNum = parseInt(colIdx); const colIdxNum = parseInt(colIdx);
result = result.filter(r => { result = result.filter(r => {
const val = r.row[colIdxNum]; const val = r.row[colIdxNum];
const dateStr = formatDateValue(val) || String(val ?? ''); const dateStr = formatDateValue(val);
if (!dateStr) return false; if (!dateStr || !/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return false;
const parts = dateStr.split('/');
if (parts.length !== 3) return false; const rowDate = new Date(dateStr);
const rowDate = new Date(`${parts[2]}-${parts[1]}-${parts[0]}`);
if (isNaN(rowDate.getTime())) return false; if (isNaN(rowDate.getTime())) return false;
if (range.start) { if (range.start) {
const startDate = new Date(range.start); const startDate = new Date(range.start);
if (rowDate < startDate) return false; if (rowDate < startDate) return false;