@@ -2358,16 +2358,10 @@ const createFolder = (folder, id, positionInMainOrder, liveOrderArray, container
23582358 const pinned = isDockerFolderPinned ( id ) ;
23592359 const locked = isDockerFolderLocked ( id ) ;
23602360 const focused = dockerFocusedFolderId === id ;
2361- const focusTitle = focused ? 'Clear focus' : 'Focus folder' ;
2362- const pinTitle = pinned ? 'Unpin folder' : 'Pin folder' ;
2363- const lockTitle = locked ? 'Unlock folder' : 'Lock folder' ;
2364- const focusIcon = focused ? 'fa-dot-circle-o' : 'fa-bullseye' ;
2365- const pinIcon = pinned ? 'fa-star' : 'fa-star-o' ;
2366- const lockIcon = locked ? 'fa-lock' : 'fa-unlock-alt' ;
23672361 const lockedClass = locked ? 'fv-folder-locked' : '' ;
23682362 const pinnedClass = pinned ? 'fv-folder-pinned' : '' ;
23692363 const focusedClass = focused ? 'fv-folder-focused' : '' ;
2370- const fld = `<tr class="sortable folder-id-${ id } ${ hoverClass } ${ lockedClass } ${ pinnedClass } ${ focusedClass } folder"><td class="ct-name folder-name"><div class="folder-name-sub"><i class="fa fa-arrows-v mover orange-text"></i><span class="outer folder-outer"><span id="${ id } " onclick="addDockerFolderContext('${ id } ')" class="hand folder-hand"><img src="${ safeFolderIcon } " class="img folder-img" onerror='this.src="/plugins/dynamix.docker.manager/images/question.png"'></span><span class="inner folder-inner"><span class="appname" style="display: none;"><a>folder-${ id } </a></span><a class="exec folder-appname" onclick='editFolder("${ id } ")'>${ safeFolderName } </a><br><i id="load-folder-${ id } " class="fa fa-square stopped folder-load-status"></i><span class="state folder-state fv-folder-state-stopped"> ${ $ . i18n ( 'stopped' ) } </span></span></span><span class="fv-folder-row-actions"><button type="button" class="fv-folder-row-action fv-folder-row-action-focus ${ focused ? 'is-active' : '' } " data-folder-id="${ id } " title="${ focusTitle } " aria-label="${ focusTitle } " onclick="event.preventDefault();event.stopPropagation();toggleDockerFolderFocus('${ id } ')"><i class="fa ${ focusIcon } " aria-hidden="true"></i></button><button type="button" class="fv-folder-row-action fv-folder-row-action-pin ${ pinned ? 'is-active' : '' } " data-folder-id="${ id } " title="${ pinTitle } " aria-label="${ pinTitle } " onclick="event.preventDefault();event.stopPropagation();toggleDockerFolderPin('${ id } ')"><i class="fa ${ pinIcon } " aria-hidden="true"></i></button><button type="button" class="fv-folder-row-action fv-folder-row-action-lock ${ locked ? 'is-active' : '' } " data-folder-id="${ id } " title="${ lockTitle } " aria-label="${ lockTitle } " onclick="event.preventDefault();event.stopPropagation();toggleDockerFolderLock('${ id } ')"><i class="fa ${ lockIcon } " aria-hidden="true"></i></button></span><button class="dropDown-${ id } folder-dropdown" onclick="dropDownButton('${ id } ')" ><i class="fa fa-chevron-down" aria-hidden="true"></i></button></div></td><td class="updatecolumn folder-update"><span class="green-text folder-update-text"><i class="fa fa-check fa-fw"></i> ${ $ . i18n ( 'up-to-date' ) } </span><div class="advanced" style="display: ${ advanced ? 'block' : 'none' } ;"><a class="exec" onclick="forceUpdateFolder('${ id } ');"><span style="white-space:nowrap;"><i class="fa fa-cloud-download fa-fw"></i> ${ $ . i18n ( 'force-update' ) } </span></a></div></td><td colspan="${ colspan } "><div class="folder-storage"></div><div class="folder-preview"></div></td><td class="advanced folder-advanced" ${ advanced ? 'style="display: table-cell;"' : '' } ><span class="cpu-folder-${ id } folder-cpu">0%</span><div class="usage-disk mm folder-load"><span id="cpu-folder-${ id } " class="folder-cpu-bar" style="width:0%"></span><span></span></div><br><span class="mem-folder-${ id } folder-mem">0 / 0</span></td><td class="folder-autostart"><input type="checkbox" id="folder-${ id } -auto" class="autostart" style="display:none"><div style="clear:left"></div></td><td></td></tr>` ;
2364+ const fld = `<tr class="sortable folder-id-${ id } ${ hoverClass } ${ lockedClass } ${ pinnedClass } ${ focusedClass } folder"><td class="ct-name folder-name"><div class="folder-name-sub"><i class="fa fa-arrows-v mover orange-text"></i><span class="outer folder-outer"><span id="${ id } " onclick="addDockerFolderContext('${ id } ')" class="hand folder-hand"><img src="${ safeFolderIcon } " class="img folder-img" onerror='this.src="/plugins/dynamix.docker.manager/images/question.png"'></span><span class="inner folder-inner"><span class="appname" style="display: none;"><a>folder-${ id } </a></span><a class="exec folder-appname" onclick='editFolder("${ id } ")'>${ safeFolderName } </a><br><i id="load-folder-${ id } " class="fa fa-square stopped folder-load-status"></i><span class="state folder-state fv-folder-state-stopped"> ${ $ . i18n ( 'stopped' ) } </span></span></span><button class="dropDown-${ id } folder-dropdown" onclick="dropDownButton('${ id } ')" ><i class="fa fa-chevron-down" aria-hidden="true"></i></button></div></td><td class="updatecolumn folder-update"><span class="green-text folder-update-text"><i class="fa fa-check fa-fw"></i> ${ $ . i18n ( 'up-to-date' ) } </span><div class="advanced" style="display: ${ advanced ? 'block' : 'none' } ;"><a class="exec" onclick="forceUpdateFolder('${ id } ');"><span style="white-space:nowrap;"><i class="fa fa-cloud-download fa-fw"></i> ${ $ . i18n ( 'force-update' ) } </span></a></div></td><td colspan="${ colspan } "><div class="folder-storage"></div><div class="folder-preview"></div></td><td class="advanced folder-advanced" ${ advanced ? 'style="display: table-cell;"' : '' } ><span class="cpu-folder-${ id } folder-cpu">0%</span><div class="usage-disk mm folder-load"><span id="cpu-folder-${ id } " class="folder-cpu-bar" style="width:0%"></span><span></span></div><br><span class="mem-folder-${ id } folder-mem">0 / 0</span></td><td class="folder-autostart"><input type="checkbox" id="folder-${ id } -auto" class="autostart" style="display:none"><div style="clear:left"></div></td><td></td></tr>` ;
23712365 if ( FOLDER_VIEW_DEBUG_MODE ) console . log ( `[FV3_DEBUG] createFolder (id: ${ id } ): colspan=${ colspan } . Generated folder HTML (fld).` ) ;
23722366
23732367 if ( positionInMainOrder === 0 ) {
@@ -4169,12 +4163,41 @@ const addDockerFolderContext = (id) => {
41694163 }
41704164 const folderData = globalFolders [ id ] ;
41714165 const hasChildren = folderHasChildren ( id ) ;
4166+ const focused = dockerFocusedFolderId === id ;
4167+ const pinned = isDockerFolderPinned ( id ) ;
4168+ const locked = isDockerFolderLocked ( id ) ;
41724169 const directScopeContainers = getScopedRuntimeContainersForFolder ( id , false ) ;
41734170 const branchScopeContainers = getScopedRuntimeContainersForFolder ( id , true ) ;
41744171 const directCounts = summarizeFolderActionCounts ( directScopeContainers ) ;
41754172 const branchCounts = summarizeFolderActionCounts ( branchScopeContainers ) ;
41764173 if ( FOLDER_VIEW_DEBUG_MODE ) console . log ( `[FV3_DEBUG] addDockerFolderContext (id: ${ id } ): Folder data:` , { ...folderData } ) ;
41774174
4175+ opts . push ( {
4176+ text : focused ? 'Clear focus' : 'Focus folder' ,
4177+ icon : focused ? 'fa-dot-circle-o' : 'fa-bullseye' ,
4178+ action : ( evt ) => {
4179+ evt . preventDefault ( ) ;
4180+ toggleDockerFolderFocus ( id ) ;
4181+ }
4182+ } ) ;
4183+ opts . push ( {
4184+ text : pinned ? 'Unpin folder' : 'Pin folder' ,
4185+ icon : pinned ? 'fa-star' : 'fa-star-o' ,
4186+ action : ( evt ) => {
4187+ evt . preventDefault ( ) ;
4188+ toggleDockerFolderPin ( id ) ;
4189+ }
4190+ } ) ;
4191+ opts . push ( {
4192+ text : locked ? 'Unlock folder' : 'Lock folder' ,
4193+ icon : locked ? 'fa-lock' : 'fa-unlock-alt' ,
4194+ action : ( evt ) => {
4195+ evt . preventDefault ( ) ;
4196+ toggleDockerFolderLock ( id ) ;
4197+ }
4198+ } ) ;
4199+ appendDivider ( ) ;
4200+
41784201
41794202 if ( folderData . settings . folder_webui && folderData . settings . folder_webui_url ) {
41804203 opts . push ( {
0 commit comments