diff --git a/ui/contest.html b/ui/contest.html
index f5827b7..184d9af 100644
--- a/ui/contest.html
+++ b/ui/contest.html
@@ -114,7 +114,7 @@
Test |
Result |
Retry |
- Time |
+ Time |
Links |
diff --git a/ui/contest.js b/ui/contest.js
index e06a692..d957230 100644
--- a/ui/contest.js
+++ b/ui/contest.js
@@ -10,6 +10,33 @@ function colorify_str(value)
return ret + value + '';
}
+function sort_results(rows)
+{
+ for (const sort_key of nipa_sort_keys) {
+ let sort_ord = nipa_sort_get(sort_key);
+
+ if (sort_key === "date") {
+ rows.sort(function(a, b) {
+ return sort_ord * (b.v.end - a.v.end);
+ });
+ } else if (sort_key === "time") {
+ rows.sort(function(a, b) {
+ if (a.r[sort_key] === undefined && b.r[sort_key] === undefined)
+ return 0;
+ if (a.r[sort_key] === undefined)
+ return 1;
+ if (b.r[sort_key] === undefined)
+ return -1;
+ return sort_ord * (b.r[sort_key] - a.r[sort_key]);
+ });
+ } else {
+ rows.sort(function(a, b) {
+ return sort_ord * (b.r[sort_key] < a.r[sort_key] ? 1 : -1);
+ });
+ }
+ }
+}
+
function load_result_table(data_raw)
{
var table = document.getElementById("results");
@@ -69,17 +96,13 @@ function load_result_table(data_raw)
});
});
- let sort_time = nipa_sort_get('time');
- if (sort_time)
- rows.sort(function(a, b) {
- if (a.r.time === undefined && b.r.time === undefined)
- return 0;
- if (a.r.time === undefined)
- return 1;
- if (b.r.time === undefined)
- return -1;
- return sort_time * (b.r.time - a.r.time);
- });
+ // Trim the time, so that sort behavior matches what user sees
+ for (const result of rows) {
+ if (result.r.time)
+ result.r.time = Math.round(result.r.time);
+ }
+
+ sort_results(rows);
for (const result of rows) {
const r = result.r;
@@ -110,7 +133,7 @@ function load_result_table(data_raw)
if ("retry" in r)
retry.innerHTML = colorify_str(r.retry);
if ("time" in r)
- time.innerHTML = nipa_msec_to_str(Math.round(r.time) * 1000);
+ time.innerHTML = nipa_msec_to_str(r.time * 1000);
res.innerHTML = colorify_str(r.result);
outputs.innerHTML = "outputs";
hist.innerHTML = "history";
@@ -172,6 +195,10 @@ function loaded_one()
if (--xfr_todo)
return;
+ let headers = document.getElementsByTagName("th");
+ for (const th of headers) {
+ th.addEventListener("click", nipa_sort_key_set);
+ }
reload_select_filters(true);
nipa_filters_enable(reload_data, "ld-pw");
nipa_filters_enable(results_update, "fl-pw");
diff --git a/ui/nipa.css b/ui/nipa.css
index 81eea5e..5033da3 100644
--- a/ui/nipa.css
+++ b/ui/nipa.css
@@ -27,6 +27,10 @@ tr:nth-child(even) {
font-style: italic;
}
+.column-sorted {
+ background-color: #d0d0d0;
+}
+
.box-pass { background-color: green; }
.box-skip { background-color: royalblue; }
.box-flake { background-color: red; }
@@ -92,4 +96,7 @@ tr:nth-child(even) {
.end-row td {
border-color: #202020;
}
+ .column-sorted {
+ background-color: #484848;
+ }
}
diff --git a/ui/nipa.js b/ui/nipa.js
index 9a89b53..6ec15e4 100644
--- a/ui/nipa.js
+++ b/ui/nipa.js
@@ -171,27 +171,46 @@ var nipa_sort_cb = null;
let nipa_sort_keys = [];
let nipa_sort_polarity = [];
-function nipa_sort_key_set(what)
+function nipa_sort_key_set(event)
{
+ let elem = event.target;
+ let what = elem.innerText.toLowerCase().replace(/[^a-z0-9]/g, '');
const index = nipa_sort_keys.indexOf(what);
let polarity = 1;
if (index != -1) {
- polarity = -1 * nipa_sort_polarity[index];
+ polarity = nipa_sort_polarity[index];
+
+ // if it's the main sort key invert direction, otherwise we're changing
+ // order of keys but not their direction
+ let main_key = index == nipa_sort_keys.length - 1;
+ if (main_key)
+ polarity *= -1;
+
// delete it
nipa_sort_keys.splice(index, 1);
nipa_sort_polarity.splice(index, 1);
+ elem.innerText = elem.innerText.slice(0, -2);
// We flipped back to normal polarity, that's a reset
- if (polarity == 1) {
+ if (main_key && polarity == 1) {
+ elem.classList.remove('column-sorted');
nipa_sort_cb();
return;
}
+ } else {
+ elem.classList.add('column-sorted');
+ }
+
+ if (polarity == 1) {
+ elem.innerHTML = elem.innerText + " ⯆";
+ } else {
+ elem.innerHTML = elem.innerText + " ⯅";
}
// add it
- nipa_sort_keys.unshift(what);
- nipa_sort_polarity.unshift(polarity);
+ nipa_sort_keys.push(what);
+ nipa_sort_polarity.push(polarity);
nipa_sort_cb();
}