diff --git a/application/controllers/Lookup.php b/application/controllers/Lookup.php index 9b1dbb6c..be72c9c4 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 = 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'); + + $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..5e88b5ed --- /dev/null +++ b/application/models/Lookup_model.php @@ -0,0 +1,224 @@ +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) { + // 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; + + $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 '%" . $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; + 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 '%" . $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; + 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 '%" . $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; + 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 '%" . $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; + 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 b44fd455..d6976f84 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 @@ + +