Skip to content

Commit c47d8c9

Browse files
author
FolderView Plus Test
committed
Fix command view menu positioning
1 parent 2470b3b commit c47d8c9

7 files changed

Lines changed: 43 additions & 11 deletions

File tree

14 MB
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5057056f36fc464fb29879cb62fc1e1c6f347e2b678190af6c3c604a809cf08e folderview.plus-2026.04.15.28.txz

docs/releases/2026.04.15.28.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- Fix: Docker command-view now forwards the original pointer coordinates through the native Docker row trigger so the Unraid container menu opens at the click point instead of the screen corner.
2+
- UX: Running command-view member tiles now use a forced green border treatment instead of inheriting the light theme border color.
3+
- Quality: Expanded the command-view runtime regression test to cover the pointer-aware native-trigger proxy signature.

folderview.plus.plg

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
<!ENTITY launch "Settings/FolderViewPlus">
77
<!ENTITY plugdir "/usr/local/emhttp/plugins/&name;">
88
<!ENTITY pluginURL "https://raw.githubusercontent.com/&github;/dev/folderview.plus.plg">
9-
<!ENTITY version "2026.04.15.27">
10-
<!ENTITY md5 "e6f536fba149d9342c7fedb816090916">
9+
<!ENTITY version "2026.04.15.28">
10+
<!ENTITY md5 "32bf0fefa61ea490f3967b2c5863df47">
1111
]>
1212

1313
<PLUGIN name="&name;" author="&author;" version="&version;" launch="&launch;" pluginURL="&pluginURL;" icon="folder-icon.png" support="https://forums.unraid.net/topic/197631-plugin-folderview-plus/" min="7.0.0">
1414
<CHANGES>
1515

16+
###2026.04.15.28
17+
- Fix: Docker command-view now forwards the original pointer coordinates through the native Docker row trigger so the Unraid container menu opens at the click point instead of the screen corner.
18+
- UX: Running command-view member tiles now use a forced green border treatment instead of inheriting the light theme border color.
19+
- Quality: Expanded the command-view runtime regression test to cover the pointer-aware native-trigger proxy signature.
20+
21+
1622
###2026.04.15.27
1723
- Fix: Docker command-view container tiles now proxy the native Docker row trigger the same way the regular FolderView preview does, instead of mixing inline-handler hydration with the tile surface.
1824
- UX: Command-view hover treatment now stays on the container icon instead of drawing a focus outline around the entire tile row.

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/scripts/docker.runtime.command-view.js

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,33 @@
286286
|| sourceRow.querySelector('td.ct-name > span.outer > span.inner > span.appname > a.exec');
287287
};
288288

289-
const proxyNativeMemberTrigger = (containerName, eventType = 'click') => {
289+
const proxyNativeMemberTrigger = (containerName, eventType = 'click', sourceEvent = null) => {
290290
const trigger = getNativeMemberTrigger(containerName);
291291
if (!(trigger instanceof HTMLElement)) {
292292
return false;
293293
}
294294
const safeType = eventType === 'contextmenu' ? 'contextmenu' : 'click';
295+
const clientX = Number(sourceEvent?.clientX || 0);
296+
const clientY = Number(sourceEvent?.clientY || 0);
297+
const screenX = Number(sourceEvent?.screenX || clientX || 0);
298+
const screenY = Number(sourceEvent?.screenY || clientY || 0);
299+
const pageX = Number(sourceEvent?.pageX || clientX || 0);
300+
const pageY = Number(sourceEvent?.pageY || clientY || 0);
295301
if (typeof jq === 'function') {
296302
try {
297-
jq(trigger).trigger(safeType);
303+
const jqEvent = jq.Event(safeType, {
304+
bubbles: true,
305+
cancelable: true,
306+
clientX,
307+
clientY,
308+
screenX,
309+
screenY,
310+
pageX,
311+
pageY,
312+
button: safeType === 'contextmenu' ? 2 : 0,
313+
which: safeType === 'contextmenu' ? 3 : 1
314+
});
315+
jq(trigger).trigger(jqEvent);
298316
return true;
299317
} catch (_error) {
300318
// Fall through to native DOM dispatch.
@@ -313,7 +331,11 @@
313331
cancelable: true,
314332
view: win || undefined,
315333
button: safeType === 'contextmenu' ? 2 : 0,
316-
buttons: safeType === 'contextmenu' ? 2 : 1
334+
buttons: safeType === 'contextmenu' ? 2 : 1,
335+
clientX,
336+
clientY,
337+
screenX,
338+
screenY
317339
});
318340
try {
319341
return trigger.dispatchEvent(event);
@@ -341,20 +363,20 @@
341363
surface.addEventListener('click', (event) => {
342364
event.preventDefault();
343365
event.stopPropagation();
344-
proxyNativeMemberTrigger(safeName, 'click');
366+
proxyNativeMemberTrigger(safeName, 'click', event);
345367
});
346368
surface.addEventListener('contextmenu', (event) => {
347369
event.preventDefault();
348370
event.stopPropagation();
349-
proxyNativeMemberTrigger(safeName, 'contextmenu');
371+
proxyNativeMemberTrigger(safeName, 'contextmenu', event);
350372
});
351373
surface.addEventListener('keydown', (event) => {
352374
if (event.key !== 'Enter' && event.key !== ' ') {
353375
return;
354376
}
355377
event.preventDefault();
356378
event.stopPropagation();
357-
proxyNativeMemberTrigger(safeName, 'click');
379+
proxyNativeMemberTrigger(safeName, 'click', event);
358380
});
359381
};
360382

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/styles/docker.command-view.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,8 @@ body[data-fvplus-docker-command-view-mounted="true"] table#docker_containers {
274274
}
275275

276276
.fv-docker-command-member-tile.running {
277-
border-color: var(--fvplus-status-started, #7ad05a);
278-
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--fvplus-status-started, #7ad05a) 78%, transparent);
277+
border-color: #7ad05a;
278+
box-shadow: inset 0 0 0 1px rgba(122, 208, 90, 0.55);
279279
}
280280

281281
.fv-docker-command-member-tile.paused {

tests/docker-runtime-shared-architecture.test.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ test('docker command-view renders visible member tiles instead of name-only chip
248248
assert.match(dockerCommandViewJs, /const getNativeMemberTrigger = \(containerName\) =>/);
249249
assert.match(dockerCommandViewJs, /const getNativeMemberRow = \(containerName\) =>/);
250250
assert.match(dockerCommandViewJs, /row\.querySelector\('td\.ct-name \.appname'\)\?\.textContent/);
251-
assert.match(dockerCommandViewJs, /const proxyNativeMemberTrigger = \(containerName,\s*eventType = 'click'\) =>/);
251+
assert.match(dockerCommandViewJs, /const proxyNativeMemberTrigger = \(containerName,\s*eventType = 'click',\s*sourceEvent = null\) =>/);
252252
assert.match(dockerCommandViewJs, /const hydrateNativeMemberSurface = \(surface,\s*containerName\) =>/);
253253
assert.match(dockerCommandViewJs, /const appendDockerPreviewActionButtons = typeof deps\.appendDockerPreviewActionButtons === 'function'/);
254254
assert.match(dockerCommandViewJs, /class="fv-docker-command-member-tile/);

0 commit comments

Comments
 (0)