From 70a80e3db50604ff8b0efd010d156bef3d719dda Mon Sep 17 00:00:00 2001 From: Miguel Jacq <mig@mig5.net> Date: Wed, 14 Feb 2018 16:56:03 +1100 Subject: [PATCH 1/3] Make table sortable with javascript (if enabled) --- onionshare/web.py | 2 +- share/html/index.html | 74 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/onionshare/web.py b/onionshare/web.py index 7d1b72e8..0fedb29b 100644 --- a/onionshare/web.py +++ b/onionshare/web.py @@ -59,7 +59,7 @@ zip_filename = None zip_filesize = None security_headers = [ - ('Content-Security-Policy', 'default-src \'self\'; style-src \'unsafe-inline\'; img-src \'self\' data:;'), + ('Content-Security-Policy', 'default-src \'self\'; style-src \'unsafe-inline\'; script-src \'unsafe-inline\'; img-src \'self\' data:;'), ('X-Frame-Options', 'DENY'), ('X-Xss-Protection', '1; mode=block'), ('X-Content-Type-Options', 'nosniff'), diff --git a/share/html/index.html b/share/html/index.html index b274d003..d5d36055 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -109,10 +109,10 @@ <h1>OnionShare</h1> </header> - <table class="file-list"> + <table class="file-list" id="file-list"> <tr> - <th>Filename</th> - <th>Size</th> + <th onclick="sortTable(0)">Filename</th> + <th onclick="sortTable(1)">Size</th> <th></th> </tr> {% for info in file_info.dirs %} @@ -136,5 +136,73 @@ </tr> {% endfor %} </table> + <script> + // Function to convert human-readable sizes back to bytes, for sorting + function unhumanize(text) { + var powers = {'k': 1, 'm': 2, 'g': 3, 't': 4}; + var regex = /(\d+(?:\.\d+)?)\s?(B|K|M|G|T)?/i; + var res = regex.exec(text); + if(res[2] === undefined) { + // Account for alphabetical words (file/dir names) + return text; + } else { + return res[1] * Math.pow(1024, powers[res[2].toLowerCase()]); + } + } + function sortTable(n) { + var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; + table = document.getElementById("file-list"); + switching = true; + // Set the sorting direction to ascending: + dir = "asc"; + /* Make a loop that will continue until + no switching has been done: */ + while (switching) { + // Start by saying: no switching is done: + switching = false; + rows = table.getElementsByTagName("TR"); + /* Loop through all table rows (except the + first, which contains table headers): */ + for (i = 1; i < (rows.length - 1); i++) { + // Start by saying there should be no switching: + shouldSwitch = false; + /* Get the two elements you want to compare, + one from current row and one from the next: */ + x = rows[i].getElementsByTagName("TD")[n]; + y = rows[i + 1].getElementsByTagName("TD")[n]; + /* Check if the two rows should switch place, + based on the direction, asc or desc: */ + if (dir == "asc") { + if (unhumanize(x.innerHTML.toLowerCase()) > unhumanize(y.innerHTML.toLowerCase())) { + // If so, mark as a switch and break the loop: + shouldSwitch= true; + break; + } + } else if (dir == "desc") { + if (unhumanize(x.innerHTML.toLowerCase()) < unhumanize(y.innerHTML.toLowerCase())) { + // If so, mark as a switch and break the loop: + shouldSwitch= true; + break; + } + } + } + if (shouldSwitch) { + /* If a switch has been marked, make the switch + and mark that a switch has been done: */ + rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); + switching = true; + // Each time a switch is done, increase this count by 1: + switchcount ++; + } else { + /* If no switching has been done AND the direction is "asc", + set the direction to "desc" and run the while loop again. */ + if (switchcount == 0 && dir == "asc") { + dir = "desc"; + switching = true; + } + } + } + } + </script> </body> </html> From 39c719dee6ac1b703a9ee272518c8c5f5808dbe0 Mon Sep 17 00:00:00 2001 From: Miguel Jacq <mig@mig5.net> Date: Wed, 14 Feb 2018 17:04:08 +1100 Subject: [PATCH 2/3] Fix indentation --- share/html/index.html | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/share/html/index.html b/share/html/index.html index d5d36055..f3fe8247 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -182,27 +182,27 @@ if (unhumanize(x.innerHTML.toLowerCase()) < unhumanize(y.innerHTML.toLowerCase())) { // If so, mark as a switch and break the loop: shouldSwitch= true; - break; + break; + } + } + } + if (shouldSwitch) { + /* If a switch has been marked, make the switch + and mark that a switch has been done: */ + rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); + switching = true; + // Each time a switch is done, increase this count by 1: + switchcount ++; + } else { + /* If no switching has been done AND the direction is "asc", + set the direction to "desc" and run the while loop again. */ + if (switchcount == 0 && dir == "asc") { + dir = "desc"; + switching = true; } } } - if (shouldSwitch) { - /* If a switch has been marked, make the switch - and mark that a switch has been done: */ - rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); - switching = true; - // Each time a switch is done, increase this count by 1: - switchcount ++; - } else { - /* If no switching has been done AND the direction is "asc", - set the direction to "desc" and run the while loop again. */ - if (switchcount == 0 && dir == "asc") { - dir = "desc"; - switching = true; - } - } } - } - </script> + </script> </body> </html> From 4838e59daaeafaf380cc10ad2c3dd3d038ce3261 Mon Sep 17 00:00:00 2001 From: Miguel Jacq <mig@mig5.net> Date: Wed, 14 Feb 2018 17:20:00 +1100 Subject: [PATCH 3/3] Account for files that are in bytes --- share/html/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/html/index.html b/share/html/index.html index f3fe8247..57711e02 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -139,7 +139,7 @@ <script> // Function to convert human-readable sizes back to bytes, for sorting function unhumanize(text) { - var powers = {'k': 1, 'm': 2, 'g': 3, 't': 4}; + var powers = {'b': 0, 'k': 1, 'm': 2, 'g': 3, 't': 4}; var regex = /(\d+(?:\.\d+)?)\s?(B|K|M|G|T)?/i; var res = regex.exec(text); if(res[2] === undefined) {