diff --git a/application/models/Logbookadvanced_model.php b/application/models/Logbookadvanced_model.php index 342397e47..4e026b0f9 100644 --- a/application/models/Logbookadvanced_model.php +++ b/application/models/Logbookadvanced_model.php @@ -1646,6 +1646,8 @@ class Logbookadvanced_model extends CI_Model { return $this->getIncorrectCqZones(); case 'checkincorrectituzones': return $this->getIncorrectItuZones(); + case 'checkiota': + return $this->checkIota(); default: return null; } @@ -2075,4 +2077,47 @@ class Logbookadvanced_model extends CI_Model { return $query->result(); } + + /* + * Get list of QSOs with IOTA that do not match the IOTAs listed for the DXCC. + * Some islands are excluded as they can be in multiple DXCCs. + * These are excluded: + * 'AF-034','AF-055','AF-071','AS-004','AS-034','AS-035','AS-052','EU-005','EU-053', + * 'EU-098','EU-115','EU-117','EU-129','EU-154','EU-191','EU-192','NA-015','NA-096', + * 'NA-105','OC-034','OC-061','OC-088','OC-148','SA-008', 'OC-295' + */ + public function checkIota() { + + $sql = "select col_primary_key, col_time_on, col_call, col_band, col_gridsquare, col_dxcc, col_country, station_profile_name, col_lotw_qsl_rcvd, col_mode, col_submode, col_iota, + ( + select group_concat(distinct dxcc_entities.name order by dxcc_entities.name separator ', ') + from iota + join dxcc_entities on dxcc_entities.adif = iota.dxccid + where iota.tag = thcv.col_iota + order by iota.dxccid asc + ) as correctdxcc + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + join dxcc_entities on dxcc_entities.adif = thcv.COL_DXCC + where station_profile.user_id = ? + and thcv.col_dxcc > 0 + and not exists ( + select 1 + from iota + where dxccid = thcv.col_dxcc + and tag = thcv.col_iota + ) + and thcv.col_dxcc > 0 + and thcv.col_iota is not null + and thcv.col_iota <> '' + and thcv.col_iota not in ('AF-034','AF-055','AF-071','AS-004','AS-034','AS-035','AS-052','EU-005','EU-053', + 'EU-098','EU-115','EU-117','EU-129','EU-154','EU-191','EU-192','NA-015','NA-096', + 'NA-105','OC-034','OC-061','OC-088','OC-148','SA-008', 'OC-295') + order by station_profile_name, col_time_on desc;"; + + $bindings[] = [$this->session->userdata('user_id')]; + + $query = $this->db->query($sql, $bindings); + return $query->result(); + } } diff --git a/application/views/logbookadvanced/checkresult.php b/application/views/logbookadvanced/checkresult.php index 1127bb0e0..15d31875d 100644 --- a/application/views/logbookadvanced/checkresult.php +++ b/application/views/logbookadvanced/checkresult.php @@ -30,6 +30,9 @@ switch ($type) { case 'checkincorrectituzones': check_incorrect_itu_zones($result, $custom_date_format); break; + case 'checkiota': + check_iota($result, $custom_date_format); + break; default: // Invalid type break; @@ -99,7 +102,7 @@ function check_dxcc($result, $custom_date_format) { ?> - + @@ -113,7 +116,7 @@ function check_dxcc($result, $custom_date_format) { ?> - +
@@ -157,7 +160,7 @@ function check_incorrect_gridsquares($result, $custom_date_format) { ?> - + @@ -171,7 +174,7 @@ function check_incorrect_gridsquares($result, $custom_date_format) { ?> col_time_on)); ?> col_band); ?> col_submode ? $qso->col_submode : $qso->col_mode); ?> - col_lotw_qsl_rcvd == 'Y' ? __('Yes') : __('No'); ?> +
col_lotw_qsl_rcvd == 'Y' ? __('Yes') : __('No'); ?>
station_profile_name; ?> col_country), "- (/"), ENT_QUOTES, 'UTF-8'); ?> col_gridsquare; ?> @@ -363,3 +366,62 @@ function check_incorrect_itu_zones($result, $custom_date_format) { ?> echo '
' . __("No incorrect CQ Zones were found.") . '
'; } } + +function check_iota($result, $custom_date_format) { ?> +
+ ' . htmlspecialchars($result['message']) . ''; + return; + } + if ($result) { ?> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
col_primary_key . ')">' . htmlspecialchars($qso->col_call) . ''; ?>col_time_on)); ?>col_band); ?>col_submode ? $qso->col_submode : $qso->col_mode); ?>
col_lotw_qsl_rcvd == 'Y' ? __('Yes') : __('No'); ?>
station_profile_name; ?>col_country), "- (/"), ENT_QUOTES, 'UTF-8'); ?>col_iota.'","All","All","All","All","IOTA")\'>' . $qso->col_iota . ''; ?> correctdxcc ?? ''), "- (/"), ENT_QUOTES, 'UTF-8'); ?>
+
+ + +
+
+
+

