diff --git a/internal/server/web/templates/files.html b/internal/server/web/templates/files.html index e26e74a..516fdf0 100644 --- a/internal/server/web/templates/files.html +++ b/internal/server/web/templates/files.html @@ -29,7 +29,7 @@ .act { display:flex; gap:6px; justify-content:flex-end; } table.fm .c-sz { width:120px; } table.fm .c-mt { width:160px; } - table.fm .c-act { width:160px; } + table.fm .c-act { width:200px; } .fm .nm { overflow-wrap:anywhere; } /* Phones: no date column, and the row buttons only as wide as they are. */ @media (max-width: 640px) { @@ -128,6 +128,7 @@ // Monochrome inline icons (inherit button color via currentColor). const SVG = ''; const ICON_DL = SVG + ''; + const ICON_REN = SVG + ''; const ICON_MV = SVG + ''; const ICON_DEL = SVG + ''; let cwd = '/'; @@ -175,13 +176,15 @@ '
' + (isZip?'':'') + (e.is_dir?'':''+ICON_DL+'') + - '' + + '' + + '' + '' + '
'; const nm = tr.querySelector('.nm'); nm.onclick = () => e.is_dir ? load(join(cwd, e.name)) : view(e); tr.querySelector('.ck').onchange = ev => { const n=e.name; ev.target.checked?selected.add(n):selected.delete(n); updateSel(); }; tr.querySelector('[data-act="del"]').onclick = () => del(e); + tr.querySelector('[data-act="name"]').onclick = () => rename(e); tr.querySelector('[data-act="ren"]').onclick = () => move(e); const uz = tr.querySelector('[data-act="unzip"]'); if (uz) uz.onclick = () => unzip(e); tb.appendChild(tr); @@ -239,6 +242,15 @@ r.ok ? (toast('перемещено'), load(cwd)) : toast(r.error||'ошибка', true); } + // Rename in place: only the name is asked for, the folder stays. + async function rename(e) { + const n = prompt('Новое имя:', e.name); + if (!n || n === e.name) return; + if (n.includes('/')) { toast('имя без "/" - чтобы перенести в другую папку, есть кнопка «Переместить»', true); return; } + const r = await api('move', {src: join(cwd, e.name), dst: join(cwd, n)}); + r.ok ? (toast('переименовано'), load(cwd)) : toast(r.error||'ошибка', true); + } + async function unzip(e) { const r = await api('unzip', {path: join(cwd, e.name), dest: cwd}); r.ok ? (toast('распаковано'), load(cwd)) : toast(r.error||'ошибка', true);