From b6e32eccadb2fa681724f1e9c5e6272453d6ff0b Mon Sep 17 00:00:00 2001 From: James Pattinson Date: Fri, 24 Oct 2025 18:07:45 +0000 Subject: [PATCH] New date picker --- web/admin.html | 152 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 121 insertions(+), 31 deletions(-) diff --git a/web/admin.html b/web/admin.html index d2a19a7..1526d7e 100644 --- a/web/admin.html +++ b/web/admin.html @@ -727,7 +727,12 @@
- +
+ + +
@@ -749,7 +754,12 @@
- +
+ + +
@@ -985,12 +995,27 @@ }, 3000); } - // Initialize the application - document.addEventListener('DOMContentLoaded', function() { - initializeAuth(); - setupLoginForm(); - setupKeyboardShortcuts(); - }); + // Initialize time dropdowns + function initializeTimeDropdowns() { + const timeSelects = ['eta-time', 'etd-time']; + + timeSelects.forEach(selectId => { + const select = document.getElementById(selectId); + // Clear existing options except the first one + select.innerHTML = ''; + + // Add time options in 15-minute intervals + for (let hour = 0; hour < 24; hour++) { + for (let minute = 0; minute < 60; minute += 15) { + const timeString = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`; + const option = document.createElement('option'); + option.value = timeString; + option.textContent = timeString; + select.appendChild(option); + } + } + }); + } // Authentication management async function initializeAuth() { @@ -1362,7 +1387,13 @@ function formatTimeOnly(dateStr) { if (!dateStr) return '-'; // Ensure the datetime string is treated as UTC - const utcDateStr = dateStr.includes('Z') ? dateStr : dateStr + 'Z'; + let utcDateStr = dateStr; + if (!utcDateStr.includes('T')) { + utcDateStr = utcDateStr.replace(' ', 'T'); + } + if (!utcDateStr.includes('Z')) { + utcDateStr += 'Z'; + } const date = new Date(utcDateStr); return date.toISOString().slice(11, 16); } @@ -1370,7 +1401,13 @@ function formatDateTime(dateStr) { if (!dateStr) return '-'; // Ensure the datetime string is treated as UTC - const utcDateStr = dateStr.includes('Z') ? dateStr : dateStr + 'Z'; + let utcDateStr = dateStr; + if (!utcDateStr.includes('T')) { + utcDateStr = utcDateStr.replace(' ', 'T'); + } + if (!utcDateStr.includes('Z')) { + utcDateStr += 'Z'; + } const date = new Date(utcDateStr); return date.toISOString().slice(0, 10) + ' ' + date.toISOString().slice(11, 16); } @@ -1393,18 +1430,24 @@ const eta = new Date(now.getTime() + 60 * 60 * 1000); // +1 hour const etd = new Date(now.getTime() + 2 * 60 * 60 * 1000); // +2 hours - // Format as local datetime-local value - function formatLocalDateTime(date) { + // Format date and time for separate inputs + function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - return `${year}-${month}-${day}T${hours}:${minutes}`; + return `${year}-${month}-${day}`; } - document.getElementById('eta').value = formatLocalDateTime(eta); - document.getElementById('etd').value = etd ? formatLocalDateTime(etd) : ''; + function formatTime(date) { + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(Math.ceil(date.getMinutes() / 15) * 15 % 60).padStart(2, '0'); // Round up to next 15-minute interval + return `${hours}:${minutes}`; + } + + document.getElementById('eta-date').value = formatDate(eta); + document.getElementById('eta-time').value = formatTime(eta); + document.getElementById('etd-date').value = formatDate(etd); + document.getElementById('etd-time').value = formatTime(etd); // Clear aircraft lookup results clearAircraftLookup(); @@ -1469,24 +1512,55 @@ } function populateForm(ppr) { + console.log('populateForm called with:', ppr); Object.keys(ppr).forEach(key => { - const field = document.getElementById(key); - if (field) { - if (key === 'eta' || key === 'etd') { - if (ppr[key]) { - // ppr[key] is UTC datetime string from API (naive, assume UTC) - const utcDateStr = ppr[key].includes('Z') ? ppr[key] : ppr[key] + 'Z'; - const date = new Date(utcDateStr); // Now correctly parsed as UTC - // Format as local time for datetime-local input + if (key === 'eta' || key === 'etd') { + if (ppr[key]) { + console.log(`Processing ${key}:`, ppr[key]); + // ppr[key] is UTC datetime string from API (naive, assume UTC) + let utcDateStr = ppr[key]; + if (!utcDateStr.includes('T')) { + utcDateStr = utcDateStr.replace(' ', 'T'); + } + if (!utcDateStr.includes('Z')) { + utcDateStr += 'Z'; + } + const date = new Date(utcDateStr); // Now correctly parsed as UTC + console.log(`Parsed date for ${key}:`, date); + + // Split into date and time components for separate inputs + const dateField = document.getElementById(`${key}-date`); + const timeField = document.getElementById(`${key}-time`); + + if (dateField && timeField) { + // Format date const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); + const dateValue = `${year}-${month}-${day}`; + dateField.value = dateValue; + console.log(`Set ${key}-date to:`, dateValue); + + // Format time (round to nearest 15-minute interval) const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - field.value = `${year}-${month}-${day}T${hours}:${minutes}`; + const rawMinutes = date.getMinutes(); + const roundedMinutes = Math.round(rawMinutes / 15) * 15 % 60; + const minutes = String(roundedMinutes).padStart(2, '0'); + const timeValue = `${hours}:${minutes}`; + timeField.value = timeValue; + console.log(`Set ${key}-time to:`, timeValue, `(from ${rawMinutes} minutes)`); + } else { + console.log(`Date/time fields not found for ${key}: dateField=${dateField}, timeField=${timeField}`); } } else { + console.log(`${key} is empty`); + } + } else { + const field = document.getElementById(key); + if (field) { field.value = ppr[key] || ''; + } else { + console.log(`Field not found for key: ${key}`); } } }); @@ -1630,10 +1704,18 @@ if (key !== 'id' && value.trim() !== '') { if (key === 'pob_in' || key === 'pob_out') { pprData[key] = parseInt(value); - } else if (key === 'eta' || key === 'etd') { - // Convert local datetime-local to UTC ISO string - pprData[key] = new Date(value).toISOString(); - } else { + } else if (key === 'eta-date' && formData.get('eta-time')) { + // Combine date and time for ETA + const dateStr = formData.get('eta-date'); + const timeStr = formData.get('eta-time'); + pprData.eta = new Date(`${dateStr}T${timeStr}`).toISOString(); + } else if (key === 'etd-date' && formData.get('etd-time')) { + // Combine date and time for ETD + const dateStr = formData.get('etd-date'); + const timeStr = formData.get('etd-time'); + pprData.etd = new Date(`${dateStr}T${timeStr}`).toISOString(); + } else if (key !== 'eta-time' && key !== 'etd-time') { + // Skip the time fields as they're handled above pprData[key] = value; } } @@ -2316,6 +2398,14 @@ document.getElementById('out_to').value = icaoCode; clearDepartureAirportLookup(); } + + // Initialize the page when DOM is loaded + document.addEventListener('DOMContentLoaded', function() { + setupLoginForm(); + setupKeyboardShortcuts(); + initializeTimeDropdowns(); // Initialize time dropdowns + initializeAuth(); // Start authentication process + }); \ No newline at end of file