Skip to content

Commit 837074f

Browse files
Fix multi-row docker default preview menu clicks
1 parent 2d45c09 commit 837074f

6 files changed

Lines changed: 70 additions & 13 deletions

File tree

archive/folderview.plus-2026.04.03.02.txz.sha256

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d71017a53bab4a375966df931b2802d52d716e9526934b2d38eb3c0e48a023c2 folderview.plus-2026.04.04.25.txz

folderview.plus.plg

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
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.04.24">
10-
<!ENTITY md5 "61c1a2e0c9d6039a38adafa41f1ce576">
9+
<!ENTITY version "2026.04.04.25">
10+
<!ENTITY md5 "7ca229af1c33f2035258b2066c9df0c5">
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.04.25
17+
- Fix: Multi-row Docker folder previews now proxy Default context clicks back to the native hidden container trigger, so the Docker menu works again when preview rows are set above 1 or Unlimited.
18+
19+
1620
###2026.04.04.24
1721
- Fix: Docker runtime rows, folder state, and container interactions.
1822

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/scripts/docker.js

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,47 @@ const decorateDockerPreviewMemberTriggers = ($elements, folderId, containerName)
969969
.removeAttr('data-container-name')
970970
.removeAttr('title');
971971
};
972+
const bindCompactPreviewDefaultContext = ($item, $sourceRow) => {
973+
if (!$item || !$item.length || !$sourceRow || !$sourceRow.length) {
974+
return;
975+
}
976+
const $sourceTrigger = $sourceRow.find('td.ct-name > span.outer > span.hand').first();
977+
const $fallbackTrigger = $sourceRow.find('td.ct-name > span.outer > span.inner > span.appname > a.exec').first();
978+
const $nativeTrigger = $sourceTrigger.length ? $sourceTrigger : $fallbackTrigger;
979+
if (!$nativeTrigger.length) {
980+
return;
981+
}
982+
$item
983+
.attr('data-fv-default-context-proxy', '1')
984+
.off('click.fvDockerCompactDefaultContext')
985+
.on('click.fvDockerCompactDefaultContext', (event) => {
986+
if ($(event.target).closest('.folder-element-custom-btn').length) {
987+
return;
988+
}
989+
event.preventDefault();
990+
event.stopPropagation();
991+
const nativeTrigger = $nativeTrigger.get(0);
992+
if (!nativeTrigger) {
993+
return;
994+
}
995+
const clickEvent = $.Event('click');
996+
try {
997+
$(nativeTrigger).trigger(clickEvent);
998+
} catch (_error) {
999+
// Fall back to the native click path below.
1000+
}
1001+
if (clickEvent.isDefaultPrevented()) {
1002+
return;
1003+
}
1004+
try {
1005+
if (typeof nativeTrigger.click === 'function') {
1006+
nativeTrigger.click();
1007+
}
1008+
} catch (_error) {
1009+
// Ignore native click fallbacks when the host row rejects programmatic clicks.
1010+
}
1011+
});
1012+
};
9721013
const decorateDockerFolderMemberRow = ($row, folderId, containerName) => {
9731014
if (!$row || !$row.length) {
9741015
return;
@@ -3198,13 +3239,17 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
31983239
let addPreview;
31993240
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] createFolder (id: ${id}): Selecting addPreview function based on folder.settings.preview = ${folder.settings.preview}. Context setting: ${folder.settings.context}`);
32003241
const compactMultiRowPreview = isCompactMultiRowPreview(folder.settings);
3201-
const appendCompactPreview = (folderTrId, ctid, autostart, previewEntry) => {
3242+
const appendCompactPreview = (folderTrId, ctid, autostart, previewEntry, $sourceRow = null) => {
32023243
const { $item, $tooltipTrigger } = buildDockerPreviewItem({
32033244
entry: previewEntry || {},
32043245
settings: folder.settings,
32053246
autostart
32063247
});
32073248
$(`tr.folder-id-${folderTrId} div.folder-preview`).append($item);
3249+
if (folder.settings.context === 1) {
3250+
bindCompactPreviewDefaultContext($item, $sourceRow);
3251+
return null;
3252+
}
32083253
if (folder.settings.context === 2 || folder.settings.context === 0) {
32093254
const $triggerTarget = $tooltipTrigger && $tooltipTrigger.length ? $tooltipTrigger : $item.find('.fv-preview-trigger').first();
32103255
if ($triggerTarget.length) {
@@ -3219,10 +3264,10 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
32193264
};
32203265
switch (folder.settings.preview) {
32213266
case 1:
3222-
addPreview = (folderTrId, ctid, autostart, previewEntry) => {
3267+
addPreview = (folderTrId, ctid, autostart, previewEntry, $sourceRow = null) => {
32233268
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] addPreview (case 1 for ${folderTrId}): ctid=${ctid}, autostart=${autostart}`);
32243269
if (compactMultiRowPreview) {
3225-
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry);
3270+
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry, $sourceRow);
32263271
}
32273272
let clone = $(`tr.folder-id-${folderTrId} div.folder-storage > tr > td.ct-name > span.outer:last`).clone();
32283273
clone.find(`span.state`)[0].innerHTML = clone.find(`span.state`)[0].innerHTML.split("<br>")[0];
@@ -3237,10 +3282,10 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
32373282
}
32383283
}; break;
32393284
case 2:
3240-
addPreview = (folderTrId, ctid, autostart, previewEntry) => {
3285+
addPreview = (folderTrId, ctid, autostart, previewEntry, $sourceRow = null) => {
32413286
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] addPreview (case 2 for ${folderTrId}): ctid=${ctid}, autostart=${autostart}`);
32423287
if (compactMultiRowPreview) {
3243-
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry);
3288+
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry, $sourceRow);
32443289
}
32453290
$(`tr.folder-id-${folderTrId} div.folder-preview`).append($(`tr.folder-id-${folderTrId} div.folder-storage > tr > td.ct-name > span.outer > span.hand:last`).clone().addClass(`${autostart ? 'autostart' : ''}`));
32463291
if(folder.settings.context === 2 || folder.settings.context === 0) {
@@ -3251,10 +3296,10 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
32513296
}
32523297
}; break;
32533298
case 3:
3254-
addPreview = (folderTrId, ctid, autostart, previewEntry) => {
3299+
addPreview = (folderTrId, ctid, autostart, previewEntry, $sourceRow = null) => {
32553300
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] addPreview (case 3 for ${folderTrId}): ctid=${ctid}, autostart=${autostart}`);
32563301
if (compactMultiRowPreview) {
3257-
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry);
3302+
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry, $sourceRow);
32583303
}
32593304
let clone = $(`tr.folder-id-${folderTrId} div.folder-storage > tr > td.ct-name > span.outer > span.inner:last`).clone();
32603305
clone.find(`span.state`)[0].innerHTML = clone.find(`span.state`)[0].innerHTML.split("<br>")[0];
@@ -3269,10 +3314,10 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
32693314
}
32703315
}; break;
32713316
case 4:
3272-
addPreview = (folderTrId, ctid, autostart, previewEntry) => {
3317+
addPreview = (folderTrId, ctid, autostart, previewEntry, $sourceRow = null) => {
32733318
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] addPreview (case 4 for ${folderTrId}): ctid=${ctid}, autostart=${autostart}`);
32743319
if (compactMultiRowPreview) {
3275-
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry);
3320+
return appendCompactPreview(folderTrId, ctid, autostart, previewEntry, $sourceRow);
32763321
}
32773322
let lstSpan = $(`tr.folder-id-${folderTrId} div.folder-preview > span.outer:last`);
32783323
if(!lstSpan[0] || lstSpan.children().length >= 2) {
@@ -3431,7 +3476,7 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
34313476
if (FOLDER_VIEW_DEBUG_MODE && charts.length > 0) console.log(`[FV3_DEBUG] graphListener (for ct: ${ct.shortId}): Updated ${charts.length} charts.`);
34323477
};
34333478

3434-
const tooltip_trigger_element = addPreview(id, ct.shortId, !(ct.info.State.Autostart === false), newFolder[container_name_in_folder]);
3479+
const tooltip_trigger_element = addPreview(id, ct.shortId, !(ct.info.State.Autostart === false), newFolder[container_name_in_folder], $containerTR);
34353480
if (FOLDER_VIEW_DEBUG_MODE) console.log(`[FV3_DEBUG] createFolder (id: ${id}), container ${ct.shortId}: Called addPreview. Returned tooltip_trigger_element:`, tooltip_trigger_element ? tooltip_trigger_element[0] : 'null/undefined');
34363481

34373482
$(`tr.folder-id-${id} div.folder-preview span.inner > span.appname`).css("width", folder.settings.preview_text_width || '');

tests/docker-preview-overflow-feature.test.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,18 @@ test('docker runtime applies preview row layout limits and keeps compact preview
4949
assert.match(dockerJs, /const appendPreviewWebuiPlaceholder = \(\$target\) =>/);
5050
assert.match(dockerJs, /fv-preview-webui-placeholder/);
5151
assert.match(dockerJs, /const buildDockerPreviewItem = \(\{ entry = \{\}, settings = \{\}, autostart = false \}\) =>/);
52+
assert.match(dockerJs, /const bindCompactPreviewDefaultContext = \(\$item, \$sourceRow\) =>/);
53+
assert.match(dockerJs, /\$sourceRow\.find\('td\.ct-name > span\.outer > span\.hand'\)\.first\(\)/);
54+
assert.match(dockerJs, /\.on\('click\.fvDockerCompactDefaultContext', \(event\) => \{/);
55+
assert.match(dockerJs, /\$\(nativeTrigger\)\.trigger\(clickEvent\);/);
5256
assert.match(dockerJs, /fv-docker-preview-mode-2 fv-preview-trigger fv-preview-tooltip-proxy/);
5357
assert.match(dockerJs, /fv-docker-preview-mode-\$\{previewMode\} fv-preview-trigger fv-preview-tooltip-proxy/);
5458
assert.match(dockerJs, /fv-docker-preview-mode-1 fv-preview-trigger fv-preview-tooltip-proxy/);
5559
assert.match(dockerJs, /fv-preview-trigger fv-preview-tooltip-proxy/);
5660
assert.match(dockerJs, /\$tooltipTrigger:\s*triggerSelector === '\.fv-docker-preview-card'\s*\?\s*\$compactItem/);
61+
assert.match(dockerJs, /const appendCompactPreview = \(folderTrId, ctid, autostart, previewEntry, \$sourceRow = null\) =>/);
62+
assert.match(dockerJs, /if \(folder\.settings\.context === 1\) \{/);
63+
assert.match(dockerJs, /bindCompactPreviewDefaultContext\(\$item, \$sourceRow\);/);
5764
assert.match(dockerJs, /\$target\.data\('fvTooltipEnsureInitialized', ensureInitialized\);/);
5865
assert.match(dockerJs, /const layoutFolderPreviewRows = \(\$preview, settings = \{\}\) =>/);
5966
assert.match(dockerJs, /const applyFolderPreviewLayout = typeof dockerRuntimeShared\.applyFolderPreviewLayout === 'function'/);
@@ -62,6 +69,7 @@ test('docker runtime applies preview row layout limits and keeps compact preview
6269
assert.match(dockerJs, /const finalizePreviewRows = typeof dockerRuntimeShared\.finalizePreviewRows === 'function'/);
6370
assert.match(dockerJs, /let clone = \$\(`tr\.folder-id-\$\{folderTrId\} div\.folder-storage > tr > td\.ct-name > span\.outer:last`\)\.clone\(\)/);
6471
assert.match(dockerJs, /\$previewElementTarget\.children\('span\.inner'\)\.last\(\)/);
72+
assert.match(dockerJs, /const tooltip_trigger_element = addPreview\(id, ct\.shortId, !\(ct\.info\.State\.Autostart === false\), newFolder\[container_name_in_folder\], \$containerTR\);/);
6573
assert.match(dockerJs, /const maxItemsPerRow = Math\.max\(1,\s*getFolderPreviewItemsPerRow\(settings\)\)/);
6674
assert.match(dockerJs, /const \$measurement = availableWidth > 0/);
6775
assert.match(dockerJs, /fv-preview-multirow fv-preview-row-measure/);

0 commit comments

Comments
 (0)