add --localtime for ui; closes #312

This commit is contained in:
ed 2025-08-01 17:55:34 +00:00
parent d0d2f206a9
commit ad23b253dc
11 changed files with 53 additions and 10 deletions

View file

@ -1548,6 +1548,7 @@ def add_ui(ap, retry):
ap2 = ap.add_argument_group('ui options') ap2 = ap.add_argument_group('ui options')
ap2.add_argument("--grid", action="store_true", help="show grid/thumbnails by default (volflag=grid)") ap2.add_argument("--grid", action="store_true", help="show grid/thumbnails by default (volflag=grid)")
ap2.add_argument("--gsel", action="store_true", help="select files in grid by ctrl-click (volflag=gsel)") ap2.add_argument("--gsel", action="store_true", help="select files in grid by ctrl-click (volflag=gsel)")
ap2.add_argument("--localtime", action="store_true", help="default to local timezone instead of UTC")
ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor chi\033[0m") ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor chi\033[0m")
ap2.add_argument("--theme", metavar="NUM", type=int, default=0, help="default theme to use (0..7)") ap2.add_argument("--theme", metavar="NUM", type=int, default=0, help="default theme to use (0..7)")
ap2.add_argument("--themes", metavar="NUM", type=int, default=8, help="number of themes installed") ap2.add_argument("--themes", metavar="NUM", type=int, default=8, help="number of themes installed")

View file

@ -2775,6 +2775,7 @@ class AuthSrv(object):
"dth3x": vf["th3x"], "dth3x": vf["th3x"],
"dvol": self.args.au_vol, "dvol": self.args.au_vol,
"idxh": int(self.args.ih), "idxh": int(self.args.ih),
"dutc": not self.args.localtime,
"themes": self.args.themes, "themes": self.args.themes,
"turbolvl": self.args.turbo, "turbolvl": self.args.turbo,
"nosubtle": self.args.nosubtle, "nosubtle": self.args.nosubtle,

View file

@ -1026,6 +1026,8 @@ class SvcHub(object):
except: except:
raise Exception("invalid --mv-retry [%s]" % (self.args.mv_retry,)) raise Exception("invalid --mv-retry [%s]" % (self.args.mv_retry,))
al.js_utc = "false" if al.localtime else "true"
al.tcolor = al.tcolor.lstrip("#") al.tcolor = al.tcolor.lstrip("#")
if len(al.tcolor) == 3: # fc5 => ffcc55 if len(al.tcolor) == 3: # fc5 => ffcc55
al.tcolor = "".join([x * 2 for x in al.tcolor]) al.tcolor = "".join([x * 2 for x in al.tcolor])

View file

