diff --git a/assets/js/sections/logbookadvanced.js b/assets/js/sections/logbookadvanced.js
index 7df8f2eaf..d9c81742e 100644
--- a/assets/js/sections/logbookadvanced.js
+++ b/assets/js/sections/logbookadvanced.js
@@ -174,146 +174,35 @@ function updateRow(qso) {
function loadQSOTable(rows) {
const $table = $('#qsoList');
- if (!$table.length) return;
- // Safety destroy if an old instance exists
- if ($.fn.dataTable && $.fn.dataTable.isDataTable($table)) {
- try {
- const old = $table.DataTable();
- if (typeof old.scroller === 'function') {
- try { old.scroller().destroy(); } catch (e) {}
- }
- try { old.off(); old.clear(); old.destroy(); } catch (e) {}
- } catch (e) {}
- $table.find('tbody').empty();
- $table.removeClass('dataTable'); // remove leftover class
+ // Prevent initializing if already a DataTable
+ if ($.fn.DataTable.isDataTable($table)) {
+ $table.DataTable().clear().destroy();
}
const langUrl = getDataTablesLanguageUrl();
const initTable = function(language) {
- // make sure moment plugin (if used) is set
- if ($.fn.dataTable && $.fn.dataTable.moment) {
- $.fn.dataTable.moment(custom_date_format + ' HH:mm');
- }
+ $.fn.dataTable.moment(custom_date_format + ' HH:mm');
- // Build the full data array (array-of-arrays). Keep metadata properties on the array.
- const allData = [];
- for (let i = 0; i < rows.length; i++) {
- const qso = rows[i];
- const data = [];
-
- data.push('
');
-
- if ((user_options.datetime.show ?? 'true') == "true") {
- data.push(qso.datetime === '' ? 'Missing date' : qso.qsoDateTime);
- }
- if ((user_options.de.show ?? 'true') == "true") {
- data.push(qso.de.replaceAll('0', 'Ø'));
- }
- if ((user_options.dx.show ?? 'true') == "true") {
- if (qso.dx === '') {
- data.push('Missing callsign');
- } else {
- let dxHtml = '' + qso.dx.replaceAll('0', 'Ø') + '';
- if (qso.callsign != '') {
- dxHtml += ' L';
- }
- dxHtml += '
' +
- '
' +
- '
' +
- '';
- data.push(dxHtml);
- }
- }
-
- // The rest of the user_options fields (kept exactly like your original)
- if ((user_options.mode.show ?? 'true') == "true") data.push(qso.mode === '' ? 'Missing mode' : qso.mode);
- if ((user_options.rsts.show ?? 'true') == "true") data.push(qso.rstS);
- if ((user_options.rstr.show ?? 'true') == "true") data.push(qso.rstR);
- if ((user_options.band.show ?? 'true') == "true") data.push(qso.band === '' ? 'Missing band' : qso.band);
- if ((user_options.frequency.show ?? 'true') == "true") data.push(qso.frequency);
- if ((user_options.gridsquare.show ?? 'true') == "true") data.push(qso.gridsquare);
- if ((user_options.name.show ?? 'true') == "true") data.push(qso.name);
- if ((user_options.qth.show ?? 'true') == "true") data.push(qso.qth);
- if ((user_options.qslvia.show ?? 'true') == "true") data.push(qso.qslVia);
- if ((user_options.clublog.show ?? 'true') == "true") data.push(qso.clublog);
- if ((user_options.qsl.show ?? 'true') == "true") data.push(qso.qsl);
- if ($(".eqslconfirmation")[0] && (user_options.eqsl.show ?? 'true') == "true") data.push(qso.eqsl);
- if ($(".lotwconfirmation")[0] && (user_options.lotw.show ?? 'true') == "true") data.push(qso.lotw);
- if ((user_options.qrz.show ?? 'true') == "true") data.push(qso.qrz);
- if ((user_options.dcl.show ?? 'true') == "true") data.push(qso.dcl);
- if ((user_options.qslmsgs.show ?? 'true') == "true") data.push(qso.qslMessage);
- if ((user_options.qslmsgr.show ?? 'true') == "true") data.push(qso.qslMessageR);
- if ((user_options.dxcc.show ?? 'true') == "true") data.push(qso.dxcc + qso.flag + (qso.end == null ? '' : ' Deleted DXCC'));
- if ((user_options.state.show ?? 'true') == "true") data.push(qso.state);
- if ((user_options.county.show ?? 'true') == "true") data.push(qso.county);
- if ((user_options.cqzone.show ?? 'true') == "true") data.push(qso.cqzone);
- if ((user_options.ituzone.show ?? 'true') == "true") data.push(qso.ituzone);
- if ((user_options.iota.show ?? 'true') == "true") data.push(qso.iota);
- if ((user_options.pota.show ?? 'true') == "true") data.push(qso.pota);
- if ((user_options.sota.show ?? 'true') == "true") data.push(qso.sota);
- if ((user_options.dok.show ?? 'true') == "true") data.push(qso.dok);
- if ((user_options.wwff.show ?? 'true') == "true") data.push(qso.wwff);
- if ((user_options.sig.show ?? 'true') == "true") data.push(qso.sig);
- if ((user_options.region.show ?? 'true') == "true") data.push(qso.region);
- if ((user_options.operator.show ?? 'true') == "true") data.push(qso.operator);
- if ((user_options.comment.show ?? 'true') == "true") data.push(qso.comment);
- if ((user_options.propagation.show ?? 'true') == "true") data.push(qso.propagation);
- if ((user_options.contest.show ?? 'true') == "true") data.push(qso.contest);
- if ((user_options.myrefs.show ?? 'true') == "true") data.push(qso.deRefs);
- if ((user_options.continent.show ?? 'true') == "true") data.push(qso.continent);
- if ((user_options.distance.show ?? 'true') == "true") data.push(qso.distance);
- if ((user_options.antennaazimuth.show ?? 'true') == "true") data.push(qso.antennaazimuth);
- if ((user_options.antennaelevation.show ?? 'true') == "true") data.push(qso.antennaelevation);
- if ((user_options.profilename.show ?? 'true') == "true") data.push(qso.profilename);
- if ((user_options.stationpower.show ?? 'true') == "true") data.push(qso.stationpower);
-
- // metadata accessible inside createdRow
- data.id = 'qsoID-' + qso.qsoID;
- data._qsoID = qso.qsoID;
-
- allData.push(data);
- }
-
- // cache header index lookups (avoid repeated DOM queries)
- const distanceIdx = $(".distance-column-sort").index();
- const azIdx = $(".antennaazimuth-column-sort").index();
- const elIdx = $(".antennaelevation-column-sort").index();
- const powerIdx = $(".stationpower-column-sort").index();
-
- // DataTables init (data provided up-front)
const table = $table.DataTable({
- data: allData,
- deferRender: true,
+ searching: true,
+ responsive: false,
+ ordering: true,
scrollY: window.innerHeight - $('#searchForm').innerHeight() - 250,
scrollCollapse: true,
- paging: true, // required for Scroller
- scroller: true,
- displayStart: 0,
language: language,
ordering: true,
- orderClasses: false,
- responsive: false,
- createdRow: function(row, data) {
- if (data && data.id) $(row).attr('id', data.id);
- if (data && data._qsoID) $(row).data('qsoID', data._qsoID);
- },
- // robust info text so "259 to 250" can't appear
- infoCallback: function(settings) {
- const api = new $.fn.dataTable.Api(settings);
- const info = api.page.info();
- if (info.recordsDisplay === 0) return 'Showing 0 to 0 of 0 entries';
- const dispStart = info.start + 1;
- const dispEnd = Math.min(info.recordsDisplay, info.start + info.length);
- return 'Showing ' + dispStart + ' to ' + dispEnd + ' of ' + info.recordsDisplay + ' entries';
+ paging: false,
+ createdRow: function (row, data, dataIndex) {
+ $(row).attr('id', data.id);
},
columnDefs: [
{ orderable: false, targets: 0 },
- { targets: distanceIdx, type: "numbersort" },
- { targets: azIdx, type: "numbersort" },
- { targets: elIdx, type: "numbersort" },
- { targets: powerIdx, type: "numbersort" },
+ { targets: $(".distance-column-sort").index(), type: "numbersort" },
+ { targets: $(".antennaazimuth-column-sort").index(), type: "numbersort" },
+ { targets: $(".antennaelevation-column-sort").index(), type: "numbersort" },
+ { targets: $(".stationpower-column-sort").index(), type: "numbersort" },
],
dom: 'Bfrtip',
buttons: [
@@ -358,86 +247,6 @@ function loadQSOTable(rows) {
]
});
- // Ensure scroller measured and page reset
- try { if (table.scroller) table.scroller().measure(); } catch (e) {}
- try { table.page('first').draw(false); } catch (e) { table.draw(false); }
-
- // Delegate tooltip creation (create on demand)
- $table.off('mouseenter', '[data-bs-toggle="tooltip"]').on('mouseenter', '[data-bs-toggle="tooltip"]', function () {
- if (!$(this).data('bs.tooltip')) {
- $(this).tooltip();
- }
- });
-
- // Delegate checkbox handling (shift-click selection) — no per-row listeners
- let lastChecked = null;
- $table.off('click', '.row-check').on('click', '.row-check', function (e) {
- const checkboxes = $table.find('.row-check').toArray();
- if (e.shiftKey && lastChecked) {
- let start = checkboxes.indexOf(this);
- let end = checkboxes.indexOf(lastChecked);
- [start, end] = [Math.min(start, end), Math.max(start, end)];
- for (let i = start; i <= end; i++) {
- checkboxes[i].checked = lastChecked.checked;
- $(checkboxes[i]).closest('tr').toggleClass('activeRow', lastChecked.checked);
- }
- } else {
- $(this).closest('tr').toggleClass('activeRow', this.checked);
- }
- lastChecked = this;
- });
-
- // rebind other UI bits after table init (if function exists)
- if (typeof rebind_checkbox_trigger === 'function') rebind_checkbox_trigger();
- };
-
- // load language then init
- if (langUrl) {
- $.getJSON(langUrl)
- .done(function(language) { initTable(language); })
- .fail(function() { console.error("Failed to load DataTables language file at " + langUrl); initTable({}); });
- } else {
- initTable({});
- }
-}
-
-
-function loadQSOTable2(rows) {
- const $table = $('#qsoList');
-
- // Prevent initializing if already a DataTable
- if ($.fn.DataTable.isDataTable($table)) {
- $table.DataTable().clear().destroy();
- }
-
- const langUrl = getDataTablesLanguageUrl();
-
- const initTable = function(language) {
- $.fn.dataTable.moment(custom_date_format + ' HH:mm');
-
- const table = $table.DataTable({
- searching: false,
- responsive: false,
- ordering: true,
- scrollY: window.innerHeight - $('#searchForm').innerHeight() - 250,
- scrollCollapse: true,
- language: language,
- deferRender: true, // delay DOM creation until needed
- ordering: true,
- paging: true,
- scroller: true,
- createdRow: function (row, data, dataIndex) {
- $(row).attr('id', data.id);
- },
- columnDefs: [
- { orderable: false, targets: 0 },
- { targets: $(".distance-column-sort").index(), type: "numbersort" },
- { targets: $(".antennaazimuth-column-sort").index(), type: "numbersort" },
- { targets: $(".antennaelevation-column-sort").index(), type: "numbersort" },
- { targets: $(".stationpower-column-sort").index(), type: "numbersort" },
- ]
- });
-
for (i = 0; i < rows.length; i++) {
let qso = rows[i];