cloudlog/application/controllers/Cabrillo.php
Peter Goodhall 4c1dd7a42d Add Cabrillo export modal & format improvements
Add a full Cabrillo export workflow and harden Cabrillo/QSO formatting. Introduces a modal UI to export contest logs (new button + modal form with fields for location, category time, operators, club, soapbox, date range and other Cabrillo categories). Controller updates pass the new fields to the export action. Cabrilloformat library extended to accept and emit LOCATION and CATEGORY-TIME, improve header field ordering and presence checks, map ADIF modes to the five Cabrillo modes (CW/PH/FM/RY/DG), fix a band label (2.4G -> 2.3G), and emit placeholders for missing received exchanges to preserve column alignment. Contesting_model: more robust date parsing with UTC fallback, ensure session QSO marker only persists when timestamp valid, and build start timestamp when LIVE mode omits start_date/start_time. Frontend JS: setSession() now returns the ajax promise so callers can await it; several callers updated to await setSession and re-fetch session data before refreshing the QSO table; restore full table search on callsign blur and when suggestions are cleared. Misc: small form/input fixes (club field type, default overlay option) and additional server-supplied data loaded into the contesting view (active station id, contest session, station profile). These changes add required Cabrillo fields for certain contests and make exports and session handling more reliable.
2026-03-27 00:04:21 +00:00

140 lines
5.5 KiB
PHP

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
This controller contains features for Cabrillo
*/
class Cabrillo extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->model('user_model');
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
}
public function index() {
$data['page_title'] = "Export Cabrillo";
$this->load->model('Contesting_model');
$this->load->model('stations');
$data['station_profile'] = $this->stations->all_of_user();
$active_station_id = $this->stations->find_active();
$station_profile = $this->stations->profile($active_station_id);
$data['active_station_info'] = $station_profile->row();
$footerData = [];
$footerData['scripts'] = [
'assets/js/sections/cabrillo.js'
];
$this->load->view('interface_assets/header', $data);
$this->load->view('cabrillo/index');
$this->load->view('interface_assets/footer', $footerData);
}
public function getContests() {
$this->load->model('Contesting_model');
$station_id = $this->security->xss_clean($this->input->post('station_id'));
$this->load->model('stations');
if ($this->stations->check_station_is_accessible($station_id)) {
$year = $this->security->xss_clean($this->input->post('year'));
$result = $this->Contesting_model->get_logged_contests($station_id, $year);
header('Content-Type: application/json');
echo json_encode($result);
} else {
$this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard');
}
}
public function getYears() {
$this->load->model('Contesting_model');
$station_id = $this->security->xss_clean($this->input->post('station_id'));
$result = $this->Contesting_model->get_logged_years($station_id);
header('Content-Type: application/json');
echo json_encode($result);
}
public function getContestDates() {
$this->load->model('Contesting_model');
$station_id = $this->security->xss_clean($this->input->post('station_id'));
$this->load->model('stations');
if ($this->stations->check_station_is_accessible($station_id)) {
$year = $this->security->xss_clean($this->input->post('year'));
$contestid = $this->security->xss_clean($this->input->post('contestid'));
$result = $this->Contesting_model->get_contest_dates($station_id, $year, $contestid);
header('Content-Type: application/json');
echo json_encode($result);
} else {
$this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard');
}
}
public function export() {
// Set memory limit to unlimited to allow heavy usage
ini_set('memory_limit', '-1');
$this->load->model('Contesting_model');
$this->load->model('stations');
$this->load->model('user_model');
$station_id = $this->security->xss_clean($this->input->post('station_id'));
if ($this->stations->check_station_is_accessible($station_id)) {
$contest_id = $this->security->xss_clean($this->input->post('contestid'));
$from = $this->security->xss_clean($this->input->post('contestdatesfrom'));
$to = $this->security->xss_clean($this->input->post('contestdatesto'));
$station = $this->stations->profile($station_id);
$station = $station->row();
$userinfo = $this->user_model->get_by_id($this->session->userdata('user_id'));
$userinfo = $userinfo->row();
$data['qsos'] = $this->Contesting_model->export_custom($from, $to, $contest_id, $station_id);
$data['contest_id'] = $contest_id;
$data['callsign'] = $station->station_callsign;
$data['claimed_score'] = '';
$data['categoryoperator'] = $this->security->xss_clean($this->input->post('categoryoperator'));
$data['categoryassisted'] = $this->security->xss_clean($this->input->post('categoryassisted'));
$data['categoryband'] = $this->security->xss_clean($this->input->post('categoryband'));
$data['categorymode'] = $this->security->xss_clean($this->input->post('categorymode'));
$data['categorypower'] = $this->security->xss_clean($this->input->post('categorypower'));
$data['categorystation'] = $this->security->xss_clean($this->input->post('categorystation'));
$data['categorytransmitter'] = $this->security->xss_clean($this->input->post('categorytransmitter'));
$data['categoryoverlay'] = $this->security->xss_clean($this->input->post('categoryoverlay'));
$data['operators'] = $this->security->xss_clean($this->input->post('operators'));
$data['club'] = $this->security->xss_clean($this->input->post('club'));
$data['name'] = $userinfo->user_firstname . ' ' . $userinfo->user_lastname;
$data['email'] = $userinfo->user_email;
$data['address'] = $this->security->xss_clean($this->input->post('address'));
$data['addresscity'] = $this->security->xss_clean($this->input->post('addresscity'));
$data['addressstateprovince'] = $this->security->xss_clean($this->input->post('addressstateprovince'));
$data['addresspostalcode'] = $this->security->xss_clean($this->input->post('addresspostalcode'));
$data['addresscountry'] = $this->security->xss_clean($this->input->post('addresscountry'));
$data['soapbox'] = $this->security->xss_clean($this->input->post('soapbox'));
$data['location'] = $this->security->xss_clean($this->input->post('location'));
$data['categorytime'] = $this->security->xss_clean($this->input->post('categorytime'));
$data['gridlocator'] = $station->station_gridsquare;
$this->load->view('cabrillo/export', $data);
}else {
$this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard');
}
}
}