+
+
+ +
+
diff --git a/assets/js/sections/logbookadvanced.js b/assets/js/sections/logbookadvanced.js index f0bab2bc5..1ef7c2747 100644 --- a/assets/js/sections/logbookadvanced.js +++ b/assets/js/sections/logbookadvanced.js @@ -2379,17 +2379,22 @@ function saveOptions() { .appendTo($(column.footer()).empty()) .on('change', function () { var val = $.fn.dataTable.util.escapeRegex($(this).val()); - - column.search(val ? '^' + val + '$' : '', true, false).draw(); + // Search in rendered content, not just data + column.search(val ? val : '', true, false).draw(); }); - column - .data() - .unique() - .sort() - .each(function (d, j) { - select.append(''); - }); + // Extract text from rendered cells to get actual displayed content + column.nodes().flatten().to$().each(function () { + var text = $(this).text().trim(); + if (text && !select.find('option[value="' + text + '"]').length) { + select.append(''); + } + }); + + // Sort options + select.find('option:not(:first)').sort(function(a, b) { + return a.text.localeCompare(b.text); + }).appendTo(select); }); rebind_checkbox_trigger_dxcc(); }, @@ -2437,17 +2442,22 @@ function saveOptions() { .appendTo($(column.footer()).empty()) .on('change', function () { var val = $.fn.dataTable.util.escapeRegex($(this).val()); - - column.search(val ? '^' + val + '$' : '', true, false).draw(); + // Search in rendered content, not just data + column.search(val ? val : '', true, false).draw(); }); - column - .data() - .unique() - .sort() - .each(function (d, j) { - select.append(''); - }); + // Extract text from rendered cells to get actual displayed content + column.nodes().flatten().to$().each(function () { + var text = $(this).text().trim(); + if (text && !select.find('option[value="' + text + '"]').length) { + select.append(''); + } + }); + + // Sort options + select.find('option:not(:first)').sort(function(a, b) { + return a.text.localeCompare(b.text); + }).appendTo(select); }); rebind_checkbox_trigger_cq_zone(); @@ -2502,17 +2512,22 @@ function saveOptions() { .appendTo($(column.footer()).empty()) .on('change', function () { var val = $.fn.dataTable.util.escapeRegex($(this).val()); - - column.search(val ? '^' + val + '$' : '', true, false).draw(); + // Search in rendered content, not just data + column.search(val ? val : '', true, false).draw(); }); - column - .data() - .unique() - .sort() - .each(function (d, j) { - select.append(''); - }); + // Extract text from rendered cells to get actual displayed content + column.nodes().flatten().to$().each(function () { + var text = $(this).text().trim(); + if (text && !select.find('option[value="' + text + '"]').length) { + select.append(''); + } + }); + + // Sort options + select.find('option:not(:first)').sort(function(a, b) { + return a.text.localeCompare(b.text); + }).appendTo(select); }); rebind_checkbox_trigger_itu_zone(); }, @@ -2681,17 +2696,22 @@ function saveOptions() { .appendTo($(column.footer()).empty()) .on('change', function () { var val = $.fn.dataTable.util.escapeRegex($(this).val()); - - column.search(val ? '^' + val + '$' : '', true, false).draw(); + // Search in rendered content, not just data + column.search(val ? val : '', true, false).draw(); }); - column - .data() - .unique() - .sort() - .each(function (d, j) { - select.append(''); - }); + // Extract text from rendered cells to get actual displayed content + column.nodes().flatten().to$().each(function () { + var text = $(this).text().trim(); + if (text && !select.find('option[value="' + text + '"]').length) { + select.append(''); + } + }); + + // Sort options + select.find('option:not(:first)').sort(function(a, b) { + return a.text.localeCompare(b.text); + }).appendTo(select); }); }, }); @@ -2817,3 +2837,80 @@ function saveOptions() { } }); } + + function checkIota() { + $('#checkIotaBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkiota' + }, + type: 'POST', + success: function(response) { + $('#checkIotaBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + + $('.result').html(response); + $('#iotaCheckTable').DataTable({ + "pageLength": 25, + responsive: false, + ordering: false, + "scrollY": "510px", + "scrollCollapse": true, + "paging": false, + "scrollX": false, + "language": { + url: getDataTablesLanguageUrl(), + }, + initComplete: function () { + this.api() + .columns('.select-filter') + .every(function () { + var column = this; + var select = $('') + .appendTo($(column.footer()).empty()) + .on('change', function () { + var val = $.fn.dataTable.util.escapeRegex($(this).val()); + // Search in rendered content, not just data + column.search(val ? val : '', true, false).draw(); + }); + + // Extract text from rendered cells to get actual displayed content + column.nodes().flatten().to$().each(function () { + // Get text from the first anchor link which contains the IOTA reference + var $anchor = $(this).find('a').first(); + var text = $anchor.length ? $anchor.text().trim() : $(this).text().trim(); + // Remove any extra whitespace + text = text.split(/\s+/)[0]; + if (text && !select.find('option[value="' + text + '"]').length) { + select.append(''); + } + }); + + // Sort options + select.find('option:not(:first)').sort(function(a, b) { + return a.text.localeCompare(b.text); + }).appendTo(select); + }); + }, + }); + }, + error: function(xhr, status, error) { + $('#checkIotaBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + + let errorMsg = 'Error checking iota information'; + if (xhr.responseJSON && xhr.responseJSON.message) { + errorMsg += ': ' + xhr.responseJSON.message; + } + + BootstrapDialog.alert({ + title: 'Error', + message: errorMsg, + type: BootstrapDialog.TYPE_DANGER + }); + } + }); + }