diff --git a/src/frontend/src/routes/awards/[id]/+page.svelte b/src/frontend/src/routes/awards/[id]/+page.svelte index 54ee123..c49a71e 100644 --- a/src/frontend/src/routes/awards/[id]/+page.svelte +++ b/src/frontend/src/routes/awards/[id]/+page.svelte @@ -10,6 +10,11 @@ let groupedData = []; let bands = []; + // QSO detail modal state + let selectedQSO = null; + let showQSODetailModal = false; + let loadingQSO = false; + onMount(async () => { await loadAwardData(); }); @@ -80,6 +85,7 @@ entityData.bands.get(entity.band).push({ callsign: entity.callsign, mode: entity.mode, + band: entity.band, confirmed: entity.confirmed, qsoDate: entity.qsoDate, }); @@ -127,6 +133,7 @@ entityData.bands.get(entity.band).push({ callsign: entity.callsign, mode: entity.mode, + band: entity.band, confirmed: entity.confirmed, qsoDate: entity.qsoDate, }); @@ -154,6 +161,79 @@ $: if (entities.length > 0) { applyFilter(); } + + // QSO Detail Modal Functions + async function openQSODetailModal(qso) { + loadingQSO = true; + showQSODetailModal = true; + selectedQSO = null; + + try { + // Fetch full QSO details using filters + const params = new URLSearchParams({ + callsign: qso.callsign, + qsoDate: qso.qsoDate, + band: qso.band, + mode: qso.mode, + limit: '1' + }); + + const response = await fetch(`/api/qsos?${params}`, { + headers: { + 'Authorization': `Bearer ${$auth.token}`, + }, + }); + + if (!response.ok) { + throw new Error('Failed to fetch QSO details'); + } + + const data = await response.json(); + + if (!data.success) { + throw new Error(data.error || 'Failed to fetch QSO details'); + } + + if (data.qsos && data.qsos.length > 0) { + selectedQSO = data.qsos[0]; + } else { + throw new Error('QSO not found'); + } + } catch (err) { + console.error('Failed to load QSO details:', err); + alert('Failed to load QSO details: ' + err.message); + showQSODetailModal = false; + } finally { + loadingQSO = false; + } + } + + function closeQSODetailModal() { + selectedQSO = null; + showQSODetailModal = false; + } + + function formatDate(dateStr) { + if (!dateStr) return '-'; + // ADIF format: YYYYMMDD + const year = dateStr.substring(0, 4); + const month = dateStr.substring(4, 6); + const day = dateStr.substring(6, 8); + return `${day}/${month}/${year}`; + } + + function formatTime(timeStr) { + if (!timeStr) return '-'; + // ADIF format: HHMMSS or HHMM + return timeStr.substring(0, 2) + ':' + timeStr.substring(2, 4); + } + + function getConfirmationStatus(status) { + if (status === 'Y') return { label: 'Confirmed', class: 'confirmed' }; + if (status === 'N') return { label: 'Not Confirmed', class: 'not-confirmed' }; + if (status === '?') return { label: 'Unknown', class: 'unknown' }; + return { label: 'No Data', class: 'no-data' }; + }