Fixed sorting for adif

This commit is contained in:
Andreas Kristiansen
2026-01-03 11:27:30 +01:00
parent 9f89e078ab
commit 298dfba746
3 changed files with 39 additions and 64 deletions

View File

@@ -232,10 +232,11 @@ class Logbookadvanced extends CI_Controller {
$this->load->model('logbookadvanced_model');
$ids = xss_clean($this->input->post('id'));
$sortorder = xss_clean($this->input->post('sortorder'));
$sortcolumn = xss_clean($this->input->post('sortcolumn'));
$sortdirection = xss_clean($this->input->post('sortdirection'));
$user_id = (int)$this->session->userdata('user_id');
$data['qsos'] = $this->logbookadvanced_model->getQsosForAdif($ids, $user_id, $sortorder);
$data['qsos'] = $this->logbookadvanced_model->getQsosForAdif($ids, $user_id, $sortcolumn, $sortdirection);
$this->load->view('adif/data/exportall', $data);
}

View File

@@ -679,7 +679,7 @@ class Logbookadvanced_model extends CI_Model {
return $qsos;
}
public function getQsosForAdif($ids, $user_id, $sortorder = null) : object {
public function getQsosForAdif($ids, $user_id, $sortColumnVar = 'qsotime', $sortDirection = 'desc') : object {
$binding = [$user_id];
$conditions[] = "COL_PRIMARY_KEY in ?";
$binding[] = json_decode($ids, true);
@@ -689,7 +689,39 @@ class Logbookadvanced_model extends CI_Model {
$where = "AND $where";
}
$order = $this->getSortOrder($sortorder);
$sortorder = '';
$sortColumnVar = '';
$sortDirection = $sortDirection === 'asc' ? 'asc' : 'desc';
if ($sortColumnVar !== '') {
switch($sortColumnVar) {
case 'qsotime':
$sortColumn = 'qsos.COL_TIME_ON';
break;
case 'band':
$sortColumn = 'qsos.COL_BAND';
break;
case 'mode':
$sortColumn = 'qsos.COL_MODE';
break;
case 'qsomodified':
$sortColumn = 'qsos.last_modified';
break;
default:
$sortColumn = 'qsos.COL_TIME_ON';
}
$secondarySort = $sortDirection === 'asc' ? 'asc' : 'desc';
$sortorder .= " ORDER BY $sortColumn $sortDirection";
// Add secondary sorts for mode column
if ($sortDirection === 'mode') {
$sortorder .= ", qsos.COL_SUBMODE $sortDirection";
}
$sortorder .= ", qsos.COL_PRIMARY_KEY $secondarySort";
}
$sql = "
SELECT qsos.*, qsos.last_modified AS qso_last_modified, lotw_users.*, station_profile.*, dxcc_entities.name AS station_country, d2.adif as adif, d2.name as dxccname, exists(select 1 from qsl_images where qsoid = qsos.COL_PRIMARY_KEY) as qslcount, coalesce(contest.name, qsos.col_contest_id) as contestname
@@ -701,70 +733,12 @@ class Logbookadvanced_model extends CI_Model {
LEFT OUTER JOIN contest ON qsos.col_contest_id = contest.adifname
WHERE station_profile.user_id = ?
$where
$order
$sortorder
";
return $this->db->query($sql, $binding);
}
public function getSortOrder($sortorder) {
if ($sortorder == null) {
return 'ORDER BY qsos.COL_TIME_ON desc';
} else {
$sortorder = explode(',', $sortorder);
if (strtoupper($sortorder[1] ?? '') == 'ASC') {
$sortorder[1]='asc';
} else {
$sortorder[1]='desc';
}
if ($this->session->userdata('user_lotw_name') != "" && $this->session->userdata('user_eqsl_name') != ""){
switch($sortorder[0]) {
case 1: return 'ORDER BY qsos.COL_TIME_ON ' . $sortorder[1];
case 2: return 'ORDER BY station_profile.station_callsign ' . $sortorder[1];
case 3: return 'ORDER BY qsos.COL_CALL ' . $sortorder[1];
case 4: return 'ORDER BY qsos.COL_MODE ' . $sortorder[1] . ', qsos.COL_SUBMODE ' . $sortorder[1];
case 7: return 'ORDER BY qsos.COL_BAND ' . $sortorder[1] . ', qsos.COL_SAT_NAME ' . $sortorder[1];
case 16: return 'ORDER BY qsos.COL_COUNTRY ' . $sortorder[1];
case 17: return 'ORDER BY qso.COL_STATE ' . $sortorder[1];
case 18: return 'ORDER BY qsos.COL_CQZ ' . $sortorder[1];
case 19: return 'ORDER BY qsos.COL_IOTA ' . $sortorder[1];
default: return 'ORDER BY qsos.COL_TIME_ON desc';
}
}
else if (($this->session->userdata('user_eqsl_name') != "" && $this->session->userdata('user_lotw_name') == "") || ($this->session->userdata('user_eqsl_name') == "" && $this->session->userdata('user_lotw_name') != "")) {
switch($sortorder[0]) {
case 1: return 'ORDER BY qsos.COL_TIME_ON ' . $sortorder[1];
case 2: return 'ORDER BY station_profile.station_callsign ' . $sortorder[1];
case 3: return 'ORDER BY qsos.COL_CALL ' . $sortorder[1];
case 4: return 'ORDER BY qsos.COL_MODE ' . $sortorder[1] . ', qsos.COL_SUBMODE ' . $sortorder[1];
case 7: return 'ORDER BY qsos.COL_BAND ' . $sortorder[1] . ', qsos.COL_SAT_NAME ' . $sortorder[1];
case 15: return 'ORDER BY qsos.COL_COUNTRY ' . $sortorder[1];
case 16: return 'ORDER BY qso.COL_STATE ' . $sortorder[1];
case 17: return 'ORDER BY qsos.COL_CQZ ' . $sortorder[1];
case 18: return 'ORDER BY qsos.COL_IOTA ' . $sortorder[1];
default: return 'ORDER BY qsos.COL_TIME_ON desc';
}
}
else if ($this->session->userdata('user_eqsl_name') == "" && $this->session->userdata('user_lotw_name') == ""){
switch($sortorder[0]) {
case 1: return 'ORDER BY qsos.COL_TIME_ON ' . $sortorder[1];
case 2: return 'ORDER BY station_profile.station_callsign ' . $sortorder[1];
case 3: return 'ORDER BY qsos.COL_CALL ' . $sortorder[1];
case 4: return 'ORDER BY qsos.COL_MODE ' . $sortorder[1] . ', qsos.COL_SUBMODE ' . $sortorder[1];
case 7: return 'ORDER BY qsos.COL_BAND ' . $sortorder[1] . ', qsos.COL_SAT_NAME ' . $sortorder[1];
case 14: return 'ORDER BY qsos.COL_COUNTRY ' . $sortorder[1];
case 15: return 'ORDER BY qso.COL_STATE ' . $sortorder[1];
case 16: return 'ORDER BY qsos.COL_CQZ ' . $sortorder[1];
case 17: return 'ORDER BY qsos.COL_IOTA ' . $sortorder[1];
default: return 'ORDER BY qsos.COL_TIME_ON desc';
}
}
}
}
public function updateQsl($ids, $user_id, $method, $sent) {
$this->load->model('user_model');

View File

@@ -984,7 +984,7 @@ $(document).ready(function () {
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// You should set responseType as blob for binary responses
xhttp.responseType = 'blob';
xhttp.send("id=" + JSON.stringify(id_list, null, 2)+"&sortorder=" +$('.table').DataTable().order());
xhttp.send("id=" + JSON.stringify(id_list, null, 2)+"&sortcolumn=" +$('#sortcolumn').val()+"&sortdirection=" +$('#sortdirection').val());
} else {
// Post data to URL which handles post request