From a35731f626b812d3f53cb5b205753f597da57697 Mon Sep 17 00:00:00 2001 From: Joerg Date: Fri, 23 Jan 2026 14:14:05 +0100 Subject: [PATCH] fix: use smart default for displayField based on entityType MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When displayField is omitted in award definitions, the backend now selects the appropriate default field based on the entityType: - dxcc → entity (country name) - state → state - grid → grid (4-character) - callsign → callsign Previously, it used a fixed fallback order that prioritized entity over other fields, causing grid-based awards to show DXCC names. Co-Authored-By: Claude --- src/backend/services/awards.service.js | 14 +++++++++++++- .../src/routes/admin/awards/[id]/+page.svelte | 2 +- .../admin/awards/components/TestAwardModal.svelte | 12 +++++++++--- .../src/routes/admin/awards/create/+page.svelte | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/backend/services/awards.service.js b/src/backend/services/awards.service.js index f9c96dd..5f84a71 100644 --- a/src/backend/services/awards.service.js +++ b/src/backend/services/awards.service.js @@ -896,7 +896,19 @@ export async function getAwardEntityBreakdown(userId, awardId) { } displayName = String(rawValue || entity); } else { - displayName = qso.entity || qso.state || qso.grid || qso.callsign || String(entity); + // Smart default based on entityType when displayField is not specified + const defaultDisplayField = { + 'dxcc': 'entity', + 'state': 'state', + 'grid': 'grid', + 'callsign': 'callsign' + }[rules.entityType] || 'entity'; + + let rawValue = qso[defaultDisplayField]; + if (defaultDisplayField === 'grid' && rawValue && rawValue.length > 4) { + rawValue = rawValue.substring(0, 4); + } + displayName = String(rawValue || entity); } if (!slotMap.has(slotKey)) { diff --git a/src/frontend/src/routes/admin/awards/[id]/+page.svelte b/src/frontend/src/routes/admin/awards/[id]/+page.svelte index 6d51abb..ec4f7a7 100644 --- a/src/frontend/src/routes/admin/awards/[id]/+page.svelte +++ b/src/frontend/src/routes/admin/awards/[id]/+page.svelte @@ -804,7 +804,7 @@ bind:value={formData.rules.displayField} placeholder="e.g., entity, state, grid" /> - Field to display as entity name (defaults to entity value) + Field to display as entity name (defaults based on entityType)
diff --git a/src/frontend/src/routes/admin/awards/components/TestAwardModal.svelte b/src/frontend/src/routes/admin/awards/components/TestAwardModal.svelte index 1ae2546..2e96115 100644 --- a/src/frontend/src/routes/admin/awards/components/TestAwardModal.svelte +++ b/src/frontend/src/routes/admin/awards/components/TestAwardModal.svelte @@ -197,15 +197,21 @@ } // Check if displayField matches the default for the entity type - if (rules.entityType && rules.displayField) { + if (rules.entityType) { const defaults = { 'dxcc': 'entity', 'state': 'state', 'grid': 'grid', 'callsign': 'callsign' }; - if (defaults[rules.entityType] === rules.displayField) { - info.push(`displayField="${rules.displayField}" is the default for entityType="${rules.entityType}". It can be omitted.`); + const defaultField = defaults[rules.entityType]; + + if (rules.displayField) { + if (defaultField === rules.displayField) { + info.push(`displayField="${rules.displayField}" is the default for entityType="${rules.entityType}". It can be omitted.`); + } + } else if (defaultField) { + info.push(`displayField will default to "${defaultField}" for entityType="${rules.entityType}".`); } } diff --git a/src/frontend/src/routes/admin/awards/create/+page.svelte b/src/frontend/src/routes/admin/awards/create/+page.svelte index 2843c5e..514d8b1 100644 --- a/src/frontend/src/routes/admin/awards/create/+page.svelte +++ b/src/frontend/src/routes/admin/awards/create/+page.svelte @@ -829,7 +829,7 @@ bind:value={formData.rules.displayField} placeholder="e.g., entity, state, grid" /> - Field to display as entity name (defaults to entity value) + Field to display as entity name (defaults based on entityType)