From 681cd0af9b7bfb2b7d5c623d441f8211bcee6ee6 Mon Sep 17 00:00:00 2001 From: Andreas <6977712+AndreasK79@users.noreply.github.com> Date: Sun, 14 Mar 2021 10:11:21 +0100 Subject: [PATCH 1/3] [Quick lookup] New feature to quickly check worked/confirmed on band/mode. Invoked by ALT-L --- application/controllers/Lookup.php | 30 ++- application/models/Lookup_model.php | 216 ++++++++++++++++++ application/views/interface_assets/footer.php | 97 ++++++++ application/views/interface_assets/header.php | 6 +- application/views/lookup/index.php | 97 ++++++++ application/views/lookup/result.php | 30 +++ 6 files changed, 469 insertions(+), 7 deletions(-) create mode 100644 application/models/Lookup_model.php create mode 100644 application/views/lookup/index.php create mode 100644 application/views/lookup/result.php diff --git a/application/controllers/Lookup.php b/application/controllers/Lookup.php index 9b1dbb6c..c80e8580 100644 --- a/application/controllers/Lookup.php +++ b/application/controllers/Lookup.php @@ -16,14 +16,38 @@ class Lookup extends CI_Controller { $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'] = "Quick Lookup"; + $this->load->model('logbook_model'); + $data['dxcc'] = $this->logbook_model->fetchDxcc(); + $data['iota'] = $this->logbook_model->fetchIota(); + $this->load->view('lookup/index', $data); + } + public function search() { + $CI =& get_instance(); + $CI->load->model('Stations'); + $station_id = $CI->Stations->find_active(); + + $type = $this->input->post('type'); + $dxcc = $this->input->post('dxcc'); + $was = $this->input->post('was'); + $cqz = $this->input->post('cqz'); + $sota = $this->input->post('sota'); + $grid = $this->input->post('grid'); + $iota = $this->input->post('iota'); + + $this->load->model('lookup_model'); + + $data['bands'] = $this->lookup_model->get_Worked_Bands($station_id); + $data['result'] = $this->lookup_model->getSearchResult($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota, $data['bands']); + $this->load->view('lookup/result', $data); } public function scp($call) { - + if($call) { $uppercase_callsign = strtoupper($call); } @@ -78,7 +102,7 @@ class Lookup extends CI_Controller { { echo " " . $strCall . " "; } - + } } diff --git a/application/models/Lookup_model.php b/application/models/Lookup_model.php new file mode 100644 index 00000000..46bdb5c7 --- /dev/null +++ b/application/models/Lookup_model.php @@ -0,0 +1,216 @@ +get_worked_modes($station_id); + + return $this->getResultFromDatabase($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota, $modes, $bands); + } + + function getResultFromDatabase($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota, $modes, $bands) { + // Creating an empty array with all the bands and modes from the database + foreach ($modes as $mode) { + foreach ($bands as $band) { + $resultArray[$mode][$band] = '-'; + } + } + + // Populating array with worked band/mode combinations + $worked = $this->getQueryData($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota,'worked'); + foreach ($worked as $w) { + $resultArray[$w->col_mode][$w->col_band] = 'W'; + } + + // Populating array with confirmed band/mode combinations + $confirmed = $this->getQueryData($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota,'confirmed'); + foreach ($confirmed as $c) { + $resultArray[$c->col_mode][$c->col_band] = 'C'; + } + + return $resultArray; + } + + /* + * Builds query depending on what we are searching for + */ + function getQueryData($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota, $confirmedtype) { + $sql = "SELECT distinct col_band, lower(col_mode) as col_mode FROM " . $this->config->item('table_name') . " thcv"; + + $sql .= " where station_id = " . $station_id; + + $sql .= " and coalesce(col_submode, '') = ''"; + + $sql .= " and col_prop_mode != 'SAT'"; + + switch ($type) { + case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; + case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'cqz': $sql .= " and col_cqz = " . $cqz; break; + case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; + case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; + default: break; + } + + if ($confirmedtype == 'confirmed') { + $sql .= " and (col_qsl_rcvd = 'Y' or col_lotw_qsl_rcvd = 'Y')"; + } + + $sql .= " union SELECT distinct col_band, lower(col_submode) as col_mode FROM " . $this->config->item('table_name') . " thcv"; + + $sql .= " where station_id = " . $station_id; + + $sql .= " and coalesce(col_submode, '') <> ''"; + + $sql .= " and col_prop_mode != 'SAT'"; + + switch ($type) { + case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; + case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'cqz': $sql .= " and col_cqz = " . $cqz; break; + case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; + case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; + default: break; + } + + if ($confirmedtype == 'confirmed') { + $sql .= " and (col_qsl_rcvd = 'Y' or col_lotw_qsl_rcvd = 'Y')"; + } + + $sql .= " union SELECT distinct 'SAT' col_band, lower(col_mode) as col_mode FROM " . $this->config->item('table_name') . " thcv"; + + $sql .= " where station_id = " . $station_id; + + $sql .= " and coalesce(col_submode, '') = ''"; + + $sql .= " and col_prop_mode = 'SAT'"; + + switch ($type) { + case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; + case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'cqz': $sql .= " and col_cqz = " . $cqz; break; + case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; + case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; + default: break; + } + + if ($confirmedtype == 'confirmed') { + $sql .= " and (col_qsl_rcvd = 'Y' or col_lotw_qsl_rcvd = 'Y')"; + } + + $sql .= " union SELECT distinct 'SAT' col_band, lower(col_submode) as col_mode FROM " . $this->config->item('table_name') . " thcv"; + + $sql .= " where station_id = " . $station_id; + + $sql .= " and coalesce(col_submode, '') <> ''"; + + $sql .= " and col_prop_mode = 'SAT'"; + + switch ($type) { + case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; + case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'cqz': $sql .= " and col_cqz = " . $cqz; break; + case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; + case 'sota': $sql .= " and col_sota_ref= '" . $sota . "'"; break; + default: break; + } + + if ($confirmedtype == 'confirmed') { + $sql .= " and (col_qsl_rcvd = 'Y' or col_lotw_qsl_rcvd = 'Y')"; + } + + $query = $this->db->query($sql); + + return $query->result(); + } + + public $bandslots = array("160m" => 0, + "80m" => 0, + "60m" => 0, + "40m" => 0, + "30m" => 0, + "20m" => 0, + "17m" => 0, + "15m" => 0, + "12m" => 0, + "10m" => 0, + "6m" => 0, + "4m" => 0, + "2m" => 0, + "70cm" => 0, + "23cm" => 0, + "13cm" => 0, + "9cm" => 0, + "6cm" => 0, + "3cm" => 0, + "1.25cm" => 0, + "SAT" => 0, + ); + + /* + * Get's the worked bands from the log + */ + function get_worked_bands($station_id) + { + // get all worked slots from database + $data = $this->db->query( + "SELECT distinct LOWER(`COL_BAND`) as `COL_BAND` FROM `" . $this->config->item('table_name') . "` WHERE station_id = " . $station_id . " AND COL_PROP_MODE != \"SAT\"" + ); + $worked_slots = array(); + foreach ($data->result() as $row) { + array_push($worked_slots, $row->COL_BAND); + } + + $SAT_data = $this->db->query( + "SELECT distinct LOWER(`COL_PROP_MODE`) as `COL_PROP_MODE` FROM `" . $this->config->item('table_name') . "` WHERE station_id = " . $station_id . " AND COL_PROP_MODE = \"SAT\"" + ); + + foreach ($SAT_data->result() as $row) { + array_push($worked_slots, strtoupper($row->COL_PROP_MODE)); + } + + // bring worked-slots in order of defined $bandslots + $results = array(); + foreach (array_keys($this->bandslots) as $slot) { + if (in_array($slot, $worked_slots)) { + array_push($results, $slot); + } + } + return $results; + } + + /* + * Get's the worked modes from the log + */ + function get_worked_modes($station_id) + { + // get all worked modes from database + $data = $this->db->query( + "SELECT distinct LOWER(`COL_MODE`) as `COL_MODE` FROM `" . $this->config->item('table_name') . "` WHERE station_id = " . $station_id . " order by COL_MODE ASC" + ); + $results = array(); + foreach ($data->result() as $row) { + array_push($results, $row->COL_MODE); + } + + $data = $this->db->query( + "SELECT distinct LOWER(`COL_SUBMODE`) as `COL_SUBMODE` FROM `" . $this->config->item('table_name') . "` WHERE station_id = " . $station_id . " and coalesce(COL_SUBMODE, '') <> '' order by COL_SUBMODE ASC" + ); + foreach ($data->result() as $row) { + if (!in_array($row, $results)) { + array_push($results, $row->COL_SUBMODE); + } + } + + return $results; + } +} diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index e68875b9..9156b918 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -141,6 +141,103 @@ $('[data-fancybox]').fancybox({ } }); +// Here we capture ALT-L to invoice the Quick lookup +document.onkeyup = function(e) { + // ALT-W wipe + if (e.altKey && e.which == 76) { + spawnLookupModal(); + } +}; + +// This displays the dialog with the form and it's where the resulttable is displayed +function spawnLookupModal() { + $.ajax({ + url: base_url + 'index.php/lookup', + type: 'post', + success: function (html) { + BootstrapDialog.show({ + title: 'Quick lookup', + size: BootstrapDialog.SIZE_WIDE, + cssClass: 'lookup-dialog', + nl2br: false, + message: html, + onshown: function(dialog) { + $('#quicklookuptype').change(function(){ + var type = $('#quicklookuptype').val(); + if (type == "dxcc") { + $('#quicklookupdxcc').show(); + $('#quicklookupiota').hide(); + $('#quicklookupcqz').hide(); + $('#quicklookupwas').hide(); + $('#quicklookuptext').hide(); + } else if (type == "iota") { + $('#quicklookupiota').show(); + $('#quicklookupdxcc').hide(); + $('#quicklookupcqz').hide(); + $('#quicklookupwas').hide(); + $('#quicklookuptext').hide(); + } else if (type == "grid") { + $('#quicklookuptext').show(); + $('#quicklookupiota').hide(); + $('#quicklookupdxcc').hide(); + $('#quicklookupcqz').hide(); + $('#quicklookupwas').hide(); + } else if (type == "sota") { + $('#quicklookuptext').show(); + $('#quicklookupiota').hide(); + $('#quicklookupdxcc').hide(); + $('#quicklookupcqz').hide(); + $('#quicklookupwas').hide(); + } else if (type == "cqz") { + $('#quicklookupcqz').show(); + $('#quicklookupiota').hide(); + $('#quicklookupdxcc').hide(); + $('#quicklookupwas').hide(); + $('#quicklookuptext').hide(); + } else if (type == "was") { + $('#quicklookupwas').show(); + $('#quicklookupcqz').hide(); + $('#quicklookupiota').hide(); + $('#quicklookupdxcc').hide(); + $('#quicklookuptext').hide(); + } + }); + }, + buttons: [{ + label: 'Close', + action: function (dialogItself) { + dialogItself.close(); + } + }] + }); + } + }); +} + +// This function executes the call to the backend for fetching queryresult and displays the table in the dialog +function getLookupResult() { + $(".ld-ext-right").addClass('running'); + $(".ld-ext-right").prop('disabled', true); + $.ajax({ + url: base_url + 'index.php/lookup/search', + type: 'post', + data: { + type: $('#quicklookuptype').val(), + dxcc: $('#quicklookupdxcc').val(), + was: $('#quicklookupwas').val(), + grid: $('#quicklookuptext').val(), + cqz: $('#quicklookupcqz').val(), + iota: $('#quicklookupiota').val(), + sota: $('#quicklookuptext').val(), + }, + success: function (html) { + $('#lookupresulttable').html(html); + $(".ld-ext-right").removeClass('running'); + $(".ld-ext-right").prop('disabled', false); + } + }); +} + uri->segment(1) == "map" && $this->uri->segment(2) == "custom") { ?> diff --git a/application/views/interface_assets/header.php b/application/views/interface_assets/header.php index d5e90de0..1dd21117 100644 --- a/application/views/interface_assets/header.php +++ b/application/views/interface_assets/header.php @@ -29,10 +29,8 @@ - uri->segment(1) == "qrz" || $this->uri->segment(1) == "accumulated" || $this->uri->segment(1) == "timeplotter") { ?> - @@ -147,7 +145,7 @@ Update Country Files - + @@ -183,7 +181,7 @@ session->userdata('user_id'); ?>" title="Account"> Account Station Locations - + ADIF Import / Export diff --git a/application/views/lookup/index.php b/application/views/lookup/index.php new file mode 100644 index 00000000..2e6e4d46 --- /dev/null +++ b/application/views/lookup/index.php @@ -0,0 +1,97 @@ +
+ +
 
+ + + + + + + + +
 
+
+
+
+
diff --git a/application/views/lookup/result.php b/application/views/lookup/result.php new file mode 100644 index 00000000..fba7869a --- /dev/null +++ b/application/views/lookup/result.php @@ -0,0 +1,30 @@ + + + + '; + foreach($bands as $band) { + echo '' . $band . ''; + } + echo ' + + '; +foreach ($result as $mode => $value) { + echo ' + '. strtoupper($mode) .''; + foreach ($value as $key) { + if ($key == 'W') { + echo '
' . $key . '
'; + } + else if ($key == 'C') { + echo '
' . $key . '
'; + } + else { + echo '' . $key . ''; + } + } + echo ''; +} +echo ''; +?> From 850b00447ab023dcab32c7255265259470b9a4ed Mon Sep 17 00:00:00 2001 From: Andreas <6977712+AndreasK79@users.noreply.github.com> Date: Sun, 14 Mar 2021 11:50:21 +0100 Subject: [PATCH 2/3] [Quick lookup] Added xss_clean to input. --- application/controllers/Lookup.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/application/controllers/Lookup.php b/application/controllers/Lookup.php index c80e8580..be72c9c4 100644 --- a/application/controllers/Lookup.php +++ b/application/controllers/Lookup.php @@ -31,13 +31,13 @@ class Lookup extends CI_Controller { $CI->load->model('Stations'); $station_id = $CI->Stations->find_active(); - $type = $this->input->post('type'); - $dxcc = $this->input->post('dxcc'); - $was = $this->input->post('was'); - $cqz = $this->input->post('cqz'); - $sota = $this->input->post('sota'); - $grid = $this->input->post('grid'); - $iota = $this->input->post('iota'); + $type = xss_clean($this->input->post('type')); + $dxcc = xss_clean($this->input->post('dxcc')); + $was = xss_clean($this->input->post('was')); + $cqz = xss_clean($this->input->post('cqz')); + $sota = xss_clean($this->input->post('sota')); + $grid = xss_clean($this->input->post('grid')); + $iota = xss_clean($this->input->post('iota')); $this->load->model('lookup_model'); From d23464aa5fbfe84cdb3f239b9aed43fdc344c4a0 Mon Sep 17 00:00:00 2001 From: Andreas <6977712+AndreasK79@users.noreply.github.com> Date: Sun, 14 Mar 2021 11:56:45 +0100 Subject: [PATCH 3/3] [Quick lookup] Fix if user inputs longer grid than 4 characters. --- application/models/Lookup_model.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/application/models/Lookup_model.php b/application/models/Lookup_model.php index 46bdb5c7..5e88b5ed 100644 --- a/application/models/Lookup_model.php +++ b/application/models/Lookup_model.php @@ -40,6 +40,14 @@ class Lookup_model extends CI_Model{ * Builds query depending on what we are searching for */ function getQueryData($station_id, $type, $dxcc, $was, $cqz, $sota, $grid, $iota, $confirmedtype) { + // If user inputs longer grid than 4 chars, we use only the first 4 + if (strlen($grid) > 4) { + $fixedgrid = substr($grid, 0, 4); + } + else { + $fixedgrid = $grid; + } + $sql = "SELECT distinct col_band, lower(col_mode) as col_mode FROM " . $this->config->item('table_name') . " thcv"; $sql .= " where station_id = " . $station_id; @@ -51,7 +59,7 @@ class Lookup_model extends CI_Model{ switch ($type) { case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; - case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $fixedgrid . "%' or col_vucc_grids like '%" . $fixedgrid . "%')" ; break; case 'cqz': $sql .= " and col_cqz = " . $cqz; break; case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; @@ -73,7 +81,7 @@ class Lookup_model extends CI_Model{ switch ($type) { case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; - case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $fixedgrid . "%' or col_vucc_grids like '%" . $fixedgrid . "%')" ; break; case 'cqz': $sql .= " and col_cqz = " . $cqz; break; case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; @@ -95,7 +103,7 @@ class Lookup_model extends CI_Model{ switch ($type) { case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; - case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $fixedgrid . "%' or col_vucc_grids like '%" . $fixedgrid . "%')" ; break; case 'cqz': $sql .= " and col_cqz = " . $cqz; break; case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; case 'sota': $sql .= " and col_sota_ref = '" . $sota . "'"; break; @@ -117,7 +125,7 @@ class Lookup_model extends CI_Model{ switch ($type) { case 'dxcc': $sql .= " and col_dxcc = " . $dxcc; break; case 'iota': $sql .= " and col_iota = '" . $iota . "'"; break; - case 'grid': $sql .= " and (col_gridsquare like '%" . $grid . "%' or col_vucc_grids like '%" . $grid . "%')" ; break; + case 'grid': $sql .= " and (col_gridsquare like '%" . $fixedgrid . "%' or col_vucc_grids like '%" . $fixedgrid . "%')" ; break; case 'cqz': $sql .= " and col_cqz = " . $cqz; break; case 'was': $sql .= " and col_state = '" . $was . "' and COL_DXCC in ('291', '6', '110')";; break; case 'sota': $sql .= " and col_sota_ref= '" . $sota . "'"; break;