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_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);