From fc0bf1953aa2f6b29af31e649f89eaecfa374273 Mon Sep 17 00:00:00 2001 From: Deomid Ryabkov <rojer@cesanta.com> Date: Thu, 7 Jul 2016 16:43:06 +0100 Subject: [PATCH] Fix and improve sorting on Mongoose index pages Remember sorting settings in url fragment, reverse order on repeated header click. PUBLISHED_FROM=faa033eddc86d0aafc12a86aea4145646ea2c89c --- mongoose.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mongoose.c b/mongoose.c index 1a3ab0aa2..c774fc5a7 100644 --- a/mongoose.c +++ b/mongoose.c @@ -5886,21 +5886,28 @@ static void mg_send_directory_listing(struct mg_connection *nc, const char *dir, struct http_message *hm, struct mg_serve_http_opts *opts) { static const char *sort_js_code = - "<script>function srt(tb, col) {" + "<script>function srt(tb, sc, so, d) {" "var tr = Array.prototype.slice.call(tb.rows, 0)," - "tr = tr.sort(function (a, b) { var c1 = a.cells[col], c2 = b.cells[col]," + "tr = tr.sort(function (a, b) { var c1 = a.cells[sc], c2 = b.cells[sc]," "n1 = c1.getAttribute('name'), n2 = c2.getAttribute('name'), " "t1 = a.cells[2].getAttribute('name'), " "t2 = b.cells[2].getAttribute('name'); " - "return t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : " + "return so * (t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : " "n1 ? parseInt(n2) - parseInt(n1) : " - "c1.textContent.trim().localeCompare(c2.textContent.trim()); });"; + "c1.textContent.trim().localeCompare(c2.textContent.trim())); });"; static const char *sort_js_code2 = - "for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]);}" - "window.onload = function() { " + "for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]); " + "if (!d) window.location.hash = ('sc=' + sc + '&so=' + so); " + "};" + "window.onload = function() {" "var tb = document.getElementById('tb');" - "document.onclick = function(ev){ " - "var c = ev.target.rel; if (c) srt(tb, c)}; srt(tb, 2); };</script>"; + "var m = /sc=([012]).so=(1|-1)/.exec(window.location.hash) || [0, 2, 1];" + "var sc = m[1], so = m[2]; document.onclick = function(ev) { " + "var c = ev.target.rel; if (c) {if (c == sc) so *= -1; srt(tb, c, so); " + "sc = c; ev.preventDefault();}};" + "srt(tb, sc, so, true);" + "}" + "</script>"; mg_send_response_line(nc, 200, opts->extra_headers); mg_printf(nc, "%s: %s\r\n%s: %s\r\n\r\n", "Transfer-Encoding", "chunked", @@ -5922,8 +5929,8 @@ static void mg_send_directory_listing(struct mg_connection *nc, const char *dir, (int) hm->uri.len, hm->uri.p); mg_scan_directory(nc, dir, opts, mg_print_dir_entry); mg_printf_http_chunk(nc, - "<tr><td colspan=3><hr></td></tr>\n" - "</tbody></table>\n" + "</tbody><tr><td colspan=3><hr></td></tr>\n" + "</table>\n" "<address>%s</address>\n" "</body></html>", mg_version_header); -- GitLab