@ -230,6 +230,7 @@ var Ls = {
"ct_qdel": 'when deleting files, only ask for confirmation once">qdel', "ct_qdel": 'when deleting files, only ask for confirmation once">qdel',
"ct_dir1st": 'sort folders before files">📁 first', "ct_dir1st": 'sort folders before files">📁 first',
"ct_nsort": 'natural sort (for filenames with leading digits)">nsort', "ct_nsort": 'natural sort (for filenames with leading digits)">nsort',
"ct_utc": 'show all datetimes in UTC">UTC',
"ct_readme": 'show README.md in folder listings">📜 readme', "ct_readme": 'show README.md in folder listings">📜 readme',
"ct_idxh": 'show index.html instead of folder listing">htm', "ct_idxh": 'show index.html instead of folder listing">htm',
"ct_sbars": 'show scrollbars">⟊', "ct_sbars": 'show scrollbars">⟊',
@ -857,6 +858,7 @@ var Ls = {
"ct_qdel": 'sletteknappen spør bare én gang om bekreftelse">hurtig🗑', "ct_qdel": 'sletteknappen spør bare én gang om bekreftelse">hurtig🗑',
"ct_dir1st": 'sorter slik at mapper kommer foran filer">📁 først', "ct_dir1st": 'sorter slik at mapper kommer foran filer">📁 først',
"ct_nsort": 'naturlig sortering (forstår tall i filnavn)">nsort', "ct_nsort": 'naturlig sortering (forstår tall i filnavn)">nsort',
"ct_utc": 'bruk UTC for alle klokkeslett">UTC',
"ct_readme": 'vis README.md nedenfor filene">📜 readme', "ct_readme": 'vis README.md nedenfor filene">📜 readme',
"ct_idxh": 'vis index.html istedenfor fil-liste">htm', "ct_idxh": 'vis index.html istedenfor fil-liste">htm',
"ct_sbars": 'vis rullgardiner / skrollefelt">⟊', "ct_sbars": 'vis rullgardiner / skrollefelt">⟊',
@ -1483,6 +1485,7 @@ var Ls = {
"ct_qdel": '删除文件时,只需确认一次">快删', //m "ct_qdel": '删除文件时,只需确认一次">快删', //m
"ct_dir1st": '在文件之前排序文件夹">📁 排序', "ct_dir1st": '在文件之前排序文件夹">📁 排序',
"ct_nsort": '正确排序以数字开头的文件名">数字排序', //m "ct_nsort": '正确排序以数字开头的文件名">数字排序', //m
"ct_utc": '所有时间请使用UTC">UTC', //m
"ct_readme": '在文件夹列表中显示 README.md">📜 readme', "ct_readme": '在文件夹列表中显示 README.md">📜 readme',
"ct_idxh": '显示 index.html 代替文件夹列表">htm', "ct_idxh": '显示 index.html 代替文件夹列表">htm',
"ct_sbars": '显示滚动条">⟊', "ct_sbars": '显示滚动条">⟊',
@ -2109,6 +2112,7 @@ var Ls = {
"ct_qdel": 'Nur einmal fragen, wenn mehrere Dateien gelöscht werden">qdel', "ct_qdel": 'Nur einmal fragen, wenn mehrere Dateien gelöscht werden">qdel',
"ct_dir1st": 'Ordner vor Dateien sortieren">📁 zuerst', "ct_dir1st": 'Ordner vor Dateien sortieren">📁 zuerst',
"ct_nsort": 'Natürliche Sortierung (für Dateinamen mit führenden Ziffern)">nsort', "ct_nsort": 'Natürliche Sortierung (für Dateinamen mit führenden Ziffern)">nsort',
"ct_utc": 'Verwenden Sie UTC für alle Zeitangaben">UTC', //m
"ct_readme": 'README.md in Dateiliste anzeigen">📜 readme', "ct_readme": 'README.md in Dateiliste anzeigen">📜 readme',
"ct_idxh": 'index.html anstelle von Dateiliste anzeigen">htm', "ct_idxh": 'index.html anstelle von Dateiliste anzeigen">htm',
"ct_sbars": 'Scrollbars zeigen">⟊', "ct_sbars": 'Scrollbars zeigen">⟊',
@ -3362,6 +3366,7 @@ var Ls = {
"ct_qdel": 'спрашивать подтверждение только один раз перед удалением файлов">быстр. удал.', "ct_qdel": 'спрашивать подтверждение только один раз перед удалением файлов">быстр. удал.',
"ct_dir1st": 'разместить папки над файлами">📁 сверху', "ct_dir1st": 'разместить папки над файлами">📁 сверху',
"ct_nsort": 'сортировка по числам$N(например, файл с >code<2>/code< в начале названия идёт перед >code<11>/code<)">нат. сорт.', "ct_nsort": 'сортировка по числам$N(например, файл с >code<2>/code< в начале названия идёт перед >code<11>/code<)">нат. сорт.',
"ct_utc": 'используйте UTC для всех временных меток">UTC', //m
"ct_readme": 'показывать содержимое README.md в описании папки">📜 ридми', "ct_readme": 'показывать содержимое README.md в описании папки">📜 ридми',
"ct_idxh": 'показывать страницу index.html в текущей папке вместо интерфейса">htm', "ct_idxh": 'показывать страницу index.html в текущей папке вместо интерфейса">htm',
"ct_sbars": 'показывать полосы прокрутки">⟊', "ct_sbars": 'показывать полосы прокрутки">⟊',
@ -3987,6 +3992,7 @@ var Ls = {
"ct_qdel": 'al eliminar archivos, pedir confirmación solo una vez">elim. rápida', "ct_qdel": 'al eliminar archivos, pedir confirmación solo una vez">elim. rápida',
"ct_dir1st": 'ordenar carpetas antes que archivos">📁 primero', "ct_dir1st": 'ordenar carpetas antes que archivos">📁 primero',
"ct_nsort": 'orden natural (para nombres de archivo con dígitos iniciales)">ord. natural', "ct_nsort": 'orden natural (para nombres de archivo con dígitos iniciales)">ord. natural',
"ct_utc": 'use UTC para todas las horas">UTC', //m
"ct_readme": 'mostrar README.md en los listados de carpetas">📜 léeme', "ct_readme": 'mostrar README.md en los listados de carpetas">📜 léeme',
"ct_idxh": 'mostrar index.html en lugar del listado de carpetas">htm', "ct_idxh": 'mostrar index.html en lugar del listado de carpetas">htm',
"ct_sbars": 'mostrar barra lateral">⟊', "ct_sbars": 'mostrar barra lateral">⟊',
@ -4613,6 +4619,7 @@ var Ls = {
"ct_qdel": 'при видаленні файлів, запитати підтвердження лише один раз">швидке видалення', "ct_qdel": 'при видаленні файлів, запитати підтвердження лише один раз">швидке видалення',
"ct_dir1st": 'сортувати папки перед файлами">спочатку 📁', "ct_dir1st": 'сортувати папки перед файлами">спочатку 📁',
"ct_nsort": 'природне сортування (для імен файлів з початковими цифрами)">природне сортування', "ct_nsort": 'природне сортування (для імен файлів з початковими цифрами)">природне сортування',
"ct_utc": 'використовуйте UTC для всіх часових позначень">UTC', //m
"ct_readme": 'показати README.md у списках папок">📜 readme', "ct_readme": 'показати README.md у списках папок">📜 readme',
"ct_idxh": 'показати index.html замість списку папки">htm', "ct_idxh": 'показати index.html замість списку папки">htm',
"ct_sbars": 'показати смуги прокрутки">⟊', "ct_sbars": 'показати смуги прокрутки">⟊',
@ -5232,6 +5239,7 @@ ebi('op_cfg').innerHTML = (
' <a id="qdel" class="tgl btn" href="#" tt="' + L.ct_qdel + '</a>\n' + ' <a id="qdel" class="tgl btn" href="#" tt="' + L.ct_qdel + '</a>\n' +
' <a id="dir1st" class="tgl btn" href="#" tt="' + L.ct_dir1st + '</a>\n' + ' <a id="dir1st" class="tgl btn" href="#" tt="' + L.ct_dir1st + '</a>\n' +
' <a id="nsort" class="tgl btn" href="#" tt="' + L.ct_nsort + '</a>\n' + ' <a id="nsort" class="tgl btn" href="#" tt="' + L.ct_nsort + '</a>\n' +
' <a id="utctid" class="tgl btn" href="#" tt="' + L.ct_utc + '</a>\n' +
' <a id="ireadme" class="tgl btn" href="#" tt="' + L.ct_readme + '</a>\n' + ' <a id="ireadme" class="tgl btn" href="#" tt="' + L.ct_readme + '</a>\n' +
' <a id="idxh" class="tgl btn" href="#" tt="' + L.ct_idxh + '</a>\n' + ' <a id="idxh" class="tgl btn" href="#" tt="' + L.ct_idxh + '</a>\n' +
' <a id="sbars" class="tgl btn" href="#" tt="' + L.ct_sbars + '</a>\n' + ' <a id="sbars" class="tgl btn" href="#" tt="' + L.ct_sbars + '</a>\n' +
@ -10607,7 +10615,7 @@ var search_ui = (function () {
nodes.push(esc('' + v)); nodes.push(esc('' + v));
} }
nodes = nodes.concat([ext, unix2iso(ts)]); nodes = nodes.concat([ext, unix2ui(ts)]);
html.push(nodes.join('</td><td>')); html.push(nodes.join('</td><td>'));
html.push('</td></tr>'); html.push('</td></tr>');
} }
@ -10819,6 +10827,10 @@ var treectl = (function () {
xhr.open('GET', SR + '/?setck=dots=' + (v ? 'y' : ''), true); xhr.open('GET', SR + '/?setck=dots=' + (v ? 'y' : ''), true);
xhr.send(); xhr.send();
}); });
bcfg_bind(r, 'utctid', 'utctid', dutc, function (v) {
window.unix2ui = v ? unix2iso : unix2iso_localtime;
resort();
});
bcfg_bind(r, 'nsort', 'nsort', dnsort, resort); bcfg_bind(r, 'nsort', 'nsort', dnsort, resort);
bcfg_bind(r, 'dir1st', 'dir1st', true, resort); bcfg_bind(r, 'dir1st', 'dir1st', true, resort);
setwrap(bcfg_bind(r, 'wtree', 'wraptree', true, setwrap)); setwrap(bcfg_bind(r, 'wtree', 'wraptree', true, setwrap));
@ -11514,14 +11526,14 @@ var treectl = (function () {
if (k == ".dur") if (k == ".dur")
sv = v ? s2ms(v) : ""; sv = v ? s2ms(v) : "";
else if (k == ".up_at") else if (k == ".up_at")
sv = v ? unix2iso(v) : ""; sv = v ? unix2ui(v) : "";
else { else {
ln.push(esc('' + v)); ln.push(esc('' + v));
continue; continue;
} }
ln[ln.length - 1] += '</td><td sortv="' + v + '">' + sv; ln[ln.length - 1] += '</td><td sortv="' + v + '">' + sv;
} }
ln = ln.concat([tn.ext, unix2iso(tn.ts)]).join('</td><td>'); ln = ln.concat([tn.ext, unix2ui(tn.ts)]).join('</td><td>');
html.push(ln + '</td></tr>'); html.push(ln + '</td></tr>');
} }
html.push('</tbody>'); html.push('</tbody>');
@ -13184,7 +13196,7 @@ var unpost = (function () {
var done = res[a].pd === undefined; var done = res[a].pd === undefined;
html.push( html.push(
'<tr><td><a me="' + me + '" class="n' + a + '" href="#">' + (done ? L.un_del : L.un_abrt) + '</a></td>' + '<tr><td><a me="' + me + '" class="n' + a + '" href="#">' + (done ? L.un_del : L.un_abrt) + '</a></td>' +
'<td>' + unix2iso(res[a].at) + '</td>' + '<td>' + unix2ui(res[a].at) + '</td>' +
'<td>' + ('' + res[a].sz).replace(/\B(?=(\d{3})+(?!\d))/g, " ") + '</td>' + '<td>' + ('' + res[a].sz).replace(/\B(?=(\d{3})+(?!\d))/g, " ") + '</td>' +
(done ? '<td>100%</td>' : '<td>' + res[a].pd + '%</td>') + (done ? '<td>100%</td>' : '<td>' + res[a].pd + '%</td>') +
'<td>' + linksplit(res[a].vp).join('<span> / </span>') + '</td></tr>'); '<td>' + linksplit(res[a].vp).join('<span> / </span>') + '</td></tr>');

View file

@ -33,6 +33,7 @@
var SR="{{ r }}", var SR="{{ r }}",
lang="{{ lang }}", lang="{{ lang }}",
dutc={{ this.args.js_utc }},
dfavico="{{ favico }}"; dfavico="{{ favico }}";
var STG = window.localStorage; var STG = window.localStorage;

View file

@ -10,7 +10,7 @@ function render() {
fn = esc(uricom_dec(vsp[1])), fn = esc(uricom_dec(vsp[1])),
at = f.at, at = f.at,
td = now - f.at, td = now - f.at,
ts = !at ? '(?)' : unix2iso(at), ts = !at ? '(?)' : unix2ui(at),
sa = !at ? '(?)' : td > 60 ? shumantime(td) : (td + 's'), sa = !at ? '(?)' : td > 60 ? shumantime(td) : (td + 's'),
sz = ('' + f.sz).replace(/\B(?=(\d{3})+(?!\d))/g, " "); sz = ('' + f.sz).replace(/\B(?=(\d{3})+(?!\d))/g, " ");

View file

@ -66,6 +66,7 @@
var SR="{{ r }}", var SR="{{ r }}",
shr="{{ shr }}", shr="{{ shr }}",
lang="{{ lang }}", lang="{{ lang }}",
dutc={{ this.args.js_utc }},
dfavico="{{ favico }}"; dfavico="{{ favico }}";
var STG = window.localStorage; var STG = window.localStorage;

View file

@ -66,7 +66,7 @@ function showqr(href) {
for (var b = 7; b < 9; b++) { for (var b = 7; b < 9; b++) {
var v = buf[ibuf++]; var v = buf[ibuf++];
tr[a].cells[b].innerHTML = tr[a].cells[b].innerHTML =
v ? unix2iso(v).replace(' ', ',&nbsp;') : 'never'; v ? unix2ui(v).replace(' ', ',&nbsp;') : 'never';
} }
for (var a = 0; a < tr.length; a++) for (var a = 0; a < tr.length; a++)

View file

@ -2511,8 +2511,8 @@ function up2k_init(subtle) {
var msg = []; var msg = [];
for (var a = 0, aa = Math.min(20, response.hits.length); a < aa; a++) { for (var a = 0, aa = Math.min(20, response.hits.length); a < aa; a++) {
var hit = response.hits[a], var hit = response.hits[a],
tr = unix2iso(hit.ts), tr = unix2ui(hit.ts),
tu = unix2iso(t.lmod), tu = unix2ui(t.lmod),
diff = parseInt(t.lmod) - parseInt(hit.ts), diff = parseInt(t.lmod) - parseInt(hit.ts),
cdiff = (Math.abs(diff) <= 2) ? '3c0' : 'f0b', cdiff = (Math.abs(diff) <= 2) ? '3c0' : 'f0b',
sdiff = '<span style="color:#' + cdiff + '">diff ' + diff; sdiff = '<span style="color:#' + cdiff + '">diff ' + diff;
@ -3187,7 +3187,7 @@ function up2k_init(subtle) {
return; return;
try { try {
ebi('lifew').innerHTML = unix2iso((st.lifetime || lifetime) + ebi('lifew').innerHTML = unix2ui((st.lifetime || lifetime) +
Date.now() / 1000 - new Date().getTimezoneOffset() * 60 Date.now() / 1000 - new Date().getTimezoneOffset() * 60
).replace(' ', ', ').slice(0, -3); ).replace(' ', ', ').slice(0, -3);
} }

View file

@ -907,11 +907,29 @@ function noq_href(el) {
} }
function pad2(v) {
return ('0' + v).slice(-2);
}
function unix2iso(ts) { function unix2iso(ts) {
return new Date(ts * 1000).toISOString().replace("T", " ").slice(0, -5); return new Date(ts * 1000).toISOString().replace("T", " ").slice(0, -5);
} }
function unix2iso_localtime(ts) {
var o = new Date(ts * 1000),
p = pad2;
return "{0}-{1}-{2} {3}:{4}:{5}".format(
o.getFullYear(),
p(o.getMonth() + 1),
p(o.getDate()),
p(o.getHours()),
p(o.getMinutes()),
p(o.getSeconds()));
}
function s2ms(s) { function s2ms(s) {
s = Math.floor(s); s = Math.floor(s);
var m = Math.floor(s / 60); var m = Math.floor(s / 60);
@ -1203,6 +1221,13 @@ function scfg_bind(obj, oname, cname, defval, cb) {
} }
window.unix2ui = (function () {
var v = sread('utctid');
v = v ? (v === '0') : (window.dutc === false);
return v ? unix2iso_localtime : unix2iso;
})();
function hist_push(url) { function hist_push(url) {
console.log("h-push " + url); console.log("h-push " + url);
try { try {

View file

@ -143,7 +143,7 @@ class Cfg(Namespace):
def __init__(self, a=None, v=None, c=None, **ka0): def __init__(self, a=None, v=None, c=None, **ka0):
ka = {} ka = {}
ex = "chpw cookie_lax daw dav_auth dav_mac dav_rt e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only ih ihead magic nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_zip nrand nsort nw og og_no_head og_s_title ohead q rand re_dirsz reflink rmagic rss smb srch_dbg srch_excl stats uqe vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs" ex = "chpw cookie_lax daw dav_auth dav_mac dav_rt e2d e2ds e2dsa e2t e2ts e2tsr e2v e2vu e2vp early_ban ed emp exp force_js getmod grid gsel hardlink hardlink_only ih ihead localtime magic nid nih no_acode no_athumb no_bauth no_clone no_cp no_dav no_db_ip no_del no_dirsz no_dupe no_lifetime no_logues no_mv no_pipe no_poll no_readme no_robots no_sb_md no_sb_lg no_scandir no_tail no_tarcmp no_thumb no_vthumb no_zip nrand nsort nw og og_no_head og_s_title ohead q rand re_dirsz reflink rmagic rss smb srch_dbg srch_excl stats uqe vague_403 vc ver wo_up_readme write_uplog xdev xlink xvol zipmaxu zs"
ka.update(**{k: False for k in ex.split()}) ka.update(**{k: False for k in ex.split()})
ex = "dav_inf dedup dotpart dotsrch hook_v no_dhash no_fastboot no_fpool no_htp no_rescan no_sendfile no_ses no_snap no_up_list no_voldump re_dhash see_dots plain_ip" ex = "dav_inf dedup dotpart dotsrch hook_v no_dhash no_fastboot no_fpool no_htp no_rescan no_sendfile no_ses no_snap no_up_list no_voldump re_dhash see_dots plain_ip"