From f874d7754f823fc65971bf8218ca5ab3d0a8560a Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 2 Aug 2022 20:47:17 +0200 Subject: [PATCH] ui: toggle sorting folders before files (default-on) --- copyparty/web/browser.js | 30 ++++++++++++++++++++---------- copyparty/web/util.js | 11 +++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index c8e20a65..3da62527 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -106,6 +106,7 @@ var Ls = { "ct_thumb": "in icon view, toggle icons or thumbnails$NHotkey: T", "ct_dots": "show hidden files (if server permits)", + "ct_dir1st": "sort folders before files", "ct_readme": "show README.md in folder listings", "cut_turbo": "the yolo button, you probably DO NOT want to enable this:$N$Nuse this if you were uploading a huge amount of files and had to restart for some reason, and want to continue the upload ASAP$N$Nthis replaces the hash-check with a simple "does this have the same filesize on the server?" so if the file contents are different it will NOT be uploaded$N$Nyou should turn this off when the upload is done, and then "upload" the same files again to let the client verify them", @@ -439,6 +440,7 @@ var Ls = { "ct_thumb": "vis miniatyrbilder istedenfor ikoner$NSnarvei: T", "ct_dots": "vis skjulte filer (gitt at serveren tillater det)", + "ct_dir1st": "sorter slik at mapper kommer foran filer", "ct_readme": "vis README.md nedenfor filene", "cut_turbo": "forenklet befaring ved opplastning; bør sannsynlig ikke skrus på:$N$Nnyttig dersom du var midt i en svær opplastning som måtte restartes av en eller annen grunn, og du vil komme igang igjen så raskt som overhodet mulig.$N$Nnår denne er skrudd på så forenkles befaringen kraftig; istedenfor å utføre en trygg sjekk på om filene finnes på serveren i god stand, så sjekkes kun om filstørrelsen stemmer. Så dersom en korrupt fil skulle befinne seg på serveren allerede, på samme sted med samme størrelse og navn, så blir det ikke oppdaget.$N$Ndet anbefales å kun benytte denne funksjonen for å komme seg raskt igjennom selve opplastningen, for så å skru den av, og til slutt "laste opp" de samme filene én gang til -- slik at integriteten kan verifiseres", @@ -822,6 +824,7 @@ ebi('op_cfg').innerHTML = ( ' 田 the grid\n' + ' 🖼️ thumbs\n' + ' dotfiles\n' + + ' ↑ dirs\n' + ' 📜 readme\n' + ' \n' + '\n' + @@ -2479,7 +2482,8 @@ function sortfiles(nodes) { if (!nodes.length) return nodes; - var sopts = jread('fsort', [["href", 1, ""]]); + var sopts = jread('fsort', [["href", 1, ""]]), + dir1st = sread('dir1st') !== '0'; try { var is_srch = false; @@ -2510,14 +2514,10 @@ function sortfiles(nodes) { if ((v + '').indexOf('')[1]; - else if (name == "href" && v) { - if (v.split('?')[0].slice(-1) == '/') - v = '\t' + v; - + else if (name == "href" && v) v = uricom_dec(v)[0]; - } - nodes[b]._sv = v; + nodes[b]._sv = v } } @@ -2546,6 +2546,13 @@ function sortfiles(nodes) { if (is_srch) delete nodes[b].ext; } + if (dir1st) { + var r1 = [], r2 = []; + for (var b = 0, bb = nodes.length; b < bb; b++) + (nodes[b].href.split('?')[0].slice(-1) == '/' ? r1 : r2).push(nodes[b]); + + nodes = r1.concat(r2); + } } catch (ex) { console.log("failed to apply sort config: " + ex); @@ -4439,6 +4446,9 @@ var treectl = (function () { bcfg_bind(r, 'dots', 'dotfiles', false, function (v) { r.goto(get_evpath()); }); + bcfg_bind(r, 'dir1st', 'dir1st', true, function (v) { + treectl.gentab(get_evpath(), treectl.lsc); + }); setwrap(bcfg_bind(r, 'wtree', 'wraptree', true, setwrap)); setwrap(bcfg_bind(r, 'parpane', 'parpane', true, onscroll)); bcfg_bind(r, 'htree', 'hovertree', false, reload_tree); @@ -4885,6 +4895,7 @@ var treectl = (function () { } r.gentab = function (top, res) { + r.lsc = res; var nodes = res.dirs.concat(res.files), html = mk_files_header(res.taglist), seen = {}; @@ -4897,7 +4908,6 @@ var treectl = (function () { bhref = tn.href.split('?')[0], fname = uricom_dec(bhref)[0], hname = esc(fname), - sortv = (bhref.slice(-1) == '/' ? '\t' : '') + hname, id = 'f-' + ('00000000' + crc32(fname)).slice(-8), lang = showfile.getlang(fname); @@ -4912,8 +4922,8 @@ var treectl = (function () { tn.lead = '-txt-'; - var ln = ['' + tn.lead + '' + hname + '', tn.sz]; + var ln = ['' + tn.lead + '' + hname + '', tn.sz]; for (var b = 0; b < res.taglist.length; b++) { var k = res.taglist[b], diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 40424783..c93da5dc 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -7,6 +7,7 @@ if (!window['console']) var wah = '', + HALFMAX = 8192 * 8192 * 8192 * 8192, is_touch = 'ontouchstart' in window, is_https = (window.location + '').indexOf('https:') === 0, IPHONE = is_touch && /iPhone|iPad|iPod/i.test(navigator.userAgent), @@ -459,6 +460,16 @@ function sortTable(table, col, cb) { } return reverse * (a.localeCompare(b)); }); + if (sread('dir1st') !== '0') { + var r1 = [], r2 = []; + for (var i = 0; i < tr.length; i++) { + var cell = tr[vl[i][1]].cells[1], + href = cell.getAttribute('sortv') || cell.textContent.trim(); + + (href.split('?')[0].slice(-1) == '/' ? r1 : r2).push(vl[i]); + } + vl = r1.concat(r2); + } for (i = 0; i < tr.length; ++i) tb.appendChild(tr[vl[i][1]]); if (cb) cb(); }