diff --git a/application/controllers/Continents.php b/application/controllers/Continents.php
new file mode 100644
index 00000000..a3f48ff8
--- /dev/null
+++ b/application/controllers/Continents.php
@@ -0,0 +1,48 @@
+load->model('user_model');
+ $this->load->model('bands');
+ if(!$this->user_model->authorize($this->config->item('auth_mode'))) {
+ if($this->user_model->validate_session()) {
+ $this->user_model->clear_session();
+ show_error('Access denied
Click here to log in as another user', 403);
+ } else {
+ redirect('user/login');
+ }
+ }
+ // Render User Interface
+
+ // Set Page Title
+ $data['page_title'] = "Continents";
+
+ // Load Views
+ $this->load->view('interface_assets/header', $data);
+ $this->load->view('continents/index');
+ $this->load->view('interface_assets/footer');
+ }
+
+
+ public function get_continents() {
+ $this->load->model('logbook_model');
+
+ $continentsstats = array();
+
+ $total_continents = $this->logbook_model->total_continents();
+ $i = 0;
+
+ if ($total_continents) {
+ foreach($total_continents->result() as $qso_numbers) {
+ $continentsstats[$i]['cont'] = $qso_numbers->COL_CONT;
+ $continentsstats[$i++]['count'] = $qso_numbers->count;
+ }
+ }
+
+ header('Content-Type: application/json');
+ echo json_encode($continentsstats);
+ }
+
+}
diff --git a/application/models/Logbook_model.php b/application/models/Logbook_model.php
index 1ca2f4da..6a94d771 100755
--- a/application/models/Logbook_model.php
+++ b/application/models/Logbook_model.php
@@ -1630,6 +1630,28 @@ class Logbook_model extends CI_Model {
return $query;
}
+ /* Return total number of QSOs per continent */
+ function total_continents() {
+
+ $CI =& get_instance();
+ $CI->load->model('logbooks_model');
+ $logbooks_locations_array = $CI->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
+
+ if (!$logbooks_locations_array) {
+ return null;
+ }
+
+ $this->db->select('COL_CONT, COUNT( * ) as count', FALSE);
+ $this->db->where_in('station_id', $logbooks_locations_array);
+ $this->db->where('COL_CONT is not null');
+ $this->db->where('COL_CONT !=', '');
+ $this->db->order_by('count DESC');
+ $this->db->group_by('COL_CONT');
+ $query = $this->db->get($this->config->item('table_name'));
+
+ return $query;
+ }
+
/* Return total number of CW QSOs */
function total_cw() {
diff --git a/application/views/continents/index.php b/application/views/continents/index.php
new file mode 100644
index 00000000..da349ee2
--- /dev/null
+++ b/application/views/continents/index.php
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | # |
+ Continent |
+ # of QSO's worked |
+
+
+
+
+
+
+
diff --git a/application/views/interface_assets/footer.php b/application/views/interface_assets/footer.php
index 68b731e5..c66bc8ad 100644
--- a/application/views/interface_assets/footer.php
+++ b/application/views/interface_assets/footer.php
@@ -64,6 +64,12 @@ function load_was_map() {
+uri->segment(1) == "continents") { ?>
+
+
+
+
+
uri->segment(1) == "adif" || $this->uri->segment(1) == "qrz") { ?>
diff --git a/application/views/interface_assets/header.php b/application/views/interface_assets/header.php
index 03ee041a..4cb69d2d 100644
--- a/application/views/interface_assets/header.php
+++ b/application/views/interface_assets/header.php
@@ -110,6 +110,8 @@
Timeplotter
Custom Maps
+
+ Continents
diff --git a/assets/js/sections/continents.js b/assets/js/sections/continents.js
new file mode 100644
index 00000000..e58a2422
--- /dev/null
+++ b/assets/js/sections/continents.js
@@ -0,0 +1,137 @@
+totalContinentQsos();
+
+// Needed for continentstable header fix, will be squished without
+$("a[href='#continents']").on('shown.bs.tab', function(e) {
+ $(".continentstable").DataTable().columns.adjust();
+});
+
+function totalContinentQsos() {
+ // using this to change color of legend and label according to background color
+ var color = ifDarkModeThemeReturn('white', 'grey');
+
+ $.ajax({
+ url: base_url+'index.php/continents/get_continents',
+ type: 'post',
+ success: function (data) {
+ if (data.length > 0) {
+ $('.tabs').removeAttr('hidden');
+
+ var labels = [];
+ var dataQso = [];
+ var totalQso = Number(0);
+
+ var $myTable = $('.continentstable');
+ var i = 1;
+
+ // building the rows in the table
+ var rowElements = data.map(function (row) {
+
+ var $row = $('
');
+
+ var $iterator = $(' | ').html(i++);
+ var $type = $(' | ').html(row.cont);
+ var $content = $(' | ').html(row.count);
+
+ $row.append($iterator, $type, $content);
+
+ return $row;
+ });
+
+ // finally inserting the rows
+ $myTable.append(rowElements);
+
+ $.each(data, function () {
+ labels.push(this.cont);
+ dataQso.push(this.count);
+ totalQso = Number(totalQso) + Number(this.count);
+ });
+
+ const COLORS = ["#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499"]
+ var ctx = document.getElementById("continentChart").getContext('2d');
+ var myChart = new Chart(ctx, {
+ plugins: [ChartPieChartOutlabels],
+ type: 'doughnut',
+ data: {
+ labels: labels,
+ datasets: [{
+ borderColor: 'rgba(54, 162, 235, 1)',
+ label: 'Number of QSO\'s worked',
+ data: dataQso,
+ backgroundColor: ["#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499"],
+ borderWidth: 1,
+ labels: labels,
+ }]
+ },
+
+ options: {
+ layout: {
+ padding: 100
+ },
+ title: {
+ fontColor: color,
+ fullSize: true,
+ },
+ responsive: false,
+ maintainAspectRatio: true,
+ plugins: {
+ legend: {
+ display: false,
+ labels: {
+ boxWidth: 15,
+ color: color,
+ font: {
+ size: 14,
+ }
+ },
+ position: 'right',
+ align: "middle"
+ },
+ outlabels: {
+ display: function(context) { // Hide labels with low percentage
+ return ((context.dataset.data[context.dataIndex] / totalQso * 100) > 1)
+ },
+ backgroundColor: COLORS,
+ borderColor: COLORS,
+ borderRadius: 2, // Border radius of Label
+ borderWidth: 2, // Thickness of border
+ color: 'white',
+ stretch: 10,
+ padding: 0,
+ font: {
+ resizable: true,
+ minSize: 12,
+ maxSize: 25,
+ family: Chart.defaults.font.family,
+ size: Chart.defaults.font.size,
+ style: Chart.defaults.font.style,
+ lineHeight: Chart.defaults.font.lineHeight,
+ },
+ zoomOutPercentage: 100,
+ textAlign: 'start',
+ backgroundColor: COLORS,
+ }
+ }
+ }
+ });
+
+ // using this to change color of csv-button if dark mode is chosen
+ var background = $('body').css("background-color");
+
+ if (background != ('rgb(255, 255, 255)')) {
+ $(".buttons-csv").css("color", "white");
+ }
+
+ $('.continentstable').DataTable({
+ responsive: false,
+ ordering: false,
+ "scrollY": "330px",
+ "scrollX": true,
+ "ScrollCollapse": true,
+ "paging": false,
+ bFilter: false,
+ bInfo: false,
+ });
+ }
+ }
+ });
+}