From 132185e96034fca3bd2fc95998dd778e9e22258b Mon Sep 17 00:00:00 2001 From: Agando Date: Mon, 26 Oct 2026 15:25:58 +0100 Subject: feat(newos4): cut/copy in Files, paste into WebDAV (Issue D2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two panes kept separate clipboards (filemgr._clipboard vs webdav._selected), so "cut here, paste there" did not exist — the operator's last phone-test item. filemgr.js _openOverlay() publishes a read-only view of its clipboard on the terminal object: webx11.fileClipboard() / fileClipboardClear() / fileClipboardSet(paths, mode). webdav.js the bulk bar gains "📥 Paste N" (hidden when the clipboard is empty). Handler: for each path readFile -> _webdavRequest('PUT', dest + '/' + name, {body}); only 200/201/204 counts. For mode "cut" the local file is deleted AFTER the server accepted the bytes, never before. A failed PUT keeps the local copy, prints "📥 Paste failed: — HTTP n", and leaves that path in the clipboard so "📥 Paste 1" is a retry. Successes leave it. Summary "📥 Pasted N item(s) to " (+ "— M failed"), then the pane reopens there. Semantics: cut moves (upload then delete local), copy leaves the local file and keeps the clipboard so the same files can go into several folders. Verified with the transport stubbed in the live page (this browser has no WebDAV credential): button "📥 Paste 2" for a 2-path cut PUT ok (201) -> local file null (moved) PUT fail(500) -> local file "BBB" (kept) clipboard after -> {mode:"cut", paths:["/fail-d.txt"]}, button "📥 Paste 1" node --check both modules, no-undef clean (55 files), v4.6.101 x3 in main.html, syntax OK, help 362/362. --- modules/ext/critical-ext-bundle.js | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'modules/ext/critical-ext-bundle.js') diff --git a/modules/ext/critical-ext-bundle.js b/modules/ext/critical-ext-bundle.js index 8e968fb..d1a2b83 100644 --- a/modules/ext/critical-ext-bundle.js +++ b/modules/ext/critical-ext-bundle.js @@ -1520,6 +1520,15 @@ class FileManagerModule { } const overlay = this._createOverlay(); document.body.appendChild(overlay); + // 2026-10-26 (Issue D2): the WebDAV pane lives in another module and needs a read-only view of + // this clipboard to implement "cut/copy here, paste there". + try { + if (typeof window !== 'undefined' && window.webx11) { + window.webx11.fileClipboard = () => ({ mode: this._clipboard.mode, paths: [...this._clipboard.paths] }); + window.webx11.fileClipboardClear = () => { this._clipboard = { mode: null, paths: [] }; }; + window.webx11.fileClipboardSet = (paths, mode) => { this._clipboard = { mode: mode || 'copy', paths: [...(paths || [])] }; }; + } + } catch (_e) {} this._navigateTo(this.currentPath); } -- cgit v1.2.3