diff --git a/src/backend/services/awards.service.js b/src/backend/services/awards.service.js index aeab064..bf4d675 100644 --- a/src/backend/services/awards.service.js +++ b/src/backend/services/awards.service.js @@ -60,13 +60,33 @@ export async function getAllAwards() { })); } +/** + * Normalize award rules to a consistent format + */ +function normalizeAwardRules(rules) { + // Handle "filtered" type awards (like DXCC CW) + if (rules.type === 'filtered' && rules.baseRule) { + return { + type: 'entity', + entityType: rules.baseRule.entityType, + target: rules.baseRule.target, + filters: rules.filters, + }; + } + + return rules; +} + /** * Calculate award progress for a user * @param {number} userId - User ID * @param {Object} award - Award definition */ export async function calculateAwardProgress(userId, award) { - const { rules } = award; + let { rules } = award; + + // Normalize rules to handle different formats + rules = normalizeAwardRules(rules); // Get all QSOs for user const allQSOs = await db @@ -149,7 +169,15 @@ function applyFilters(qsos, filters) { * Check if a QSO matches a filter */ function matchesFilter(qso, filter) { - const value = qso[filter.field]; + let value; + + // Special handling for satellite field + if (filter.field === 'satellite') { + // Check if it's a satellite QSO (has satName) + value = qso.satName && qso.satName.length > 0; + } else { + value = qso[filter.field]; + } switch (filter.operator) { case 'eq': @@ -161,7 +189,7 @@ function matchesFilter(qso, filter) { case 'nin': return Array.isArray(filter.value) && !filter.value.includes(value); case 'contains': - return value && typeof value === 'string' && value.includes(filter.value); + return value && typeof value === 'string' && value.toLowerCase().includes(filter.value.toLowerCase()); default: return true; } @@ -204,7 +232,10 @@ export async function getAwardEntityBreakdown(userId, awardId) { throw new Error('Award not found'); } - const { rules } = award; + let { rules } = award; + + // Normalize rules to handle different formats + rules = normalizeAwardRules(rules); // Get all QSOs for user const allQSOs = await db diff --git a/src/frontend/src/routes/awards/[id]/+page.svelte b/src/frontend/src/routes/awards/[id]/+page.svelte new file mode 100644 index 0000000..be671b3 --- /dev/null +++ b/src/frontend/src/routes/awards/[id]/+page.svelte @@ -0,0 +1,408 @@ + + +
Failed to load award: {error}
+ ← Back to Awards +