From 298dfba746a5d0cb28fc5df4316873ea14083d8c Mon Sep 17 00:00:00 2001 From: Andreas Kristiansen <6977712+AndreasK79@users.noreply.github.com> Date: Sat, 3 Jan 2026 11:27:30 +0100 Subject: [PATCH] Fixed sorting for adif --- application/controllers/Logbookadvanced.php | 5 +- application/models/Logbookadvanced_model.php | 96 +++++++------------- assets/js/sections/logbookadvanced.js | 2 +- 3 files changed, 39 insertions(+), 64 deletions(-) diff --git a/application/controllers/Logbookadvanced.php b/application/controllers/Logbookadvanced.php index e597d29b3..97c1e2f57 100644 --- a/application/controllers/Logbookadvanced.php +++ b/application/controllers/Logbookadvanced.php @@ -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); } diff --git a/application/models/Logbookadvanced_model.php b/application/models/Logbookadvanced_model.php index ee85f82a1..3e7da7e40 100644 --- a/application/models/Logbookadvanced_model.php +++ b/application/models/Logbookadvanced_model.php @@ -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'); diff --git a/assets/js/sections/logbookadvanced.js b/assets/js/sections/logbookadvanced.js index 5aa76e50a..03819b231 100644 --- a/assets/js/sections/logbookadvanced.js +++ b/assets/js/sections/logbookadvanced.js @@ -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