diff --git a/application/models/Logbookadvanced_model.php b/application/models/Logbookadvanced_model.php index 6892f27f8..a489c265c 100644 --- a/application/models/Logbookadvanced_model.php +++ b/application/models/Logbookadvanced_model.php @@ -1549,9 +1549,56 @@ class Logbookadvanced_model extends CI_Model { return $this->check_missing_itu_zones(); case 'checkgrids': return $this->getMissingGridQsos(); + case 'checkincorrectgridsquares': + return $this->getIncorrectGridsquares(); + case 'checkincorrectcqzones': + return $this->getIncorrectCqZones(); + case 'checkincorrectituzones': + return $this->getIncorrectItuZones(); return null; } } + /* + * Get list of QSOs with gridsquares that do not match the gridsquares listed for the DXCC. + * The data comes from the TQSL published Gridsquare list for DXCCs. + */ + public function getIncorrectGridsquares() { + $sqlcheck = "select count(*) as count from vuccgrids";; + $querycheck = $this->db->query($sqlcheck); + $rowcheck = $querycheck->row(); + if ($rowcheck->count == 0) { + return ['status' => 'error', 'message' => __("VuccGrids table is empty. Please import the VUCC grids data first.")]; + } + + $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, + ( + select group_concat(distinct gridsquare order by gridsquare separator ', ') + from vuccgrids + where adif = thcv.col_dxcc + order by gridsquare asc + ) as correctgridsquare + 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 vuccgrids + where adif = thcv.col_dxcc + and gridsquare = substr(thcv.col_gridsquare, 1, 4) + ) + and exists (select 1 from vuccgrids where adif = thcv.col_dxcc) + and thcv.col_dxcc > 0 + and thcv.col_gridsquare is not null + and thcv.col_gridsquare <> '' + order by station_profile_name, col_time_on desc"; + + $bindings[] = [$this->session->userdata('user_id')]; + + $query = $this->db->query($sql, $bindings); + return $query->result(); + } public function check_missing_dxcc() { $sql = "select count(*) as count from " . $this->config->item('table_name') . " @@ -1811,6 +1858,10 @@ class Logbookadvanced_model extends CI_Model { return $query->result(); } + /* + Function to run batch fixes on the logbook. + Used in dbtools section. + */ function batchFix($type) { switch ($type) { case 'dxcc': @@ -1833,6 +1884,7 @@ class Logbookadvanced_model extends CI_Model { /* Another function moved from update to the advanced logbook, to be used in the dbtools section. It did not have filter on user or location. + This function will check all QSOs with missing grid square and try to fill them using the callbook lookup. */ public function check_missing_grid() { $result = $this->getMissingGridQsos(); @@ -1891,6 +1943,9 @@ class Logbookadvanced_model extends CI_Model { return $query->result(); } + /* + Check all QSOs DXCC against current DXCC database + */ public function check_dxcc() { $i = 0; @@ -1914,6 +1969,10 @@ class Logbookadvanced_model extends CI_Model { $result[] = array( 'callsign' => $call->col_call, 'qso_date' => $call->date, + 'mode' => isset($call->col_mode) ? $call->col_mode : '', + 'submode' => isset($call->col_submode) ? $call->col_submode : '', + 'band' => isset($call->col_band) ? $call->col_band : '', + 'lotw_qsl_rcvd' => isset($call->col_lotw_qsl_rcvd) ? $call->col_lotw_qsl_rcvd : '', 'station_profile' => $call->station_profile_name, 'existing_dxcc' => $call->col_country, 'existing_adif' => $call->col_dxcc, @@ -1938,7 +1997,7 @@ class Logbookadvanced_model extends CI_Model { } function getQsos() { - $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date, station_profile.station_profile_name, col_primary_key + $sql = 'select distinct col_country, col_call, col_dxcc, date(col_time_on) date, col_mode, col_submode, col_band, col_lotw_qsl_rcvd, station_profile.station_profile_name, col_primary_key from ' . $this->config->item('table_name') . ' join station_profile on ' . $this->config->item('table_name') . '.station_id = station_profile.station_id where station_profile.user_id = ?'; @@ -1980,4 +2039,44 @@ class Logbookadvanced_model extends CI_Model { $result['count'] = $count; return $result; } + + function getIncorrectCqZones() { + if(!clubaccess_check(9)) return; + + $sql = "select *, (select group_concat(distinct cqzone order by cqzone separator ', ') from dxcc_master where countrycode = thcv.col_dxcc and cqzone <> '' order by cqzone asc) as correctcqzone + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + where station_profile.user_id = ? + and not exists (select 1 from dxcc_master where countrycode = thcv.col_dxcc and cqzone = col_cqz) and col_dxcc > 0 + "; + + $params[] = $this->session->userdata('user_id'); + + $sql .= " order by station_profile.station_profile_name, thcv.col_time_on desc + limit 5000"; + + $query = $this->db->query($sql, $params); + + return $query->result(); + } + + function getIncorrectItuZones() { + if(!clubaccess_check(9)) return; + + $sql = "select *, (select group_concat(distinct ituzone order by ituzone separator ', ') from dxcc_master where countrycode = thcv.col_dxcc and ituzone <> '' order by ituzone asc) as correctituzone + from " . $this->config->item('table_name') . " thcv + join station_profile on thcv.station_id = station_profile.station_id + where station_profile.user_id = ? + and not exists (select 1 from dxcc_master where countrycode = thcv.col_dxcc and ituzone = col_ituz) and col_dxcc > 0 + "; + + $params[] = $this->session->userdata('user_id'); + + $sql .= " order by station_profile.station_profile_name, thcv.col_time_on desc + limit 5000"; + + $query = $this->db->query($sql, $params); + + return $query->result(); + } } diff --git a/application/views/logbookadvanced/checkresult.php b/application/views/logbookadvanced/checkresult.php index a7ce37d6b..621d38cca 100644 --- a/application/views/logbookadvanced/checkresult.php +++ b/application/views/logbookadvanced/checkresult.php @@ -31,6 +31,15 @@ switch ($type) { case 'checkdxcc': check_dxcc($result, $custom_date_format); break; + case 'checkincorrectgridsquares': + check_incorrect_gridsquares($result, $custom_date_format); + break; + case 'checkincorrectcqzones': + check_incorrect_cq_zones($result, $custom_date_format); + break; + case 'checkincorrectituzones': + check_incorrect_itu_zones($result, $custom_date_format); + break; default: // Invalid type break; @@ -132,8 +141,11 @@ function check_dxcc($result, $custom_date_format) { ?>
- - + + + + + @@ -143,14 +155,241 @@ function check_dxcc($result, $custom_date_format) { ?>
' . htmlspecialchars($qso['callsign']) . ''; ?> + + + + + + + + + + + + + + + + +
+ ' . 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_gridsquare; ?> + correctgridsquare; + $maxChars = 50; + if (strlen($gridsquare) > $maxChars) { + $truncated = substr($gridsquare, 0, $maxChars); + $uniqueId = 'gridsquare-' . $qso->col_primary_key; + echo '' . htmlspecialchars($truncated) . '... '; + echo ' '; + echo '' . __('Show more') . ''; + } else { + echo htmlspecialchars($gridsquare); + } + ?> +
+
+ + +
+ +
+ + + + +
+ ' . __("Callsign") . ' + ' . __("Date") . ' + ' . __("Time") . ' + ' . __("Mode") . ' + ' . __("Band") . ' + ' . __("Gridsquare") . ' + ' . __("CQ Zone") . ' + ' . __("DXCC CQ Zone") . ' + ' . __("DXCC") . ' + ' . __("Station") . ' + + + '; + + $i = 0; + + foreach ($result as $qso) { + echo ''; + echo '
'; + echo '' . str_replace("0","Ø",strtoupper($qso->COL_CALL)) . ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date($custom_date_format, $timestamp); echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date('H:i', $timestamp); echo ''; + echo ''; echo $qso->COL_SUBMODE==null?$qso->COL_MODE:$qso->COL_SUBMODE; echo ''; + echo ''; if($qso->COL_SAT_NAME != null) { echo $qso->COL_SAT_NAME; } else { echo strtolower($qso->COL_BAND); }; echo ''; + echo ''; echo strlen($qso->COL_GRIDSQUARE ?? '')==0?$qso->COL_VUCC_GRIDS:$qso->COL_GRIDSQUARE; echo ''; + echo '' . $qso->COL_CQZ . ''; + echo '' . $qso->correctcqzone . ''; + echo '' . ucwords(strtolower($qso->COL_COUNTRY), "- (/") . ''; + echo '' . $qso->station_profile_name . ''; + echo ''; + } + + echo ' + + + + + + + + + + + + + + + + '; + ?> + + ' . __("No incorrect CQ Zones were found.") . ''; + } +} + +function check_incorrect_itu_zones($result, $custom_date_format) { ?> +
+ +
+ + + + +
+ ' . __("Callsign") . ' + ' . __("Date") . ' + ' . __("Time") . ' + ' . __("Mode") . ' + ' . __("Band") . ' + ' . __("Gridsquare") . ' + ' . __("ITU Zone") . ' + ' . __("DXCC ITU Zone") . ' + ' . __("DXCC") . ' + ' . __("Station") . ' + + + '; + + $i = 0; + + foreach ($result as $qso) { + echo ''; + echo '
'; + echo '' . str_replace("0","Ø",strtoupper($qso->COL_CALL)) . ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date($custom_date_format, $timestamp); echo ''; + echo ''; $timestamp = strtotime($qso->COL_TIME_ON); echo date('H:i', $timestamp); echo ''; + echo ''; echo $qso->COL_SUBMODE==null?$qso->COL_MODE:$qso->COL_SUBMODE; echo ''; + echo ''; if($qso->COL_SAT_NAME != null) { echo $qso->COL_SAT_NAME; } else { echo strtolower($qso->COL_BAND); }; echo ''; + echo ''; echo strlen($qso->COL_GRIDSQUARE ?? '')==0?$qso->COL_VUCC_GRIDS:$qso->COL_GRIDSQUARE; echo ''; + echo '' . $qso->COL_ITUZ . ''; + echo '' . $qso->correctituzone . ''; + echo '' . ucwords(strtolower($qso->COL_COUNTRY), "- (/") . ''; + echo '' . $qso->station_profile_name . ''; + echo ''; + } + + echo ' + + + + + + + + + + + + + + + + '; + ?> + + ' . __("No incorrect CQ Zones were found.") . ''; + } +} diff --git a/application/views/logbookadvanced/dbtoolsdialog.php b/application/views/logbookadvanced/dbtoolsdialog.php index 149a43cda..c62fe71fb 100644 --- a/application/views/logbookadvanced/dbtoolsdialog.php +++ b/application/views/logbookadvanced/dbtoolsdialog.php @@ -3,8 +3,9 @@
- +
+

@@ -17,6 +18,17 @@
+
+
+
+

+
+
+ +
+
@@ -30,6 +42,30 @@
+
+
+
+

+
+
+ +
+
+ +
+
+
+

+
+
+ +
+
+
diff --git a/application/views/logbookadvanced/index.php b/application/views/logbookadvanced/index.php index 1f999da0e..6b5d55385 100644 --- a/application/views/logbookadvanced/index.php +++ b/application/views/logbookadvanced/index.php @@ -74,6 +74,10 @@ let lang_gen_advanced_logbook_dupe_search = ''; let lang_gen_advanced_logbook_search = ''; + let lang_gen_advanced_logbook_show_more = ''; + let lang_gen_advanced_logbook_show_less = ''; + + let homegrid =''; '); + $('#checkGridsBtn').prop("disabled", false).removeClass("running"); $('#closeButton').prop('disabled', false); - let errorMsg = 'Error checking continent information'; - if (xhr.responseJSON && xhr.responseJSON.message) { - errorMsg += ': ' + xhr.responseJSON.message; - } - - BootstrapDialog.alert({ - title: 'Error', - message: errorMsg, - type: BootstrapDialog.TYPE_DANGER - }); + $('.result').html(error); } }); } @@ -2529,22 +2520,163 @@ function saveOptions() { $('#checkDxccBtn').prop("disabled", false).removeClass("running"); $('#closeButton').prop("disabled", false); $('.result').html(response); - rebind_checkbox_trigger_dxcc(); + $('#dxccCheckTable').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()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + rebind_checkbox_trigger_dxcc(); + }, + }); }, error: function(xhr, status, error) { - $('#checkDxccBtn').prop('disabled', false).text(''); + $('#checkDxccBtn').prop("disabled", false).removeClass("running"); $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } - let errorMsg = 'Error checking DXCC information'; - if (xhr.responseJSON && xhr.responseJSON.message) { - errorMsg += ': ' + xhr.responseJSON.message; - } + function checkIncorrectCqZones() { + $('#checkIncorrectCqZonesBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); - BootstrapDialog.alert({ - title: 'Error', - message: errorMsg, - type: BootstrapDialog.TYPE_DANGER + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectcqzones' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectCqZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#incorrectcqzonetable').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()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + rebind_checkbox_trigger_cq_zone(); + }, }); + }, + error: function(xhr, status, error) { + $('#checkIncorrectCqZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } + + function checkIncorrectItuZones() { + $('#checkIncorrectItuZonesBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectituzones' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectItuZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#incorrectituzonetable').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()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + rebind_checkbox_trigger_itu_zone(); + }, + }); + + }, + error: function(xhr, status, error) { + $('#checkIncorrectItuZonesBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); } }); } @@ -2553,27 +2685,54 @@ function saveOptions() { $('#checkBoxAllDxcc').change(function (event) { if (this.checked) { $('#dxccCheckTable tbody tr').each(function (i) { - selectQsoIDDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, '')); + selectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'dxccCheckTable'); }); } else { $('#dxccCheckTable tbody tr').each(function (i) { - unselectQsoIDDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, '')); + unselectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'dxccCheckTable'); }); } }); } - function selectQsoIDDxcc(qsoID) { - var element = $("#qsoID-" + qsoID); - element.find("input[type=checkbox]").prop("checked", true); + function selectQsoIdDxcc(qsoID, tablename) { + var element = $("#" + tablename + " tbody tr#qsoID-" + qsoID); + element.find(".row-check").prop("checked", true); element.addClass('activeRow'); } - function unselectQsoIDDxcc(qsoID) { - var element = $("#qsoID-" + qsoID); - element.find("input[type=checkbox]").prop("checked", false); + function unselectQsoIdDxcc(qsoID, tablename) { + var element = $("#" + tablename + " tbody tr#qsoID-" + qsoID); + element.find(".row-check").prop("checked", false); element.removeClass('activeRow'); - $('#checkBoxAllDxcc').prop("checked", false); + } + + function rebind_checkbox_trigger_cq_zone() { + $('#checkBoxAllCqZones').change(function (event) { + if (this.checked) { + $('#incorrectcqzonetable tbody tr').each(function (i) { + selectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'incorrectcqzonetable'); + }); + } else { + $('#incorrectcqzonetable tbody tr').each(function (i) { + unselectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'incorrectcqzonetable'); + }); + } + }); + } + + function rebind_checkbox_trigger_itu_zone() { + $('#checkBoxAllItuZones').change(function (event) { + if (this.checked) { + $('#incorrectituzonetable tbody tr').each(function (i) { + selectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'incorrectituzonetable'); + }); + } else { + $('#incorrectituzonetable tbody tr').each(function (i) { + unselectQsoIdDxcc($(this).first().closest('tr').attr('id')?.replace(/\D/g, ''), 'incorrectituzonetable'); + }); + } + }); } function fixDxccSelected() { @@ -2619,3 +2778,164 @@ function saveOptions() { } }); } + + function checkIncorrectGridsquares() { + $('#checkIncorrectGridsquaresBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/checkDb', + data: { + type: 'checkincorrectgridsquares' + }, + type: 'POST', + success: function(response) { + $('#checkIncorrectGridsquaresBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(response); + $('#gridsquareCheckTable').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()); + + column.search(val ? '^' + val + '$' : '', true, false).draw(); + }); + + column + .data() + .unique() + .sort() + .each(function (d, j) { + select.append(''); + }); + }); + }, + }); + }, + error: function(xhr, status, error) { + $('#checkIncorrectGridsquaresBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop('disabled', false); + $('.result').html(error); + } + }); + } + + function toggleGridsquare(id) { + const shortSpan = document.getElementById(id + '-short'); + const fullSpan = document.getElementById(id + '-full'); + const link = document.getElementById(id + '-link'); + + if (shortSpan.style.display === 'none') { + shortSpan.style.display = 'inline'; + fullSpan.style.display = 'none'; + link.textContent = lang_gen_advanced_logbook_show_more; + } else { + shortSpan.style.display = 'none'; + fullSpan.style.display = 'inline'; + link.textContent = lang_gen_advanced_logbook_show_less; + } + } + + function fixCqZoneSelected() { + let id_list = []; + $('#incorrectcqzonetable tbody input:checked').each(function () { + let id = $(this).closest('tr').attr('id')?.replace(/\D/g, ''); + id_list.push(id); + }); + + if (id_list.length === 0) { + BootstrapDialog.alert({ + title: lang_gen_advanced_logbook_info, + message: lang_gen_advanced_logbook_select_at_least_one_row, + type: BootstrapDialog.TYPE_INFO, + closable: false, + draggable: false, + callback: function (result) { + } + }); + return; + } + + $('#fixSelectedCqZoneBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/fixCqZones', + type: 'post', + data: {'ids': JSON.stringify(id_list, null, 2)}, + success: function(data) { + $('#fixSelectedCqZoneBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + id_list.forEach(function(id) { + let row = $("#incorrectcqzonetable tbody tr#qsoID-" + id); + row.remove(); + }); + $('.dxcctablediv').html(data.message); + }, + error: function(xhr, status, error) { + $('#fixSelectedCqZoneBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(error); + } + }); + } + + function fixItuZoneSelected() { + let id_list = []; + $('#incorrectituzonetable tbody input:checked').each(function () { + let id = $(this).closest('tr').attr('id')?.replace(/\D/g, ''); + id_list.push(id); + }); + + if (id_list.length === 0) { + BootstrapDialog.alert({ + title: lang_gen_advanced_logbook_info, + message: lang_gen_advanced_logbook_select_at_least_one_row, + type: BootstrapDialog.TYPE_INFO, + closable: false, + draggable: false, + callback: function (result) { + } + }); + return; + } + + $('#fixSelectedItuZoneBtn').prop("disabled", true).addClass("running"); + $('#closeButton').prop("disabled", true); + + $.ajax({ + url: base_url + 'index.php/logbookadvanced/fixItuZones', + type: 'post', + data: {'ids': JSON.stringify(id_list, null, 2)}, + success: function(data) { + $('#fixSelectedItuZoneBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + id_list.forEach(function(id) { + let row = $("#incorrectituzonetable tbody tr#qsoID-" + id); + row.remove(); + }); + $('.dxcctablediv').html(data.message); + }, + error: function(xhr, status, error) { + $('#fixSelectedItuZoneBtn').prop("disabled", false).removeClass("running"); + $('#closeButton').prop("disabled", false); + $('.result').html(error); + } + }); + }