From d08ca24c87797993c136ea7c0b05e385e5a83e59 Mon Sep 17 00:00:00 2001 From: kodi Date: Sat, 14 Mar 2026 11:01:45 +0100 Subject: [PATCH] feat: contextmenu copy multiple folders toegevoegd --- webui/backend/data/tasks.db | Bin 188416 -> 188416 bytes .../test_ui_smoke_golden.cpython-313.pyc | Bin 32269 -> 32346 bytes .../tests/golden/test_ui_smoke_golden.py | 5 +++-- webui/html/app.js | 8 ++------ 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/webui/backend/data/tasks.db b/webui/backend/data/tasks.db index ba7d4c752da30094a00244b12415089568b056fe..742621b735836e2612a1c54f26d5f5d8c2644b05 100644 GIT binary patch delta 2640 zcmb7FTWB0r7(VCB&d%O)QLGXh+p1NFdcw>(bI#60E3w-~ebL^6bfvX(TS(KIl`0}g zvy&RCh|n^W@jRdj$`Rq<+_J;qr|bHQ5WYehZAO6 zX34R@L|jRAM|Ctu$F@@rUP#F zZEx3>>utMoEqdiocq#*jLwOc{1+&pNv+!jFc6_UKr(u6g<7k#c@`ay98KYvt1_iTmWq2w;>!V$B@XMk54#G_^c_;a+(x-GOyOe@*RCzm04WgMyeh%G{ z5WFHz_#K8PpGRHenmV9r1B4X8Y>&hcQ3=N?#hSij3Ax=AQCSh(YKhD=LDT_8i{NHG zvT^>P8g!!`T10el(DjzcwMg`_(~t(`6QNQ;8<2c4+*CmWNInrAte{8b9kD+pkD0Wj zdDyjyxY2}CY+6*qwrUxwD|Uo17u=33J&mbONfUQjrPYUvO~yqfS372NbLj`NlggRokMgC&8R=8>9^5TVeioV&kNDC(!>iVg8~`Al9svLp z3WaudHk>+%o(Z-ceo}E?D~;^)4uo3`*gxJdAeHr-oSP~yHib;aOx6VA{Tekm=f#Qp zeH06{Mq`22yuembk*&*$SfL)wUV17x{b4dFe?Z3~8As6kkRku^xCTsLE7 zph4Nn8HlLe;MNN@x2o)#7=_r4WfQDHreT;`Q-~1N&}lKcbOMn~ZU{oq`AO%w&fhx! z4O6GlWOVE_x~RaX#YM~~$Ja@P#_e9ZJm65vg4!g(M3aJ=H8n$l->M+)PL5Z<60Q3l z{n5R?J23=0p6Fz`!LApxM>1D4FQw0>=2C|8nUYLymfuZWNel_qYZBD&@yprap0xmo z{b9^$BM`%%1H^;M-*WizDRl3a#TZ*=ZZ-7$RsL9wUfh1h+DVB8`czOkoZhx@<3)fr z<=^bTo}J%*!T-PZzFxk_+6H>D@%{#Xe@q|mZcN{5Yg;UB*P{HU{H!SK*;i)|ZR1n9 zV2=`%Co}W>)o@>?zxqz_kJjs-{9}9^JnD*Sr#C7^&mb&4Lyi=Vg@61 YXRMqBcSk|j+NBt1${(G*jE0i`0d2IWv;Y7A delta 378 zcmWlRJ4nM&7)JB|xi`s8`Wghq2XqiYC$0FzN2?OiL4_*12z7O^8LT+gq2S_+3Rj%0 zC|wjqkt^xYIyhJmq?6)OQ0X8-Q53p}aru^W&KJ)a@tm<;2jQLiVF<59t|D+0t?85U zlF^PEP%r;Vc`_w^sR8y5IqtWhfe%_x&F3s=)x3|eWa!$rShpZb;6B;ryAwAt7+!>F zPK(e(aM^Xh%_1~udZ%paZuY`gi{R(`&gis@ddM5ekR4$c!6hRkFWY=uAZFj-RR6yy z!wHz;q70KNbUCaYNV7bH{4|M;V!i@tldQl9@R}fgcn$hVpJ~dA-2HQSW4`kSmBwtz-QwwR1-)a&wqDXF NnCb8VAI)}>9>)$QJ3+>=6+o<&dHJHB9rIx2u$`h6q$V2tOiWy znhSu%OL-yUGokce2)+5Qc?BaxA-}-nnU*SG#an@FkRdmr^j`?Q+14tJZ?d%HvH@kYxfoT5f4Yq~(NGQu>2Sdflwmxc%tRNQi@lZA}eIk?{OrH$pn0&!UnUNFB zI~~derq6_OgXy!OJRq9!+~hc4UDor#7lJQNp5UtrWL*NXcKNDuo)5kpe9@9APhhfv zpExsL@Ri8{;tDLG{J~d2453hg;A^H#pwMApP+&-B(7e7m!Y_uE(P%P9h`dl{NosDf zUQTLWdP#3i69efJ)QyixfacRJnjmo6H}|zWGAP zMF~ca&5LqlnAyBexLx50o-9%rED?GkJoXAl+zk$%>l_jnIV3Jf+U!WX!r{6(uF#O1 kF=6wB8gE81XEsJx#u*&fB{VNeXntV;b3gb@{#Yvm0CuUYxc~qF delta 492 zcmcchhq3n$BkyNkUM>b8@K@QIDZG)lQJ3+^=6+o<&dI)pB9rIx2!QFkW;K&*%|#~X znnU=dybyXOl->)WH~%%SV1y{-7XZ_1Eg=fG0{I{VZ$jz65PGw%RT|&s;~sU4%-cd) zCOa4^Zg%yW12N*OH&_evkx*8U#AI6^HAXfNi}`pcJD5HZ$^oWNhH_56;G@jQ1?HU& z;+MeU0+S8=#F_bm zFHc@0q`(r&AAAMG5DFCtzG}(@3Lgdr1%`A6&1;)${9;%`0+aLeic1s{b8_4=b5e^H zY!xy~Qge&-a#HisOEMJf6buy9)SzOiWvNA#8X6!4nhLgdU{Ss7%)Ar@TU%QNr8J-c zN}ASHnv-t^%X2EijGW9BQqSlz`D3W$X4cRf5{%}X@8!lYvu9q&F1*4~G&!(DVzOtU q*XAvS8r+QWoA1_mGm1H}F}gC&;J7ZKc~L_13j>(@!E3TzoeTiTsG?T@ diff --git a/webui/backend/tests/golden/test_ui_smoke_golden.py b/webui/backend/tests/golden/test_ui_smoke_golden.py index 7931bdc..23d6845 100644 --- a/webui/backend/tests/golden/test_ui_smoke_golden.py +++ b/webui/backend/tests/golden/test_ui_smoke_golden.py @@ -223,13 +223,14 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('closeContextMenu();', app_js) self.assertIn('elements.renameButton.classList.toggle("hidden", isMulti);', app_js) self.assertIn('elements.copyButton.classList.remove("hidden");', app_js) - self.assertIn('const allFiles = items.length > 0 && items.every((item) => item.kind === "file");', app_js) - self.assertIn('elements.copyButton.disabled = !allFiles;', app_js) + self.assertIn('elements.copyButton.disabled = items.length === 0;', app_js) self.assertIn('elements.moveButton.classList.remove("hidden");', app_js) self.assertIn('openRenamePopup();', app_js) self.assertIn('startCopySelected();', app_js) self.assertIn('openF6Flow();', app_js) self.assertIn('deleteSelected();', app_js) + self.assertIn('document.getElementById("copy-btn").disabled = !hasSelection;', app_js) + self.assertNotIn('Only files are supported for copy', app_js) self.assertIn('document.getElementById("upload-menu-toggle").onclick = (event) => {', app_js) self.assertIn('document.getElementById("upload-folder-btn").onclick = openFolderPicker;', app_js) self.assertIn('throw createApiError(response, data);', app_js) diff --git a/webui/html/app.js b/webui/html/app.js index 507203c..4e95cba 100644 --- a/webui/html/app.js +++ b/webui/html/app.js @@ -368,12 +368,11 @@ function openContextMenu(pane, entry, event) { contextMenuState.anchorPath = entry.path; const isMulti = items.length > 1; - const allFiles = items.length > 0 && items.every((item) => item.kind === "file"); elements.scope.textContent = isMulti ? "Multi-selection" : "Single item"; elements.target.textContent = isMulti ? `${items.length} selected items` : entry.name; elements.renameButton.classList.toggle("hidden", isMulti); elements.copyButton.classList.remove("hidden"); - elements.copyButton.disabled = !allFiles; + elements.copyButton.disabled = items.length === 0; elements.moveButton.classList.remove("hidden"); elements.deleteButton.classList.remove("hidden"); @@ -1465,7 +1464,7 @@ function updateActionButtons() { document.getElementById("edit-btn").disabled = !exactlyOne || !allFiles || !isEditableSelection(selectedItems[0] || null); document.getElementById("rename-btn").disabled = !exactlyOne; document.getElementById("delete-btn").disabled = !hasSelection; - document.getElementById("copy-btn").disabled = !allFiles; + document.getElementById("copy-btn").disabled = !hasSelection; document.getElementById("move-btn").disabled = !hasSelection; } @@ -2208,9 +2207,6 @@ async function startCopySelected() { for (const item of selectedItems) { const destination = defaultDestination(item.path, baseDestination); try { - if (item.kind !== "file") { - throw new Error("Only files are supported for copy"); - } const result = await apiRequest("POST", "/api/files/copy", { source: item.path, destination,