diff --git a/dojo/templates/dojo/finding_groups_list_snippet.html b/dojo/templates/dojo/finding_groups_list_snippet.html index e8c344d86f9..f6c085c93b8 100644 --- a/dojo/templates/dojo/finding_groups_list_snippet.html +++ b/dojo/templates/dojo/finding_groups_list_snippet.html @@ -172,6 +172,14 @@

}; $(document).ready(function() { + // Disable DataTables' client-side ordering on columns that sort server-side via dojo_sort + // (?o=), so a header click does ONE sort (server reload) instead of an instant client + // re-sort that "flashes" before the reload. (upstream issue #1811) + var serverSortDataKeys = new Set(['name', 'findings_count', 'creator', 'sla_deadline']); + var serverSortTargets = []; + for (var i = 0; i < datatables_columns.length; i++) { + if (serverSortDataKeys.has(datatables_columns[i]["data"])) { serverSortTargets.push(i); } + } $('#open_finding_groups').DataTable({ drawCallback: function(){ $('#open_finding_groups .has-popover').hover( @@ -183,6 +191,10 @@

columns: datatables_columns, order: [], columnDefs: [ + { + orderable: false, + targets: serverSortTargets + }, { targets: 'severity-sort', orderDataType: 'severity-asc' diff --git a/dojo/templates/dojo/product.html b/dojo/templates/dojo/product.html index a95ecd81078..203302d6c70 100644 --- a/dojo/templates/dojo/product.html +++ b/dojo/templates/dojo/product.html @@ -343,9 +343,12 @@

}, colReorder: true, autoWidth: false, + // Columns whose headers render server-side sort links (dojo_sort -> ?o=) must NOT + // also be client-sortable by DataTables, or a header click triggers an instant client + // re-sort that "flashes" right before the server reload redraws. (upstream issue #1811) "columns": [ { "data": "action", "searchable": false }, - { "data": "product" }, + { "data": "product", "orderable": false }, { "data": "tags" }, { "data": "criticality" , render: function (data, type, row) { const criticals = { @@ -381,10 +384,10 @@

return type === 'export' ? getDojoExportValueFromTag(data, 'i', 'data-content') : data; }}, {% endif %} - { "data": "findings" }, + { "data": "findings", "orderable": false }, { "data": "locations" }, { "data": "contacts" }, - { "data": "product_type" }, + { "data": "product_type", "orderable": false }, ], order: [], columnDefs: [ diff --git a/dojo/templates_classic/dojo/finding_groups_list_snippet.html b/dojo/templates_classic/dojo/finding_groups_list_snippet.html index 87940c2f39e..290445143b1 100644 --- a/dojo/templates_classic/dojo/finding_groups_list_snippet.html +++ b/dojo/templates_classic/dojo/finding_groups_list_snippet.html @@ -172,6 +172,14 @@

}; $(document).ready(function() { + // Disable DataTables' client-side ordering on columns that sort server-side via dojo_sort + // (?o=), so a header click does ONE sort (server reload) instead of an instant client + // re-sort that "flashes" before the reload. (upstream issue #1811) + var serverSortDataKeys = new Set(['name', 'findings_count', 'creator', 'sla_deadline']); + var serverSortTargets = []; + for (var i = 0; i < datatables_columns.length; i++) { + if (serverSortDataKeys.has(datatables_columns[i]["data"])) { serverSortTargets.push(i); } + } $('#open_finding_groups').DataTable({ drawCallback: function(){ $('#open_finding_groups .has-popover').hover( @@ -183,6 +191,10 @@

columns: datatables_columns, order: [], columnDefs: [ + { + orderable: false, + targets: serverSortTargets + }, { targets: 'severity-sort', orderDataType: 'severity-asc' diff --git a/dojo/templates_classic/dojo/product.html b/dojo/templates_classic/dojo/product.html index cb06252f614..95fa0c30cce 100644 --- a/dojo/templates_classic/dojo/product.html +++ b/dojo/templates_classic/dojo/product.html @@ -343,9 +343,12 @@

}, colReorder: true, autoWidth: false, + // Columns whose headers render server-side sort links (dojo_sort -> ?o=) must NOT + // also be client-sortable by DataTables, or a header click triggers an instant client + // re-sort that "flashes" right before the server reload redraws. (upstream issue #1811) "columns": [ { "data": "action", "searchable": false }, - { "data": "product" }, + { "data": "product", "orderable": false }, { "data": "tags" }, { "data": "criticality" , render: function (data, type, row) { const criticals = { @@ -381,10 +384,10 @@

return type === 'export' ? getDojoExportValueFromTag(data, 'i', 'data-content') : data; }}, {% endif %} - { "data": "findings" }, + { "data": "findings", "orderable": false }, { "data": "locations" }, { "data": "contacts" }, - { "data": "product_type" }, + { "data": "product_type", "orderable": false }, ], order: [], columnDefs: [