From 858a3ec8b726d7fcc79e7d7df30bbeb8bf478aec Mon Sep 17 00:00:00 2001 From: int2001 Date: Sun, 28 Apr 2024 14:21:00 +0000 Subject: [PATCH 01/10] Little Contest-Tunging --- application/controllers/Contesting.php | 38 ++++++++++++++------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/application/controllers/Contesting.php b/application/controllers/Contesting.php index e0e7be6cb..46279fed5 100644 --- a/application/controllers/Contesting.php +++ b/application/controllers/Contesting.php @@ -15,46 +15,48 @@ class Contesting extends CI_Controller { if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } } - public function index() { - $this->load->model('cat'); - $this->load->model('stations'); - $this->load->model('modes'); + public function index() { + $this->load->model('cat'); + $this->load->model('stations'); + $this->load->model('modes'); $this->load->model('contesting_model'); $this->load->model('bands'); $data['my_gridsquare'] = $this->stations->find_gridsquare(); - $data['radios'] = $this->cat->radios(); - $data['modes'] = $this->modes->active(); + $data['radios'] = $this->cat->radios(); + $data['modes'] = $this->modes->active(); $data['contestnames'] = $this->contesting_model->getActivecontests(); $data['bands'] = $this->bands->get_user_bands_for_qso_entry(); $this->load->library('form_validation'); - $this->form_validation->set_rules('start_date', 'Date', 'required'); - $this->form_validation->set_rules('start_time', 'Time', 'required'); - $this->form_validation->set_rules('callsign', 'Callsign', 'required'); + $this->form_validation->set_rules('start_date', 'Date', 'required'); + $this->form_validation->set_rules('start_time', 'Time', 'required'); + $this->form_validation->set_rules('callsign', 'Callsign', 'required'); $data['page_title'] = "Contest Logging"; $this->load->view('interface_assets/header', $data); $this->load->view('contesting/index'); $this->load->view('interface_assets/footer'); - } + } - public function getSessionQsos() { - $this->load->model('Contesting_model'); + public function getSessionQsos() { + session_write_close(); + $this->load->model('Contesting_model'); - $qso = $this->input->post('qso'); + $qso = $this->input->post('qso'); header('Content-Type: application/json'); echo json_encode($this->Contesting_model->getSessionQsos($qso)); - } + } - public function getSession() { - $this->load->model('Contesting_model'); + public function getSession() { + session_write_close(); + $this->load->model('Contesting_model'); - header('Content-Type: application/json'); - echo json_encode($this->Contesting_model->getSession()); + header('Content-Type: application/json'); + echo json_encode($this->Contesting_model->getSession()); } public function deleteSession() { From 95ab8cf51027110f464045725e703425cd398c57 Mon Sep 17 00:00:00 2001 From: int2001 Date: Sun, 28 Apr 2024 14:39:22 +0000 Subject: [PATCH 02/10] Reduce amount of JS-Calls --- assets/js/sections/contesting.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index 60e3376a3..c76df0a27 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -94,10 +94,9 @@ async function setSession(formdata) { processData: false, contentType: false, success: function (data) { - + sessiondata=data; } }); - sessiondata=await getSession(); // refresh Sessiondata } // realtime clock From ef483758197a052f851b2dfe9a977f4cffcbc4db Mon Sep 17 00:00:00 2001 From: int2001 Date: Sun, 28 Apr 2024 14:39:31 +0000 Subject: [PATCH 03/10] Return new session-content directly after save --- application/controllers/Contesting.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/application/controllers/Contesting.php b/application/controllers/Contesting.php index 46279fed5..4aef00865 100644 --- a/application/controllers/Contesting.php +++ b/application/controllers/Contesting.php @@ -70,12 +70,11 @@ class Contesting extends CI_Controller { } public function setSession() { - $this->load->model('Contesting_model'); + $this->load->model('Contesting_model'); - $this->Contesting_model->setSession(); - - return json_encode("ok"); - } + header('Content-Type: application/json'); + echo json_encode($this->Contesting_model->getSession()); + } public function create() { $this->load->model('Contesting_model'); From 9307de021c35f58957d0edff2edc70b19e9424ac Mon Sep 17 00:00:00 2001 From: int2001 Date: Sun, 28 Apr 2024 14:52:16 +0000 Subject: [PATCH 04/10] Code-Formatting and Cleanup of CI --- application/controllers/Contesting.php | 24 ++-- application/models/Contesting_model.php | 172 ++++++++++++------------ 2 files changed, 95 insertions(+), 101 deletions(-) diff --git a/application/controllers/Contesting.php b/application/controllers/Contesting.php index 4aef00865..b38dbf376 100644 --- a/application/controllers/Contesting.php +++ b/application/controllers/Contesting.php @@ -51,23 +51,23 @@ class Contesting extends CI_Controller { echo json_encode($this->Contesting_model->getSessionQsos($qso)); } - public function getSession() { - session_write_close(); - $this->load->model('Contesting_model'); + public function getSession() { + session_write_close(); + $this->load->model('Contesting_model'); - header('Content-Type: application/json'); - echo json_encode($this->Contesting_model->getSession()); - } + header('Content-Type: application/json'); + echo json_encode($this->Contesting_model->getSession()); + } public function deleteSession() { - $this->load->model('Contesting_model'); + $this->load->model('Contesting_model'); - $qso = $this->input->post('qso'); + $qso = $this->input->post('qso'); - $data = $this->Contesting_model->deleteSession($qso); + $data = $this->Contesting_model->deleteSession($qso); - return json_encode($data); - } + return json_encode($data); + } public function setSession() { $this->load->model('Contesting_model'); @@ -191,7 +191,7 @@ class Contesting extends CI_Controller { header('Content-Type: application/json'); if ($result && $result->num_rows()) { $timeb4=substr($result->row()->b4,0,5); - $custom_date_format = $this->session->userdata('user_date_format'); + $custom_date_format = $this->session->userdata('user_date_format'); $abstimeb4=date($custom_date_format, strtotime($result->row()->COL_TIME_OFF)).' '.date('H:i',strtotime($result->row()->COL_TIME_OFF)); echo json_encode(array('message' => 'Worked at '.$abstimeb4.' ('.$timeb4.' ago) before')); } diff --git a/application/models/Contesting_model.php b/application/models/Contesting_model.php index 78e2d9bdf..48c9b0a54 100644 --- a/application/models/Contesting_model.php +++ b/application/models/Contesting_model.php @@ -1,60 +1,56 @@ load->model('Stations'); - $station_id = $CI->Stations->find_active(); + /* + * This function gets the QSOs to fill the "Contest Logbook" under the contesting form. + */ + function getSessionQsos($qso) { + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); - $qsoarray = explode(',', $qso); + $qsoarray = explode(',', $qso); - $contestid = $qsoarray[2]; - $date = DateTime::createFromFormat('d-m-Y H:i:s', $qsoarray[0]); - if ($date == false) $date = DateTime::createFromFormat('d-m-Y H:i', $qsoarray[0]); - $date = $date->format('Y-m-d H:i:s'); + $contestid = $qsoarray[2]; + $date = DateTime::createFromFormat('d-m-Y H:i:s', $qsoarray[0]); + if ($date == false) $date = DateTime::createFromFormat('d-m-Y H:i', $qsoarray[0]); + $date = $date->format('Y-m-d H:i:s'); - $sql = "SELECT date_format(col_time_on, '%d-%m-%Y %H:%i:%s') as col_time_on, col_call, col_band, col_mode, - col_submode, col_rst_sent, col_rst_rcvd, coalesce(col_srx, '') col_srx, coalesce(col_srx_string, '') col_srx_string, - coalesce(col_stx, '') col_stx, coalesce(col_stx_string, '') col_stx_string, coalesce(col_gridsquare, '') col_gridsquare, - coalesce(col_vucc_grids, '') col_vucc_grids FROM " . - $this->config->item('table_name') . - " WHERE station_id = ? AND COL_TIME_ON >= ? AND COL_CONTEST_ID = ? ORDER BY COL_PRIMARY_KEY ASC"; + $sql = "SELECT date_format(col_time_on, '%d-%m-%Y %H:%i:%s') as col_time_on, col_call, col_band, col_mode, + col_submode, col_rst_sent, col_rst_rcvd, coalesce(col_srx, '') col_srx, coalesce(col_srx_string, '') col_srx_string, + coalesce(col_stx, '') col_stx, coalesce(col_stx_string, '') col_stx_string, coalesce(col_gridsquare, '') col_gridsquare, + coalesce(col_vucc_grids, '') col_vucc_grids FROM " . + $this->config->item('table_name') . + " WHERE station_id = ? AND COL_TIME_ON >= ? AND COL_CONTEST_ID = ? ORDER BY COL_PRIMARY_KEY ASC"; - $data = $this->db->query($sql,array($station_id, $date, $contestid)); - return $data->result(); - } + $data = $this->db->query($sql,array($station_id, $date, $contestid)); + return $data->result(); + } function getSession() { - $CI =& get_instance(); - $CI->load->model('Stations'); - $station_id = $CI->Stations->find_active(); + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); - $sql = "SELECT * from contest_session where station_id = " . $station_id; + $sql = "SELECT * from contest_session where station_id = " . $station_id; - $data = $this->db->query($sql); - return $data->row(); - } + $data = $this->db->query($sql); + return $data->row(); + } function deleteSession() { - $CI =& get_instance(); - $CI->load->model('Stations'); - $station_id = $CI->Stations->find_active(); + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); - $sql = "delete from contest_session where station_id = " . $station_id; + $sql = "delete from contest_session where station_id = " . $station_id; - $this->db->query($sql); + $this->db->query($sql); return; - } + } function setSession() { - $CI =& get_instance(); - $CI->load->model('Stations'); - $station_id = $CI->Stations->find_active(); + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); $qso = ""; @@ -74,9 +70,9 @@ class Contesting_model extends CI_Model { 'station_id' => $station_id, ); - $sql = "SELECT * from contest_session where station_id = " . $station_id; + $sql = "SELECT * from contest_session where station_id = " . $station_id; - $querydata = $this->db->query($sql); + $querydata = $this->db->query($sql); if ($querydata->num_rows() == 0) { $this->db->insert('contest_session', $data); @@ -84,23 +80,23 @@ class Contesting_model extends CI_Model { } $result = $querydata->row(); - $qsoarray = explode(',', $result->qso); + $qsoarray = explode(',', $result->qso); if ($qsoarray[1] != "") { $data['qso'] = $result->qso; } $this->updateSession($data, $station_id); - + return; - } + } function updateSession($data, $station_id) { $this->db->where('station_id', $station_id); $this->db->update('contest_session', $data); - } + } - function getActivecontests() { + function getActivecontests() { $sql = "SELECT name, adifname FROM contest WHERE active = 1 ORDER BY name ASC"; @@ -208,15 +204,14 @@ class Contesting_model extends CI_Model { } function checkIfWorkedBefore($call, $band, $mode, $contest) { - $CI =& get_instance(); - $CI->load->model('Stations'); - $station_id = $CI->Stations->find_active(); + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); $contest_session = $this->getSession(); - + if ($contest_session && $contest_session->qso != "") { $qsoarray = explode(',', $contest_session->qso); - + $date = DateTime::createFromFormat('d-m-Y H:i:s', $qsoarray[0]); if ($date == false) $date = DateTime::createFromFormat('d-m-Y H:i', $qsoarray[0]); $date = $date->format('Y-m-d H:i:s'); @@ -231,49 +226,48 @@ class Contesting_model extends CI_Model { $this->db->where("COL_MODE", xss_clean($mode)); $this->db->or_where("COL_SUBMODE", xss_clean($mode)); $this->db->group_end(); - $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "DESC"); + $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "DESC"); $query = $this->db->get($this->config->item('table_name')); - + return $query; } return; } function export_custom($from, $to, $contest_id, $station_id) { - $this->db->select(''.$this->config->item('table_name').'.*, station_profile.*'); - $this->db->from($this->config->item('table_name')); - $this->db->where($this->config->item('table_name').'.station_id', $station_id); + $this->db->select(''.$this->config->item('table_name').'.*, station_profile.*'); + $this->db->from($this->config->item('table_name')); + $this->db->where($this->config->item('table_name').'.station_id', $station_id); - // If date is set, we format the date and add it to the where-statement - if ($from != 0) { - $from = DateTime::createFromFormat('Y-m-d', $from); - $from = $from->format('Y-m-d'); - $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) >= '".$from."'"); - } - if ($to != 0) { - $to = DateTime::createFromFormat('Y-m-d', $to); - $to = $to->format('Y-m-d'); - $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) <= '".$to."'"); - } + // If date is set, we format the date and add it to the where-statement + if ($from != 0) { + $from = DateTime::createFromFormat('Y-m-d', $from); + $from = $from->format('Y-m-d'); + $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) >= '".$from."'"); + } + if ($to != 0) { + $to = DateTime::createFromFormat('Y-m-d', $to); + $to = $to->format('Y-m-d'); + $this->db->where("date(".$this->config->item('table_name').".COL_TIME_ON) <= '".$to."'"); + } $this->db->where($this->config->item('table_name').'.COL_CONTEST_ID', $contest_id); - $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "ASC"); + $this->db->order_by($this->config->item('table_name').".COL_TIME_ON", "ASC"); - $this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id'); + $this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id'); - return $this->db->get(); - } + return $this->db->get(); + } function get_logged_contests2() { - $CI =& get_instance(); - $CI->load->model('Stations'); - $station_id = $CI->Stations->find_active(); + $this->load->model('Stations'); + $station_id = $this->Stations->find_active(); $sql = "select col_contest_id, min(date(col_time_on)) mindate, max(date(col_time_on)) maxdate, year(col_time_on) year, month(col_time_on) month - from " . $this->config->item('table_name') . " - where coalesce(COL_CONTEST_ID, '') <> '' - and station_id =" . $station_id; + from " . $this->config->item('table_name') . " + where coalesce(COL_CONTEST_ID, '') <> '' + and station_id =" . $station_id; $sql .= " group by COL_CONTEST_ID , year(col_time_on), month(col_time_on) order by year(col_time_on) desc"; @@ -285,9 +279,9 @@ class Contesting_model extends CI_Model { function get_logged_years($station_id) { $sql = "select distinct year(col_time_on) year - from " . $this->config->item('table_name') . " - where coalesce(COL_CONTEST_ID, '') <> '' - and station_id =" . $station_id; + from " . $this->config->item('table_name') . " + where coalesce(COL_CONTEST_ID, '') <> '' + and station_id =" . $station_id; $sql .= " order by year(col_time_on) desc"; @@ -298,27 +292,27 @@ class Contesting_model extends CI_Model { function get_logged_contests($station_id, $year) { $sql = "select distinct col_contest_id - from " . $this->config->item('table_name') . " - where coalesce(COL_CONTEST_ID, '') <> '' - and station_id =" . $station_id . - " and year(col_time_on) ='" . $year . "'"; + from " . $this->config->item('table_name') . " + where coalesce(COL_CONTEST_ID, '') <> '' + and station_id =" . $station_id . + " and year(col_time_on) ='" . $year . "'"; $sql .= " order by COL_CONTEST_ID asc"; $data = $this->db->query($sql); - return $data->result(); - } + return $data->result(); + } function get_contest_dates($station_id, $year, $contestid) { $sql = "select distinct (date(col_time_on)) date - from " . $this->config->item('table_name') . " - where coalesce(COL_CONTEST_ID, '') <> '' - and station_id =" . $station_id . - " and year(col_time_on) ='" . $year . "' and col_contest_id ='" . $contestid . "'"; + from " . $this->config->item('table_name') . " + where coalesce(COL_CONTEST_ID, '') <> '' + and station_id =" . $station_id . + " and year(col_time_on) ='" . $year . "' and col_contest_id ='" . $contestid . "'"; $data = $this->db->query($sql); - return $data->result(); + return $data->result(); } } From 6d6e151f43593a7083c82a52a649691076184959 Mon Sep 17 00:00:00 2001 From: HB9HIL Date: Mon, 29 Apr 2024 00:25:45 +0200 Subject: [PATCH 05/10] push data as bulk instead line by line --- assets/js/sections/contesting.js | 51 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index c76df0a27..e15889e06 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -637,34 +637,33 @@ async function refresh_qso_table(data) { table.clear(); var mode = ''; - var data; - $.each(html, function () { - if (this.col_submode == null || this.col_submode == '') { - mode = this.col_mode; - } else { - mode = this.col_submode; - } + var data = []; + $.each(html, function () { + if (this.col_submode == null || this.col_submode == '') { + mode = this.col_mode; + } else { + mode = this.col_submode; + } - data = [[ - this.col_time_on, - this.col_call, - this.col_band, - mode, - this.col_rst_sent, - this.col_rst_rcvd, - this.col_stx_string, - this.col_srx_string, - this.col_stx, - this.col_srx, - this.col_gridsquare, - this.col_vucc_grids - ]]; + data.push([ + this.col_time_on, + this.col_call, + this.col_band, + mode, + this.col_rst_sent, + this.col_rst_rcvd, + this.col_stx_string, + this.col_srx_string, + this.col_stx, + this.col_srx, + this.col_gridsquare, + this.col_vucc_grids + ]); + }); - if (data.length > 0) { - table.rows.add(data).draw(); - } - - }); + if (data.length > 0) { + table.rows.add(data).draw(); + } } }); From 607f345e47bda6f0b212d7d94035bbcf4624e044 Mon Sep 17 00:00:00 2001 From: HB9HIL Date: Mon, 29 Apr 2024 00:30:22 +0200 Subject: [PATCH 06/10] don't overwrite qrg if radio is selected --- assets/js/sections/contesting.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index e15889e06..7ac932583 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -377,10 +377,12 @@ if ($('#frequency').val() == "") { /* on mode change */ $('#mode').change(function () { + if ($('#radio').val() == '0') { $.get('qso/band_to_freq/' + $('#band').val() + '/' + $('.mode').val(), function (result) { $('#frequency').val(result); $('#frequency_rx').val(""); }); + } setRst($("#mode").val()); checkIfWorkedBefore(); }); @@ -388,10 +390,12 @@ $('#mode').change(function () { /* Calculate Frequency */ /* on band change */ $('#band').change(function () { + if ($('#radio').val() == '0') { $.get('qso/band_to_freq/' + $(this).val() + '/' + $('.mode').val(), function (result) { $('#frequency').val(result); $('#frequency_rx').val(""); }); + } checkIfWorkedBefore(); }); From fe62d499f6ca470adf06feaa30ca20470faf54d1 Mon Sep 17 00:00:00 2001 From: HB9HIL Date: Mon, 29 Apr 2024 00:32:29 +0200 Subject: [PATCH 07/10] we don't need to show '000' in the datatable --- assets/js/sections/contesting.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index 7ac932583..60a231002 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -53,13 +53,13 @@ async function reset_contest_session() { "columnDefs": [ { "render": function ( data, type, row ) { - return pad(row[8],3); + return row[8] !== null && row[8] !== '' ? pad(row[8], 3) : ''; }, "targets" : 8 }, { "render": function ( data, type, row ) { - return pad(row[9],3); + return row[9] !== null && row[9] !== '' ? pad(row[9], 3) : ''; }, "targets" : 9 } @@ -624,13 +624,13 @@ async function refresh_qso_table(data) { "columnDefs": [ { "render": function ( data, type, row ) { - return pad(row[8],3); + return row[8] !== null && row[8] !== '' ? pad(row[8], 3) : ''; }, "targets" : 8 }, { "render": function ( data, type, row ) { - return pad(row[9],3); + return row[9] !== null && row[9] !== '' ? pad(row[9], 3) : ''; }, "targets" : 9 } From f42ffa555ad256e429979a87811a5eb9247f6969 Mon Sep 17 00:00:00 2001 From: HB9HIL Date: Mon, 29 Apr 2024 00:53:34 +0200 Subject: [PATCH 08/10] hide the "worked before" batch after the qso got saved anyway --- assets/js/sections/contesting.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index 60a231002..d96ae289f 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -477,6 +477,7 @@ function logQso() { if ($("#callsign").val().length > 0) { $('.callsign-suggestions').text(""); + $('#callsign_info').text(""); var table = $('.qsotable').DataTable(); var exchangetype = $("#exchangetype").val(); From 6ba56a814be779030f0b2930be1cac1845818a4b Mon Sep 17 00:00:00 2001 From: int2001 Date: Mon, 29 Apr 2024 05:13:11 +0000 Subject: [PATCH 09/10] One should really save the session :P --- application/controllers/Contesting.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/application/controllers/Contesting.php b/application/controllers/Contesting.php index b38dbf376..b4ccf3628 100644 --- a/application/controllers/Contesting.php +++ b/application/controllers/Contesting.php @@ -71,7 +71,7 @@ class Contesting extends CI_Controller { public function setSession() { $this->load->model('Contesting_model'); - + $this->Contesting_model->setSession(); header('Content-Type: application/json'); echo json_encode($this->Contesting_model->getSession()); } @@ -83,13 +83,10 @@ class Contesting extends CI_Controller { $this->form_validation->set_rules('name', 'Contest Name', 'required'); $this->form_validation->set_rules('adifname', 'Adif Contest Name', 'required'); - if ($this->form_validation->run() == FALSE) - { + if ($this->form_validation->run() == FALSE) { $data['page_title'] = "Create Mode"; $this->load->view('contesting/create', $data); - } - else - { + } else { $this->Contesting_model->add(); } } From 16748bffa07ebabfc2b71595ce889155fdef5dfc Mon Sep 17 00:00:00 2001 From: int2001 Date: Mon, 29 Apr 2024 05:27:48 +0000 Subject: [PATCH 10/10] Retrieve callbook onBlur of call ONLY. otherwise it's called twice, when pressing space --- assets/js/sections/contesting.js | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/js/sections/contesting.js b/assets/js/sections/contesting.js index d96ae289f..139be4dbb 100644 --- a/assets/js/sections/contesting.js +++ b/assets/js/sections/contesting.js @@ -165,7 +165,6 @@ document.onkeyup = function (e) { reset_log_fields(); // Space to jump to either callsign or the various exchanges } else if (e.which == 32) { - getCallbook(); var exchangetype = $("#exchangetype").val(); if (manual && $(document.activeElement).attr("id") == "start_time") {