up
This commit is contained in:
@@ -33,12 +33,28 @@ function appendTokens(existing: string | undefined, refs: string): string {
|
||||
return out;
|
||||
}
|
||||
|
||||
// applyAwardRefs writes picked references onto a QSO payload using each award's
|
||||
// scanned field. fieldOf maps an award CODE (uppercase) to its field name.
|
||||
// MANUAL_REFS_KEY mirrors award.ManualRefsKey (Go): the ADIF extras key holding
|
||||
// the operator's per-QSO award-reference assignments as "CODE@REF;CODE@REF".
|
||||
// The award engine honours these regardless of how the award matches, so a
|
||||
// reference can be assigned even for awards that scan a free-text field by
|
||||
// description/pattern (e.g. WAPC over ADDRESS) where writing a bare code into
|
||||
// the field wouldn't match.
|
||||
const MANUAL_REFS_KEY = 'APP_OPSLOG_AWARDREFS';
|
||||
|
||||
// applyAwardRefs writes picked references onto a QSO payload. Every assignment
|
||||
// is recorded under MANUAL_REFS_KEY (authoritative for the engine); in addition,
|
||||
// awards backed by a standard ADIF column also get that column written so the
|
||||
// data lives in its conventional place and exports correctly. Awards that match
|
||||
// a free-text field by description/pattern (address/qth/name/custom) rely solely
|
||||
// on the override — we don't pollute the text field with a code.
|
||||
export function applyAwardRefs(payload: any, awardRefs: string, fieldOf: Record<string, string>) {
|
||||
const byCode = parseAwardRefs(awardRefs);
|
||||
const extras: Record<string, string> = { ...(payload.extras ?? {}) };
|
||||
const overrides: string[] = [];
|
||||
for (const [code, ref] of Object.entries(byCode)) {
|
||||
for (const r of ref.split(',').map((s) => s.trim()).filter(Boolean)) {
|
||||
overrides.push(`${code}@${r}`);
|
||||
}
|
||||
const field = fieldOf[code] || code.toLowerCase();
|
||||
switch (field) {
|
||||
case 'iota': payload.iota = ref; break;
|
||||
@@ -53,21 +69,24 @@ export function applyAwardRefs(payload: any, awardRefs: string, fieldOf: Record<
|
||||
extras['SIG'] = 'WWFF';
|
||||
extras['SIG_INFO'] = ref;
|
||||
break;
|
||||
// QSOFIELDS awards read their reference from a free-text field (e.g. DDFM
|
||||
// scans the note for "D06"). Picking such a reference appends its code(s)
|
||||
// to that field so the matcher finds it.
|
||||
// QSOFIELDS awards that scan a free-text field for a code (e.g. DDFM finds
|
||||
// "D06" in the note): append the code so the in-field matcher finds it too.
|
||||
case 'note': case 'notes':
|
||||
payload.notes = appendTokens(payload.notes, ref);
|
||||
break;
|
||||
case 'comment':
|
||||
payload.comment = appendTokens(payload.comment, ref);
|
||||
break;
|
||||
// address / qth / name / custom: the override above is authoritative; do
|
||||
// not write a code into a free-text field the award matches by name.
|
||||
default:
|
||||
extras[field.toUpperCase()] = ref;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (overrides.length > 0) extras[MANUAL_REFS_KEY] = overrides.join(';');
|
||||
else delete extras[MANUAL_REFS_KEY];
|
||||
if (Object.keys(extras).length > 0) payload.extras = extras;
|
||||
else if (payload.extras) delete payload.extras;
|
||||
}
|
||||
|
||||
// awardRefValue reads a single award's stored reference from a QSO, inverse of
|
||||
|
||||
Reference in New Issue
Block a user