feat: added Cabrillo export
This commit is contained in:
@@ -7,6 +7,7 @@ import {
|
||||
import {
|
||||
AddQSO, ListQSO, CountQSO, ListQSOFiltered, CountQSOFiltered,
|
||||
OpenADIFFile, ImportADIF, SaveADIFFile, ExportADIF, ExportADIFFiltered, ExportADIFSelected,
|
||||
SaveCabrilloFile, ExportCabrillo, ExportCabrilloFiltered, ExportCabrilloSelected,
|
||||
GetQSO, UpdateQSO, DeleteQSO, DeleteQSOs, DeleteAllQSO,
|
||||
UpdateQSOsFromCty, UpdateQSOsFromQRZ, UpdateQSOsFromClublog, UploadQSOsManual, SendQSORecordingEmail,
|
||||
LookupCallsign, GetStationSettings, GetListsSettings,
|
||||
@@ -1980,6 +1981,40 @@ export default function App() {
|
||||
showToast(`Exported ${r.count} selected QSO${r.count > 1 ? 's' : ''} → ${r.path}`);
|
||||
} catch (e: any) { setError(String(e?.message ?? e)); }
|
||||
}
|
||||
// Cabrillo (contest log) export — prompts for the contest name, then writes a
|
||||
// .cbr file. All / filtered / selected variants mirror the ADIF ones.
|
||||
async function exportCabrillo() {
|
||||
const contest = window.prompt('Contest name for Cabrillo (e.g. CQ-WW-SSB):', '');
|
||||
if (contest === null) return;
|
||||
try {
|
||||
const path = await SaveCabrilloFile();
|
||||
if (!path) return;
|
||||
const r = await ExportCabrillo(path, contest);
|
||||
showToast(`Cabrillo: ${r.count} QSO${r.count > 1 ? 's' : ''} → ${r.path}`);
|
||||
} catch (e: any) { setError(String(e?.message ?? e)); }
|
||||
}
|
||||
async function exportFilteredCabrillo() {
|
||||
const contest = window.prompt('Contest name for Cabrillo (e.g. CQ-WW-SSB):', '');
|
||||
if (contest === null) return;
|
||||
try {
|
||||
const path = await SaveCabrilloFile();
|
||||
if (!path) return;
|
||||
const f = buildActiveFilter();
|
||||
const r = await ExportCabrilloFiltered(path, contest, { ...f, limit: 0, offset: 0 } as any);
|
||||
showToast(`Cabrillo: ${r.count} QSO${r.count > 1 ? 's' : ''} → ${r.path}`);
|
||||
} catch (e: any) { setError(String(e?.message ?? e)); }
|
||||
}
|
||||
async function exportSelectedCabrillo(ids: number[]) {
|
||||
if (ids.length === 0) return;
|
||||
const contest = window.prompt('Contest name for Cabrillo (e.g. CQ-WW-SSB):', '');
|
||||
if (contest === null) return;
|
||||
try {
|
||||
const path = await SaveCabrilloFile();
|
||||
if (!path) return;
|
||||
const r = await ExportCabrilloSelected(path, contest, ids as any);
|
||||
showToast(`Cabrillo: ${r.count} selected QSO${r.count > 1 ? 's' : ''} → ${r.path}`);
|
||||
} catch (e: any) { setError(String(e?.message ?? e)); }
|
||||
}
|
||||
function askDelete(id: number) { setDeletingIds([id]); }
|
||||
// Delete the whole multi-row selection (Edit menu / Delete key).
|
||||
function askDeleteSelected() {
|
||||
@@ -2216,6 +2251,7 @@ export default function App() {
|
||||
{ name: 'file', label: 'File', items: [
|
||||
{ type: 'item', label: 'Import ADIF…', action: 'file.import', shortcut: 'Ctrl+O' },
|
||||
{ type: 'item', label: exporting ? 'Exporting…' : 'Export ADIF…', action: 'file.export', shortcut: 'Ctrl+E', disabled: exporting || total === 0 },
|
||||
{ type: 'item', label: 'Export Cabrillo…', action: 'file.exportCabrillo', disabled: total === 0 },
|
||||
{ type: 'separator' },
|
||||
{ type: 'item', label: 'Delete all QSOs…', action: 'file.deleteall', disabled: total === 0 },
|
||||
{ type: 'separator' },
|
||||
@@ -2257,6 +2293,7 @@ export default function App() {
|
||||
switch (action) {
|
||||
case 'file.import': importAdif(); break;
|
||||
case 'file.export': exportAdif(); break;
|
||||
case 'file.exportCabrillo': exportCabrillo(); break;
|
||||
case 'file.deleteall': setShowDeleteAll(true); break;
|
||||
case 'view.refresh': refresh(); break;
|
||||
case 'view.clearfilters': setFilterCallsign(''); setActiveFilter({ conditions: [], match: 'AND' }); break;
|
||||
@@ -3746,6 +3783,8 @@ export default function App() {
|
||||
onBulkEdit={openBulkEdit}
|
||||
onExportSelected={exportSelectedADIF}
|
||||
onExportFiltered={exportFilteredADIF}
|
||||
onExportCabrilloSelected={exportSelectedCabrillo}
|
||||
onExportCabrilloFiltered={exportFilteredCabrillo}
|
||||
onDelete={(ids) => setDeletingIds(ids)}
|
||||
onRowSelected={(ids) => { setSelectedIds(ids); setSelectedId(ids[0] ?? null); }}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user