From 65189d07caca6d7b0fc3c556ec3affe2561c3643 Mon Sep 17 00:00:00 2001 From: phl0 Date: Wed, 5 Oct 2022 17:05:53 +0200 Subject: [PATCH] Basic POTA support --- application/config/migration.php | 2 +- application/controllers/Qso.php | 29 +++++++++++ .../language/english/general_words_lang.php | 2 + application/language/english/qso_lang.php | 4 +- .../language/german/general_words_lang.php | 3 ++ application/language/german/qso_lang.php | 4 +- application/libraries/AdifHelper.php | 3 ++ .../migrations/102_add_pota_columns.php | 46 ++++++++++++++++++ application/models/Logbook_model.php | 9 ++++ application/models/Stations.php | 6 +++ application/views/dashboard/index.php | 2 + application/views/interface_assets/footer.php | 28 +++++++++++ application/views/qslcard/searchresult.php | 5 ++ application/views/qso/edit_ajax.php | 5 ++ application/views/qso/index.php | 11 +++++ .../views/search/search_result_ajax.php | 5 ++ application/views/station_profile/create.php | 10 +++- application/views/station_profile/edit.php | 18 ++++++- application/views/user/edit.php | 5 ++ .../views/view_log/partial/log_ajax.php | 2 + application/views/view_log/qso.php | 20 +++++--- application/views/visitor/index.php | 1 + assets/css/general.css | 8 +++ assets/js/sections/qso.js | 36 ++++++++++++++ images/icons/pota.app.png | Bin 0 -> 22190 bytes 25 files changed, 249 insertions(+), 15 deletions(-) create mode 100644 application/migrations/102_add_pota_columns.php create mode 100644 images/icons/pota.app.png diff --git a/application/config/migration.php b/application/config/migration.php index da99decf..7ccd0b37 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -21,7 +21,7 @@ $config['migration_enabled'] = TRUE; | be upgraded / downgraded to. | */ -$config['migration_version'] = 101; +$config['migration_version'] = 102; /* |-------------------------------------------------------------------------- diff --git a/application/controllers/Qso.php b/application/controllers/Qso.php index 491da78d..36259168 100755 --- a/application/controllers/Qso.php +++ b/application/controllers/Qso.php @@ -368,6 +368,35 @@ class QSO extends CI_Controller { echo json_encode($json); } + public function get_pota() { + $json = []; + + if(!empty($this->input->get("query"))) { + $query = isset($_GET['query']) ? $_GET['query'] : FALSE; + $pota = strtoupper($query); + + $file = 'assets/json/pota.txt'; + + if (is_readable($file)) { + $lines = file($file, FILE_IGNORE_NEW_LINES); + $input = preg_quote($pota, '~'); + $reg = '~^'. $input .'(.*)$~'; + $result = preg_grep($reg, $lines); + $json = []; + $i = 0; + foreach ($result as &$value) { + // Limit to 100 as to not slowdown browser too much + if (count($json) <= 100) { + $json[] = ["name"=>$value]; + } + } + } + } + + header('Content-Type: application/json'); + echo json_encode($json); + } + /* * Function is used for autocompletion of DOK in the QSO entry form */ diff --git a/application/language/english/general_words_lang.php b/application/language/english/general_words_lang.php index da383fb9..dd8bf1d9 100644 --- a/application/language/english/general_words_lang.php +++ b/application/language/english/general_words_lang.php @@ -99,11 +99,13 @@ $lang['gen_hamradio_county_reference'] = 'USA County'; $lang['gen_hamradio_iota_reference'] = 'IOTA Reference'; $lang['gen_hamradio_sota_reference'] = 'SOTA Reference'; $lang['gen_hamradio_wwff_reference'] = 'WWFF Reference'; +$lang['gen_hamradio_pota_reference'] = 'POTA Reference'; $lang['gen_hamradio_dok'] = 'DOK'; $lang['gen_hamradio_state'] = 'State'; $lang['gen_hamradio_iota'] = 'IOTA'; $lang['gen_hamradio_sota'] = 'SOTA'; $lang['gen_hamradio_wwff'] = 'WWFF'; +$lang['gen_hamradio_pota'] = 'POTA'; $lang['gen_hamradio_gridsquare'] = 'Gridsquare'; $lang['gen_hamradio_operator'] = 'Operator'; diff --git a/application/language/english/qso_lang.php b/application/language/english/qso_lang.php index e3613182..47b95fb4 100644 --- a/application/language/english/qso_lang.php +++ b/application/language/english/qso_lang.php @@ -14,8 +14,8 @@ $lang['qso_transmit_power_helptext'] = 'Give power value in Watts. Include only $lang['qso_sota_ref_helptext'] = 'For example: GM/NS-001.'; $lang['qso_wwff_ref_helptext'] = 'For example: DLFF-0069.'; -$lang['qso_sig_helptext'] = 'For example: POTA'; -$lang['qso_sig_info_helptext'] = 'For example: PA-0150'; +$lang['qso_sig_helptext'] = 'For example: GMA'; +$lang['qso_sig_info_helptext'] = 'For example: DA/NW-357'; $lang['qso_dok_helptext'] = 'For example: Q03'; diff --git a/application/language/german/general_words_lang.php b/application/language/german/general_words_lang.php index c57c4a55..1cd5f8ed 100644 --- a/application/language/german/general_words_lang.php +++ b/application/language/german/general_words_lang.php @@ -99,10 +99,13 @@ $lang['gen_hamradio_county_reference'] = 'USA County'; $lang['gen_hamradio_iota_reference'] = 'IOTA Referenznummer'; $lang['gen_hamradio_sota_reference'] = 'SOTA Referenznummer'; $lang['gen_hamradio_wwff_reference'] = 'WWFF Referenznummer'; +$lang['gen_hamradio_pota_reference'] = 'POTA Referenznummer'; $lang['gen_hamradio_dok'] = 'DOK'; $lang['gen_hamradio_state'] = 'Staat'; $lang['gen_hamradio_iota'] = 'IOTA'; $lang['gen_hamradio_sota'] = 'SOTA'; +$lang['gen_hamradio_wwff'] = 'WWFF'; +$lang['gen_hamradio_pota'] = 'POTA'; $lang['gen_hamradio_gridsquare'] = 'Planquadrat'; $lang['gen_hamradio_operator'] = 'Operator'; diff --git a/application/language/german/qso_lang.php b/application/language/german/qso_lang.php index e45cb586..a9556f43 100644 --- a/application/language/german/qso_lang.php +++ b/application/language/german/qso_lang.php @@ -14,8 +14,8 @@ $lang['qso_transmit_power_helptext'] = 'Gib die Ausgangsleistung in Watt an. Erf $lang['qso_sota_ref_helptext'] = 'Zum Beispiel: GM/NS-001.'; $lang['qso_wwff_ref_helptext'] = 'Zum Beispiel: DLFF-0069.'; -$lang['qso_sig_helptext'] = 'Zum Beispiel: POTA'; -$lang['qso_sig_info_helptext'] = 'Zum Beispiel: PA-0150'; +$lang['qso_sig_helptext'] = 'Zum Beispiel: GMA'; +$lang['qso_sig_info_helptext'] = 'Zum Beispiel: DA/NW-357'; $lang['qso_dok_helptext'] = 'Zum Beispiel: Q03'; diff --git a/application/libraries/AdifHelper.php b/application/libraries/AdifHelper.php index 926f7ee4..cc936f08 100644 --- a/application/libraries/AdifHelper.php +++ b/application/libraries/AdifHelper.php @@ -88,6 +88,7 @@ class AdifHelper { 'SKCC', 'SOTA_REF', 'WWFF_REF', + 'POTA_REF', 'SRX', 'SRX_STRING', 'STATE', @@ -191,6 +192,8 @@ class AdifHelper { $line .= $this->getAdifFieldLine("MY_WWFF_REF", $qso->station_wwff); + $line .= $this->getAdifFieldLine("MY_POTA_REF", $qso->station_pota); + $line .= $this->getAdifFieldLine("MY_CQ_ZONE", $qso->station_cq); $line .= $this->getAdifFieldLine("MY_ITU_ZONE", $qso->station_itu); diff --git a/application/migrations/102_add_pota_columns.php b/application/migrations/102_add_pota_columns.php new file mode 100644 index 00000000..e918f0ff --- /dev/null +++ b/application/migrations/102_add_pota_columns.php @@ -0,0 +1,46 @@ +db->field_exists('COL_POTA_REF', 'TABLE_HRD_CONTACTS_V01')) { + $fields = array( + 'COL_POTA_REF VARCHAR(30) DEFAULT NULL', + 'COL_MY_POTA_REF VARCHAR(50) DEFAULT NULL', + ); + $this->dbforge->add_column('TABLE_HRD_CONTACTS_V01', $fields, 'COL_VUCC_GRIDS'); + + // Now copy over data from SIG_INFO fields and remove COL_SIG and COL_SIG_INFO only if COL_SIG is POTA + // This cannot be reverted on downgrade to prevent overwriting of other COL_SIG information + $this->db->set('COL_POTA_REF', 'COL_SIG_INFO', FALSE); + $this->db->set('COL_SIG_INFO', ''); + $this->db->set('COL_SIG', ''); + $this->db->where('COL_SIG', 'POTA'); + $this->db->update('TABLE_HRD_CONTACTS_V01'); + + // Add MY_POTA_REF to station profile + $fields = array( + 'station_pota varchar(50) DEFAULT NULL', + ); + $this->dbforge->add_column('station_profile', $fields); + } + } + + public function down() + { + $this->dbforge->drop_column('TABLE_HRD_CONTACTS_V01', 'COL_POTA_REF'); + $this->dbforge->drop_column('TABLE_HRD_CONTACTS_V01', 'COL_MY_POTA_REF'); + $this->dbforge->drop_column('station_profile', 'station_potpota'); + } +} diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php index 7891fa8c..9333f143 100755 --- a/application/models/Logbook_model.php +++ b/application/models/Logbook_model.php @@ -178,6 +178,7 @@ class Logbook_model extends CI_Model { 'COL_CNTY' => $clean_county_input, 'COL_SOTA_REF' => trim($this->input->post('sota_ref')), 'COL_WWFF_REF' => trim($this->input->post('wwff_ref')), + 'COL_POTA_REF' => trim($this->input->post('pota_ref')), 'COL_SIG' => trim($this->input->post('sig')), 'COL_SIG_INFO' => trim($this->input->post('sig_info')), 'COL_DARC_DOK' => strtoupper(trim($darc_dok)), @@ -211,6 +212,7 @@ class Logbook_model extends CI_Model { $data['COL_MY_IOTA'] = strtoupper(trim($station['station_iota'])); $data['COL_MY_SOTA_REF'] = strtoupper(trim($station['station_sota'])); $data['COL_MY_WWFF_REF'] = strtoupper(trim($station['station_wwff'])); + $data['COL_MY_POTA_REF'] = strtoupper(trim($station['station_pota'])); $data['COL_STATION_CALLSIGN'] = strtoupper(trim($station['station_callsign'])); $data['COL_MY_DXCC'] = strtoupper(trim($station['station_dxcc'])); @@ -287,6 +289,9 @@ class Logbook_model extends CI_Model { case 'WWFF': $this->db->where('COL_WWFF_REF', $searchphrase); break; + case 'POTA': + $this->db->where('COL_POTA_REF', $searchphrase); + break; } $this->db->where_in($this->config->item('table_name').'.station_id', $logbooks_locations_array); @@ -663,6 +668,7 @@ class Logbook_model extends CI_Model { 'COL_IOTA' => $this->input->post('iota_ref'), 'COL_SOTA_REF' => $this->input->post('sota_ref'), 'COL_WWFF_REF' => $this->input->post('wwff_ref'), + 'COL_POTA_REF' => $this->input->post('pota_ref'), 'COL_TX_PWR' => $txpower, 'COL_SIG' => $this->input->post('sig'), 'COL_SIG_INFO' => $this->input->post('sig_info'), @@ -2620,6 +2626,7 @@ class Logbook_model extends CI_Model { 'COL_MY_SIG_INTL' => (!empty($record['my_sig_intl'])) ? $record['my_sig_intl'] : '', 'COL_MY_SOTA_REF' => (!empty($record['my_sota_ref'])) ? $record['my_sota_ref'] : '', 'COL_MY_WWFF_REF' => (!empty($record['my_wwff_ref'])) ? $record['my_wwff_ref'] : '', + 'COL_MY_POTA_REF' => (!empty($record['my_pota_ref'])) ? $record['my_pota_ref'] : '', 'COL_MY_STATE' => (!empty($record['my_state'])) ? $record['my_state'] : '', 'COL_MY_STREET' => (!empty($record['my_street'])) ? $record['my_street'] : '', 'COL_MY_STREET_INTL' => (!empty($record['my_street_intl'])) ? $record['my_street_intl'] : '', @@ -2669,6 +2676,7 @@ class Logbook_model extends CI_Model { 'COL_SKCC' => (!empty($record['skcc'])) ? $record['skcc'] : '', 'COL_SOTA_REF' => (!empty($record['sota_ref'])) ? $record['sota_ref'] : '', 'COL_WWFF_REF' => (!empty($record['wwff_ref'])) ? $record['wwff_ref'] : '', + 'COL_POTA_REF' => (!empty($record['pota_ref'])) ? $record['pota_ref'] : '', 'COL_SRX' => (!empty($record['srx'])) ? $record['srx'] : null, 'COL_SRX_STRING' => (!empty($record['srx_string'])) ? $record['srx_string'] : '', 'COL_STATE' => (!empty($record['state'])) ? strtoupper($record['state']) : '', @@ -2707,6 +2715,7 @@ class Logbook_model extends CI_Model { $data['COL_MY_IOTA'] = strtoupper(trim($row['station_iota'])); $data['COL_MY_SOTA_REF'] = strtoupper(trim($row['station_sota'])); $data['COL_MY_WWFF_REF'] = strtoupper(trim($row['station_wwff'])); + $data['COL_MY_POTA_REF'] = strtoupper(trim($row['station_pota'])); $data['COL_STATION_CALLSIGN'] = strtoupper(trim($row['station_callsign'])); $data['COL_MY_DXCC'] = strtoupper(trim($row['station_dxcc'])); diff --git a/application/models/Stations.php b/application/models/Stations.php index f5834328..14866944 100644 --- a/application/models/Stations.php +++ b/application/models/Stations.php @@ -65,6 +65,7 @@ class Stations extends CI_Model { 'station_iota' => xss_clean(strtoupper($this->input->post('iota', true))), 'station_sota' => xss_clean(strtoupper($this->input->post('sota', true))), 'station_wwff' => xss_clean(strtoupper($this->input->post('wwff', true))), + 'station_pota' => xss_clean(strtoupper($this->input->post('pota', true))), 'station_sig' => xss_clean(strtoupper($this->input->post('sig', true))), 'station_sig_info' => xss_clean(strtoupper($this->input->post('sig_info', true))), 'station_callsign' => xss_clean($this->input->post('station_callsign', true)), @@ -91,6 +92,7 @@ class Stations extends CI_Model { 'station_iota' => xss_clean($this->input->post('iota', true)), 'station_sota' => xss_clean($this->input->post('sota', true)), 'station_wwff' => xss_clean($this->input->post('wwff', true)), + 'station_pota' => xss_clean($this->input->post('pota', true)), 'station_sig' => xss_clean($this->input->post('sig', true)), 'station_sig_info' => xss_clean($this->input->post('sig_info', true)), 'station_callsign' => xss_clean($this->input->post('station_callsign', true)), @@ -248,6 +250,10 @@ class Stations extends CI_Model { $this->db->where('COL_MY_WWFF_REF', $row->station_wwff); } + if($row->station_pota != "") { + $this->db->where('COL_MY_POTA_REF', $row->station_pota); + } + if($row->station_sig != "") { $this->db->where('COL_MY_SIG', $row->station_sig); } diff --git a/application/views/dashboard/index.php b/application/views/dashboard/index.php index 28b0a24e..8f8b1cff 100644 --- a/application/views/dashboard/index.php +++ b/application/views/dashboard/index.php @@ -8,6 +8,7 @@ function echo_table_header_col($ctx, $name) { case 'IOTA': echo ''.$ctx->lang->line('gen_hamradio_iota').''; break; case 'SOTA': echo ''.$ctx->lang->line('gen_hamradio_sota').''; break; case 'WWFF': echo ''.$ctx->lang->line('gen_hamradio_wwff').''; break; + case 'POTA': echo ''.$ctx->lang->line('gen_hamradio_pota').''; break; case 'State': echo ''.$ctx->lang->line('gen_hamradio_state').''; break; case 'Grid': echo ''.$ctx->lang->line('gen_hamradio_gridsquare').''; break; case 'Band': echo ''.$ctx->lang->line('gen_hamradio_band').''; break; @@ -24,6 +25,7 @@ function echo_table_col($row, $name) { case 'IOTA': echo '' . ($row->COL_IOTA) . ''; break; case 'SOTA': echo '' . ($row->COL_SOTA_REF) . ''; break; case 'WWFF': echo '' . ($row->COL_WWFF_REF) . ''; break; + case 'POTA': echo '' . ($row->COL_POTA_REF) . ''; break; case 'Grid': echo ''; echoQrbCalcLink($row->station_gridsquare, $row->COL_VUCC_GRIDS, $row->COL_GRIDSQUARE); echo ''; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo ''.$row->COL_SAT_NAME.''; } else { echo strtolower($row->COL_BAND); } echo ''; break; case 'State': echo '' . ($row->COL_STATE) . ''; break; diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index 73e4c99a..b49bbe1f 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -2048,6 +2048,34 @@ $(document).ready(function(){ } }); + $('#pota_ref_edit').selectize({ + maxItems: 1, + closeAfterSelect: true, + loadThrottle: 250, + valueField: 'name', + labelField: 'name', + searchField: 'name', + options: [], + create: false, + load: function(query, callback) { + if (!query || query.length < 3) return callback(); // Only trigger if 3 or more characters are entered + $.ajax({ + url: baseURL+'index.php/qso/get_pota', + type: 'GET', + dataType: 'json', + data: { + query: query, + }, + error: function() { + callback(); + }, + success: function(res) { + callback(res); + } + }); + } + }); + $('#darc_dok_edit').selectize({ maxItems: 1, closeAfterSelect: true, diff --git a/application/views/qslcard/searchresult.php b/application/views/qslcard/searchresult.php index 6fcb6e69..451999ed 100644 --- a/application/views/qslcard/searchresult.php +++ b/application/views/qslcard/searchresult.php @@ -107,6 +107,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -121,6 +122,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -136,6 +138,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -150,6 +153,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -164,6 +168,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; diff --git a/application/views/qso/edit_ajax.php b/application/views/qso/edit_ajax.php index 10220922..1f4642c2 100644 --- a/application/views/qso/edit_ajax.php +++ b/application/views/qso/edit_ajax.php @@ -358,6 +358,11 @@ +
+ + +
+
diff --git a/application/views/qso/index.php b/application/views/qso/index.php index 30e1fe6d..e65da641 100755 --- a/application/views/qso/index.php +++ b/application/views/qso/index.php @@ -355,6 +355,17 @@
+
+
+ + + lang->line('qso_pota_ref_helptext'); ?> +
+
+ +
+
+
diff --git a/application/views/search/search_result_ajax.php b/application/views/search/search_result_ajax.php index 08a656f7..30c053b1 100644 --- a/application/views/search/search_result_ajax.php +++ b/application/views/search/search_result_ajax.php @@ -125,6 +125,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -139,6 +140,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -154,6 +156,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -168,6 +171,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; @@ -182,6 +186,7 @@ case 'IOTA': echo '' . ($row->COL_IOTA); break; case 'SOTA': echo '' . ($row->COL_SOTA_REF); break; case 'WWFF': echo '' . ($row->COL_WWFF_REF); break; + case 'POTA': echo '' . ($row->COL_POTA_REF); break; case 'Grid': echo ''; echo strlen($row->COL_GRIDSQUARE)==0?$row->COL_VUCC_GRIDS:$row->COL_GRIDSQUARE; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo $row->COL_SAT_NAME; } else { echo strtolower($row->COL_BAND); }; break; case 'State': echo '' . ($row->COL_STATE); break; diff --git a/application/views/station_profile/create.php b/application/views/station_profile/create.php index 1d67d84e..f166952f 100644 --- a/application/views/station_profile/create.php +++ b/application/views/station_profile/create.php @@ -198,16 +198,22 @@ Station WWFF reference (e.g. DLFF-0069).
+
+ + + Station POTA reference (e.g. PA-0150). +
+
- Station Signature (e.g. POTA). + Station Signature (e.g. GMA).
- Station Signature Info (e.g. PA-0150). + Station Signature Info (e.g. DA/NW-357).
diff --git a/application/views/station_profile/edit.php b/application/views/station_profile/edit.php index 38ae078f..cbbc3ba6 100644 --- a/application/views/station_profile/edit.php +++ b/application/views/station_profile/edit.php @@ -286,6 +286,20 @@
+
+
+
POTA
+
+
+ + station_pota; } ?>"> + Station POTA reference. +
+
+
+
+ +
@@ -294,13 +308,13 @@
station_sig; } ?>"> - Station Signature (e.g. WWFF).. + Station Signature (e.g. GMA)..
station_sig_info; } ?>"> - Station Signature Info (e.g. DLFF-0029). + Station Signature Info (e.g. DA/NW-357).
diff --git a/application/views/user/edit.php b/application/views/user/edit.php index ad20e890..1327337a 100644 --- a/application/views/user/edit.php +++ b/application/views/user/edit.php @@ -341,6 +341,7 @@ + @@ -358,6 +359,7 @@ + @@ -375,6 +377,7 @@ + @@ -392,6 +395,7 @@ + @@ -408,6 +412,7 @@ + diff --git a/application/views/view_log/partial/log_ajax.php b/application/views/view_log/partial/log_ajax.php index ae0959f8..e52e6249 100644 --- a/application/views/view_log/partial/log_ajax.php +++ b/application/views/view_log/partial/log_ajax.php @@ -8,6 +8,7 @@ function echo_table_header_col($ctx, $name) { case 'IOTA': echo ''.$ctx->lang->line('gen_hamradio_iota').''; break; case 'SOTA': echo ''.$ctx->lang->line('gen_hamradio_sota').''; break; case 'WWFF': echo ''.$ctx->lang->line('gen_hamradio_wwff').''; break; + case 'POTA': echo ''.$ctx->lang->line('gen_hamradio_pota').''; break; case 'State': echo ''.$ctx->lang->line('gen_hamradio_state').''; break; case 'Grid': echo ''.$ctx->lang->line('gen_hamradio_gridsquare').''; break; case 'Band': echo ''.$ctx->lang->line('gen_hamradio_band').''; break; @@ -25,6 +26,7 @@ function echo_table_col($row, $name) { case 'IOTA': echo '' . ($row->COL_IOTA) . ''; break; case 'SOTA': echo '' . ($row->COL_SOTA_REF) . ''; break; case 'WWFF': echo '' . ($row->COL_WWFF_REF) . ''; break; + case 'POTA': echo '' . ($row->COL_POTA_REF) . ''; break; case 'Grid': echo ''; echoQrbCalcLink($row->station_gridsquare, $row->COL_VUCC_GRIDS, $row->COL_GRIDSQUARE); echo ''; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo ''.$row->COL_SAT_NAME.''; } else { echo strtolower($row->COL_BAND); } echo ''; break; case 'State': echo '' . ($row->COL_STATE) . ''; break; diff --git a/application/views/view_log/qso.php b/application/views/view_log/qso.php index 44a4e92c..cfc78177 100644 --- a/application/views/view_log/qso.php +++ b/application/views/view_log/qso.php @@ -216,6 +216,13 @@ + COL_POTA_REF != null) { ?> + + lang->line('gen_hamradio_pota_reference'); ?> + COL_SIG_INFO; ?> + + + COL_SIG != null) { ?> lang->line('gen_hamradio_sig'); ?> @@ -234,12 +241,6 @@ case "MQC": echo "COL_SIG_INFO."\" target=\"_blank\">".$row->COL_SIG_INFO.""; break; - case "WWFF": - echo "COL_SIG_INFO."\" target=\"_blank\">".$row->COL_SIG_INFO.""; - break; - case "POTA": - echo "COL_SIG_INFO."\" target=\"_blank\">".$row->COL_SIG_INFO.""; - break; default: echo "".$row->COL_SIG_INFO.""; break; @@ -373,6 +374,13 @@ COL_MY_WWFF_REF; ?> + + COL_MY_POTA_REF) { ?> + + Station POTA Reference + COL_MY_POTA_REF; ?> + +
diff --git a/application/views/visitor/index.php b/application/views/visitor/index.php index b456b99c..608997ad 100644 --- a/application/views/visitor/index.php +++ b/application/views/visitor/index.php @@ -23,6 +23,7 @@ function echo_table_col($row, $name) { case 'IOTA': echo '' . ($row->COL_IOTA) . ''; break; case 'SOTA': echo '' . ($row->COL_SOTA_REF) . ''; break; case 'WWFF': echo '' . ($row->COL_WWFF_REF) . ''; break; + case 'POTA': echo '' . ($row->COL_POTA_REF) . ''; break; case 'Grid': echo ''; echoQrbCalcLink($row->station_gridsquare, $row->COL_VUCC_GRIDS, $row->COL_GRIDSQUARE); echo ''; break; case 'Band': echo ''; if($row->COL_SAT_NAME != null) { echo ''.$row->COL_SAT_NAME.''; } else { echo strtolower($row->COL_BAND); } echo ''; break; case 'State': echo '' . ($row->COL_STATE) . ''; break; diff --git a/assets/css/general.css b/assets/css/general.css index 6c163ebf..354f2127 100644 --- a/assets/css/general.css +++ b/assets/css/general.css @@ -87,6 +87,10 @@ thead > tr > td { text-transform: uppercase; } +.qso_panel #pota_ref-selectized { + text-transform: uppercase; +} + .qso_panel #darc_dok-selectized { text-transform: uppercase; } @@ -111,6 +115,10 @@ thead > tr > td { text-transform: uppercase; } +.card-body #pota_ref_edit-selectized { + text-transform: uppercase; +} + .card-body #darc_dok_edit-selectized { text-transform: uppercase; } diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 8b123d08..acdbb85b 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -126,6 +126,39 @@ $( document ).ready(function() { $('#wwff_info').attr('title', 'Lookup '+$('#wwff_ref').val()+' reference info on wwff.co'); }); + $('#pota_ref').selectize({ + maxItems: 1, + closeAfterSelect: true, + loadThrottle: 250, + valueField: 'name', + labelField: 'name', + searchField: 'name', + options: [], + create: false, + load: function(query, callback) { + if (!query || query.length < 3) return callback(); // Only trigger if 3 or more characters are entered + $.ajax({ + url: base_url+'index.php/qso/get_pota', + type: 'GET', + dataType: 'json', + data: { + query: query, + }, + error: function() { + callback(); + }, + success: function(res) { + callback(res); + } + }); + } + }); + + $('#pota_ref').change(function(){ + $('#pota_info').html(''); + $('#pota_info').attr('title', 'Lookup '+$('#pota_ref').val()+' reference info on pota.co'); + }); + $('#darc_dok').selectize({ maxItems: 1, closeAfterSelect: true, @@ -322,6 +355,9 @@ function reset_fields() { var $select = $('#wwff_ref').selectize(); var selectize = $select[0].selectize; selectize.clear(); + var $select = $('#pota_ref').selectize(); + var selectize = $select[0].selectize; + selectize.clear(); var $select = $('#darc_dok').selectize(); var selectize = $select[0].selectize; selectize.clear(); diff --git a/images/icons/pota.app.png b/images/icons/pota.app.png new file mode 100644 index 0000000000000000000000000000000000000000..e53e399b55a7ebd5e2e99b3329697748965744c0 GIT binary patch literal 22190 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 F{14&r<1YXJ literal 0 HcmV?d00001