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: [