From 6b1f30cb0d81381adf7bbe6e405698e08b2e8722 Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 28 Oct 2020 23:20:03 +0100 Subject: [PATCH 1/6] New feature: QSL card image upload --- application/config/migration.php | 2 +- application/controllers/Logbook.php | 3 + application/controllers/Qsl.php | 104 +++ application/migrations/054_add_qsl_images.php | 19 + application/models/Qsl_model.php | 61 ++ application/views/interface_assets/footer.php | 58 ++ application/views/interface_assets/header.php | 2 + application/views/qslcard/index.php | 28 + application/views/qslcard/upload_done.php | 15 + application/views/view_log/qso.php | 602 +++++++++++------- 10 files changed, 646 insertions(+), 248 deletions(-) create mode 100644 application/controllers/Qsl.php create mode 100644 application/migrations/054_add_qsl_images.php create mode 100644 application/models/Qsl_model.php create mode 100644 application/views/qslcard/index.php create mode 100644 application/views/qslcard/upload_done.php diff --git a/application/config/migration.php b/application/config/migration.php index 70841b48..2b1e5243 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'] = 52; +$config['migration_version'] = 54; /* |-------------------------------------------------------------------------- diff --git a/application/controllers/Logbook.php b/application/controllers/Logbook.php index 61e06e58..ac8b85ef 100755 --- a/application/controllers/Logbook.php +++ b/application/controllers/Logbook.php @@ -411,6 +411,9 @@ class Logbook extends CI_Controller { $data['measurement_base'] = $this->session->userdata('user_measurement_base'); } + $this->load->model('Qsl_model'); + $data['qslimages'] = $this->Qsl_model->getQslForQsoId($id); + $this->load->view('interface_assets/mini_header', $data); $this->load->view('view_log/qso'); $this->load->view('interface_assets/footer'); diff --git a/application/controllers/Qsl.php b/application/controllers/Qsl.php new file mode 100644 index 00000000..3c8f5919 --- /dev/null +++ b/application/controllers/Qsl.php @@ -0,0 +1,104 @@ +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() { + // Render Page + $data['page_title'] = "QSL Cards"; + + $this->load->model('qsl_model'); + $data['qslarray'] = $this->qsl_model->getQsoWithQslList(); + + $this->load->view('interface_assets/header', $data); + $this->load->view('qslcard/index'); + $this->load->view('interface_assets/footer'); + } + + public function upload() { + // Render Page + $data['page_title'] = "Upload QSL Cards"; + $this->load->view('interface_assets/header', $data); + $this->load->view('qslcard/upload'); + $this->load->view('interface_assets/footer'); + } + + public function delete() { + $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'); } + + $id = $this->input->post('id'); + $this->load->model('Qsl_model'); + + $path = './assets/qslcard/'; + $file = $this->Qsl_model->getFilename($id)->row(); + $filename = $file->filename; + unlink($path.$filename); + + $this->Qsl_model->deleteQsl($id); + } + + public function uploadqsl() { + $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'); } + + if (!file_exists('./assets/qslcard')) { + mkdir('./assets/qslcard', 0755, true); + } + $qsoid = $this->input->post('qsoid'); + + if (isset($_FILES['qslcardfront']) && $_FILES['qslcardfront']['name'] != "" && $_FILES['qslcardfront']['error'] == 0) + { + $result = $this->uploadQslCard($qsoid); + } + + // Set Page Title + $data['page_title'] = "QSL Upload"; + + // Load Views + $this->load->view('interface_assets/header', $data); + $this->load->view('qslcard/upload_done', $result); + $this->load->view('interface_assets/footer'); + } + + function uploadQslCard($qsoid) { + $config['upload_path'] = './assets/qslcard'; + $config['allowed_types'] = 'jpg|gif|png'; + $array = explode(".", $_FILES['qslcardfront']['name']); + $ext = end($array); + $config['file_name'] = $qsoid . '_' . time() . '.' . $ext; + + $this->load->library('upload', $config); + + if ( ! $this->upload->do_upload('qslcardfront')) { + // Upload of QSL card Failed + $error = array('error' => $this->upload->display_errors()); + + return $error; + } + else { + // Load database queries + $this->load->model('Qsl_model'); + + //Upload of QSL card was successful + $data = $this->upload->data(); + + // Now we need to insert info into database about file + $filename = $data['file_name']; + $this->Qsl_model->saveQsl($qsoid, $filename); + + return 'Success'; + } + } + +} \ No newline at end of file diff --git a/application/migrations/054_add_qsl_images.php b/application/migrations/054_add_qsl_images.php new file mode 100644 index 00000000..9b3538fa --- /dev/null +++ b/application/migrations/054_add_qsl_images.php @@ -0,0 +1,19 @@ +db->query("CREATE TABLE `qsl_images` + (`id` integer NOT NULL auto_increment, `qsoid` int, `filename` text, primary key (id)) + ENGINE=myisam DEFAULT CHARSET=utf8;"); + } + + public function down() + { + $this->db->query(""); + } +} \ No newline at end of file diff --git a/application/models/Qsl_model.php b/application/models/Qsl_model.php new file mode 100644 index 00000000..4071ffd7 --- /dev/null +++ b/application/models/Qsl_model.php @@ -0,0 +1,61 @@ +load->model('Stations'); + $station_id = $CI->Stations->find_active(); + + $this->db->select('*'); + $this->db->from($this->config->item('table_name')); + $this->db->join('qsl_images', 'qsl_images.qsoid = ' . $this->config->item('table_name') . '.col_primary_key'); + $this->db->where('station_id', $station_id); + + return $this->db->get(); + } + + function getQslForQsoId($id) { + // Clean ID + $clean_id = $this->security->xss_clean($id); + + $this->db->select('*'); + $this->db->from('qsl_images'); + $this->db->where('qsoid', $clean_id); + + return $this->db->get()->result(); + } + + function saveQsl($qsoid, $filename) { + $data = array( + 'qsoid' => $qsoid, + 'filename' => $filename + ); + + $this->db->insert('qsl_images', $data); + } + + function deleteQsl($id) { + // Clean ID + $clean_id = $this->security->xss_clean($id); + + // Delete Mode + $this->db->delete('qsl_images', array('id' => $clean_id)); + } + + function getFilename($id) { + // Clean ID + $clean_id = $this->security->xss_clean($id); + + $this->db->select('filename'); + $this->db->from('qsl_images'); + $this->db->where('id', $clean_id); + + return $this->db->get(); + } +} \ No newline at end of file diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index d0af4c4e..d5bd0858 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -2265,5 +2265,63 @@ $(document).ready(function(){ +uri->segment(1) == "qsl") { ?> + + + diff --git a/application/views/interface_assets/header.php b/application/views/interface_assets/header.php index d7125e90..867f069a 100644 --- a/application/views/interface_assets/header.php +++ b/application/views/interface_assets/header.php @@ -67,6 +67,8 @@ Live QSO Post QSO + + View QSL diff --git a/application/views/qslcard/index.php b/application/views/qslcard/index.php new file mode 100644 index 00000000..d00f5ac5 --- /dev/null +++ b/application/views/qslcard/index.php @@ -0,0 +1,28 @@ +
+

+ + result())) { + echo ' + + + + + + + + '; + + foreach ($qslarray->result() as $qsl) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo '
CallsignQSL
' . $qsl->COL_CALL . '' . $qsl->filename . '
'; + } + ?> +
\ No newline at end of file diff --git a/application/views/qslcard/upload_done.php b/application/views/qslcard/upload_done.php new file mode 100644 index 00000000..fb04ab55 --- /dev/null +++ b/application/views/qslcard/upload_done.php @@ -0,0 +1,15 @@ +
+ +

+
+ + + + + +
+
\ No newline at end of file diff --git a/application/views/view_log/qso.php b/application/views/view_log/qso.php index c8c035eb..0ebf77f3 100644 --- a/application/views/view_log/qso.php +++ b/application/views/view_log/qso.php @@ -1,274 +1,382 @@ num_rows() > 0) { foreach ($query->result() as $row) { ?> -
+
-
-
-

QSO Details

-
-
+
+ +
+ +
+ + config->item('use_auth') && ($this->session->userdata('user_type') >= 2)) || $this->config->item('use_auth') === FALSE) { ?> +
+

Edit QSO

+ + + COL_SAT_NAME != null) { + $twitter_band_sat = $row->COL_SAT_NAME; + $hashtags = "#hamr #cloudlog #amsat"; + } else { + $twitter_band_sat = $row->COL_BAND; + $hashtags = "#hamr #cloudlog"; + } + + $twitter_string = urlencode("Just worked ".$row->COL_CALL." in ".ucwords(strtolower(($row->COL_COUNTRY)))." (Gridsquare: ".$row->COL_GRIDSQUARE.") on ".$twitter_band_sat." using ".$row->COL_MODE." ".$hashtags); + ?> + + + +
+
+ + + config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) { + ?> +
+ 0) { + echo ' + + + + + + '; + + foreach ($qslimages as $qsl) { + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo '
QSL image file
' . $qsl->filename . '
'; + } + ?> +
+
+ +
+ + +
+ + + + + +
+
+
+ +
+ + + + Previous + + + + Next + +
+ + + + Date: Thu, 29 Oct 2020 17:34:59 +0000 Subject: [PATCH 2/6] Fixed migration file was malformed PHP, changed some text in the tabs --- application/config/migration.php | 3 ++- application/views/view_log/qso.php | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/application/config/migration.php b/application/config/migration.php index f13adb35..2b1e5243 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -21,7 +21,8 @@ $config['migration_enabled'] = TRUE; | be upgraded / downgraded to. | */ -$config['migra +$config['migration_version'] = 54; + /* |-------------------------------------------------------------------------- | Migrations Path diff --git a/application/views/view_log/qso.php b/application/views/view_log/qso.php index f92a0fa8..0d5048e1 100644 --- a/application/views/view_log/qso.php +++ b/application/views/view_log/qso.php @@ -10,12 +10,12 @@ if (count($qslimages) > 0) { echo ''; } echo ''; From 3187b7386bf22d2118ea8a2209f1948521c5cffc Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Thu, 29 Oct 2020 17:35:52 +0000 Subject: [PATCH 3/6] Added assets/qslcard/ to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a1c29b94..31205243 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ /updates/*.html /images/eqsl_card_images/*.jpg /updates/clublog_scp.txt +/assets/qslcard/* .idea/* .DS_Store sync.sh From 82ad08d2909e6a92202d5e8d6a78b046d9f30c87 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 29 Oct 2020 20:18:51 +0100 Subject: [PATCH 4/6] Added front and back image upload at the same time. --- application/controllers/Qsl.php | 39 +++++++++++++++++++++-- application/views/qslcard/upload_done.php | 18 ++++++++--- application/views/view_log/qso.php | 7 +++- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/application/controllers/Qsl.php b/application/controllers/Qsl.php index 3c8f5919..a79f7067 100644 --- a/application/controllers/Qsl.php +++ b/application/controllers/Qsl.php @@ -59,7 +59,12 @@ class Qsl extends CI_Controller { if (isset($_FILES['qslcardfront']) && $_FILES['qslcardfront']['name'] != "" && $_FILES['qslcardfront']['error'] == 0) { - $result = $this->uploadQslCard($qsoid); + $result['front'] = $this->uploadQslCardFront($qsoid); + } + + if (isset($_FILES['qslcardback']) && $_FILES['qslcardback']['name'] != "" && $_FILES['qslcardback']['error'] == 0) + { + $result['back'] = $this->uploadQslCardBack($qsoid); } // Set Page Title @@ -71,7 +76,7 @@ class Qsl extends CI_Controller { $this->load->view('interface_assets/footer'); } - function uploadQslCard($qsoid) { + function uploadQslCardFront($qsoid) { $config['upload_path'] = './assets/qslcard'; $config['allowed_types'] = 'jpg|gif|png'; $array = explode(".", $_FILES['qslcardfront']['name']); @@ -101,4 +106,34 @@ class Qsl extends CI_Controller { } } + function uploadQslCardBack($qsoid) { + $config['upload_path'] = './assets/qslcard'; + $config['allowed_types'] = 'jpg|gif|png'; + $array = explode(".", $_FILES['qslcardback']['name']); + $ext = end($array); + $config['file_name'] = $qsoid . '_' . time() . '.' . $ext; + + $this->load->library('upload', $config); + + if ( ! $this->upload->do_upload('qslcardback')) { + // Upload of QSL card Failed + $error = array('error' => $this->upload->display_errors()); + + return $error; + } + else { + // Load database queries + $this->load->model('Qsl_model'); + + //Upload of QSL card was successful + $data = $this->upload->data(); + + // Now we need to insert info into database about file + $filename = $data['file_name']; + $this->Qsl_model->saveQsl($qsoid, $filename); + + return 'Success'; + } + } + } \ No newline at end of file diff --git a/application/views/qslcard/upload_done.php b/application/views/qslcard/upload_done.php index fb04ab55..a968394b 100644 --- a/application/views/qslcard/upload_done.php +++ b/application/views/qslcard/upload_done.php @@ -2,14 +2,24 @@

- + + Front QSL Card image has been uploaded! +
+ + + + + + \ No newline at end of file diff --git a/application/views/view_log/qso.php b/application/views/view_log/qso.php index 0d5048e1..cafeceb9 100644 --- a/application/views/view_log/qso.php +++ b/application/views/view_log/qso.php @@ -320,10 +320,15 @@
- +
+
+ + +
+ From 6de9ff69b0a814d3ad8d1595e9c5f835152dc488 Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Fri, 30 Oct 2020 16:11:41 +0000 Subject: [PATCH 5/6] Changed Migration so that it checks if qsl_images exists as i kept getting errors jumping around branches :) --- application/migrations/054_add_qsl_images.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/migrations/054_add_qsl_images.php b/application/migrations/054_add_qsl_images.php index 9b3538fa..a66093d9 100644 --- a/application/migrations/054_add_qsl_images.php +++ b/application/migrations/054_add_qsl_images.php @@ -7,7 +7,7 @@ class Migration_add_qsl_images extends CI_Migration { public function up() { // create qsl images table - $this->db->query("CREATE TABLE `qsl_images` + $this->db->query("CREATE TABLE IF NOT EXISTS `qsl_images` (`id` integer NOT NULL auto_increment, `qsoid` int, `filename` text, primary key (id)) ENGINE=myisam DEFAULT CHARSET=utf8;"); } From bcfe97957333054ec12167948956383fa6bf68b8 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sun, 1 Nov 2020 12:36:02 +0100 Subject: [PATCH 6/6] [QSL Card image] jQuery upload, dynamically adding/deleting to table and carousel. --- application/controllers/Qsl.php | 23 ++-- application/models/Qsl_model.php | 2 + application/views/interface_assets/footer.php | 100 +++++++++++++++++- application/views/view_log/qso.php | 23 ++-- 4 files changed, 124 insertions(+), 24 deletions(-) diff --git a/application/controllers/Qsl.php b/application/controllers/Qsl.php index a79f7067..7a590d15 100644 --- a/application/controllers/Qsl.php +++ b/application/controllers/Qsl.php @@ -67,13 +67,8 @@ class Qsl extends CI_Controller { $result['back'] = $this->uploadQslCardBack($qsoid); } - // Set Page Title - $data['page_title'] = "QSL Upload"; - - // Load Views - $this->load->view('interface_assets/header', $data); - $this->load->view('qslcard/upload_done', $result); - $this->load->view('interface_assets/footer'); + header("Content-type: application/json"); + echo json_encode(['status' => $result]); } function uploadQslCardFront($qsoid) { @@ -100,9 +95,12 @@ class Qsl extends CI_Controller { // Now we need to insert info into database about file $filename = $data['file_name']; - $this->Qsl_model->saveQsl($qsoid, $filename); + $insertid = $this->Qsl_model->saveQsl($qsoid, $filename); - return 'Success'; + $result['status'] = 'Success'; + $result['insertid'] = $insertid; + $result['filename'] = $filename; + return $result; } } @@ -130,9 +128,12 @@ class Qsl extends CI_Controller { // Now we need to insert info into database about file $filename = $data['file_name']; - $this->Qsl_model->saveQsl($qsoid, $filename); + $insertid = $this->Qsl_model->saveQsl($qsoid, $filename); - return 'Success'; + $result['status'] = 'Success'; + $result['insertid'] = $insertid; + $result['filename'] = $filename; + return $result; } } diff --git a/application/models/Qsl_model.php b/application/models/Qsl_model.php index 4071ffd7..cb7640c9 100644 --- a/application/models/Qsl_model.php +++ b/application/models/Qsl_model.php @@ -38,6 +38,8 @@ class Qsl_model extends CI_Model { ); $this->db->insert('qsl_images', $data); + + return $this->db->insert_id(); } function deleteQsl($id) { diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php index d716f535..4e7764a3 100644 --- a/application/views/interface_assets/footer.php +++ b/application/views/interface_assets/footer.php @@ -1449,7 +1449,6 @@ $(document).ready(function(){ L.marker([lat,long], {icon: redIcon}).addTo(mymap) .bindPopup(callsign); - mymap.on('click', onMapClick); }, }); @@ -2317,7 +2316,18 @@ function deleteQsl(id) { data: {'id': id }, success: function(data) { - $("#" + id).parent("tr:first").remove(); // removes mode from table + $("#" + id).parent("tr:first").remove(); // removes qsl from table + + // remove qsl from carousel + $(".carousel-indicators li:last-child").remove(); + $(".carouselimageid_"+id).remove(); + $('#carouselExampleIndicators').find('.carousel-item').first().addClass('active'); + + // remove table and hide tab if all qsls are deleted + if ($('.qsltable tr').length == 1) { + $('.qsltable').remove(); + $('.qslcardtab').attr('hidden',''); + } } }); } @@ -2325,5 +2335,91 @@ function deleteQsl(id) { }); } + + diff --git a/application/views/view_log/qso.php b/application/views/view_log/qso.php index cafeceb9..2440de91 100644 --- a/application/views/view_log/qso.php +++ b/application/views/view_log/qso.php @@ -8,18 +8,19 @@ config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) { - if (count($qslimages) > 0) { - echo ''; + echo '
  • + QSL Card +
  • '; echo ''; - - } + ?> @@ -309,14 +310,14 @@ foreach ($qslimages as $qsl) { echo ''; echo '' . $qsl->filename . ''; - echo ''; + echo ''; echo ''; } echo ''; } ?> -
    +
    @@ -331,7 +332,7 @@ - +
    @@ -357,7 +358,7 @@ id; if ($i == 1) { echo ' active'; }