@@ -692,56 +692,6 @@ const readFolderOwnerFromRow = (row) => {
692692 }
693693 return '' ;
694694} ;
695- const isVmFolderMemberPrimaryRow = ( row ) => ! ! ( row && row . nodeType === 1 && row . matches ( 'tr.fv-vm-member-row' ) ) ;
696- const isVmFolderBoundaryRow = ( row ) => ! ! ( row && row . nodeType === 1 && ( row . matches ( 'tr.folder' ) || isVmFolderMemberPrimaryRow ( row ) ) ) ;
697- const collectVmMemberRowGroup = ( row ) => {
698- if ( ! isVmFolderMemberPrimaryRow ( row ) ) {
699- return [ ] ;
700- }
701- const group = [ row ] ;
702- let cursor = row . nextElementSibling ;
703- while ( cursor && ! isVmFolderBoundaryRow ( cursor ) ) {
704- group . push ( cursor ) ;
705- cursor = cursor . nextElementSibling ;
706- }
707- return group ;
708- } ;
709- const applyVmMemberRowGroupOwnership = ( row , folderId ) => {
710- const id = String ( folderId || '' ) . trim ( ) ;
711- if ( ! id || ! isVmFolderMemberPrimaryRow ( row ) ) {
712- return [ ] ;
713- }
714- const ownerClass = `folder-${ id } -element` ;
715- const group = collectVmMemberRowGroup ( row ) ;
716- group . forEach ( ( entry , index ) => {
717- if ( ! entry || entry . nodeType !== 1 ) {
718- return ;
719- }
720- entry . classList . add ( ownerClass ) ;
721- if ( index > 0 ) {
722- entry . classList . add ( 'fv-vm-member-detail-row' ) ;
723- }
724- } ) ;
725- return group ;
726- } ;
727- const placeVmManagedDetailRowsAfterOwner = ( ownerRow , detailRows , folderId ) => {
728- if ( ! isVmFolderMemberPrimaryRow ( ownerRow ) ) {
729- return ;
730- }
731- const id = String ( folderId || readFolderOwnerFromRow ( ownerRow ) || '' ) . trim ( ) ;
732- if ( ! id ) {
733- return ;
734- }
735- let insertAfter = collectVmMemberRowGroup ( ownerRow ) . slice ( - 1 ) [ 0 ] || ownerRow ;
736- for ( const detailRow of detailRows ) {
737- if ( ! detailRow || detailRow . nodeType !== 1 || isVmFolderBoundaryRow ( detailRow ) ) {
738- continue ;
739- }
740- detailRow . classList . add ( `folder-${ id } -element` , 'fv-vm-member-detail-row' ) ;
741- $ ( insertAfter ) . after ( detailRow ) ;
742- insertAfter = detailRow ;
743- }
744- } ;
745695const getFocusedFolderVisibleSet = ( folderId ) => {
746696 const id = String ( folderId || '' ) . trim ( ) ;
747697 if ( ! id || ! globalFolders [ id ] ) {
@@ -1158,73 +1108,6 @@ const hideVmRuntimeLoadingRow = () => {
11581108 $ ( 'tbody#kvm_list tr.fv-runtime-loading-row' ) . remove ( ) ;
11591109} ;
11601110
1161- const rememberPendingVmDetailOwner = ( row ) => {
1162- if ( ! isVmFolderMemberPrimaryRow ( row ) ) {
1163- vmPendingExpandedDetailOwner = null ;
1164- return ;
1165- }
1166- vmPendingExpandedDetailOwner = {
1167- row,
1168- folderId : readFolderOwnerFromRow ( row ) ,
1169- expiresAt : Date . now ( ) + 1500
1170- } ;
1171- } ;
1172-
1173- const readPendingVmDetailOwner = ( ) => {
1174- if ( ! vmPendingExpandedDetailOwner ) {
1175- return null ;
1176- }
1177- if ( vmPendingExpandedDetailOwner . expiresAt < Date . now ( ) ) {
1178- vmPendingExpandedDetailOwner = null ;
1179- return null ;
1180- }
1181- const row = vmPendingExpandedDetailOwner . row ;
1182- if ( ! isVmFolderMemberPrimaryRow ( row ) || ! document . body . contains ( row ) ) {
1183- vmPendingExpandedDetailOwner = null ;
1184- return null ;
1185- }
1186- return vmPendingExpandedDetailOwner ;
1187- } ;
1188-
1189- const ensureVmFolderDetailObserver = ( ) => {
1190- if ( vmFolderDetailObserver || typeof MutationObserver !== 'function' ) {
1191- return ;
1192- }
1193- const tbody = document . querySelector ( 'tbody#kvm_list' ) ;
1194- if ( ! tbody ) {
1195- return ;
1196- }
1197- $ ( tbody )
1198- . off ( 'click.fvVmMemberDetailOwner' )
1199- . on ( 'click.fvVmMemberDetailOwner' , 'tr.fv-vm-member-row td.vm-name, tr.fv-vm-member-row td.vm-name a, tr.fv-vm-member-row td.vm-name button, tr.fv-vm-member-row td.vm-name span' , function ( ) {
1200- rememberPendingVmDetailOwner ( this . closest ( 'tr' ) ) ;
1201- } ) ;
1202- vmFolderDetailObserver = new MutationObserver ( ( mutations ) => {
1203- const pendingOwner = readPendingVmDetailOwner ( ) ;
1204- if ( ! pendingOwner || ! pendingOwner . folderId ) {
1205- return ;
1206- }
1207- const addedRows = [ ] ;
1208- for ( const mutation of mutations ) {
1209- for ( const node of mutation . addedNodes || [ ] ) {
1210- if ( ! node || node . nodeType !== 1 || node . tagName !== 'TR' ) {
1211- continue ;
1212- }
1213- if ( isVmFolderBoundaryRow ( node ) || readFolderOwnerFromRow ( node ) ) {
1214- continue ;
1215- }
1216- addedRows . push ( node ) ;
1217- }
1218- }
1219- if ( ! addedRows . length ) {
1220- return ;
1221- }
1222- placeVmManagedDetailRowsAfterOwner ( pendingOwner . row , addedRows , pendingOwner . folderId ) ;
1223- vmPendingExpandedDetailOwner = null ;
1224- } ) ;
1225- vmFolderDetailObserver . observe ( tbody , { childList : true } ) ;
1226- } ;
1227-
12281111let createFoldersInFlight = false ;
12291112let createFoldersQueued = false ;
12301113
@@ -1236,7 +1119,6 @@ const createFolders = async () => {
12361119 showVmRuntimeLoadingRow ( ) ;
12371120 setVmFatalBannerPhase ( 'bootstrap-data' ) ;
12381121 try {
1239- ensureVmFolderDetailObserver ( ) ;
12401122 ensureVmExpandedStateLifecycleHooks ( ) ;
12411123 markVmFatalBannerStep ( 'VM runtime lifecycle hooks ready' ) ;
12421124 persistVmExpandedStateFromDom ( ) ;
@@ -1682,9 +1564,7 @@ const createFolder = (folder, id, position, order, vmInfo, foldersDone, matchCac
16821564 let $vmTR = $ ( '#kvm_list > tr.sortable' ) . filter ( function ( ) {
16831565 return $ ( this ) . find ( 'td.vm-name span.outer span.inner a' ) . first ( ) . text ( ) . trim ( ) === container ;
16841566 } ) . first ( ) ;
1685- $vmTR . addClass ( 'fv-vm-member-row' ) . addClass ( `folder-${ id } -element` ) . addClass ( 'folder-element' ) . removeClass ( 'sortable' ) ;
1686- const vmRowGroup = applyVmMemberRowGroupOwnership ( $vmTR . get ( 0 ) , id ) ;
1687- $ ( `tr.folder-id-${ id } div.folder-storage` ) . append ( vmRowGroup . length ? $ ( vmRowGroup ) : $vmTR ) ;
1567+ $ ( `tr.folder-id-${ id } div.folder-storage` ) . append ( $vmTR . addClass ( `folder-${ id } -element` ) . addClass ( `folder-element` ) . removeClass ( 'sortable' ) ) ;
16881568
16891569 if ( folderDebugMode ) {
16901570 vmDebugLog ( `${ newFolder [ container ] . id } (${ offsetIndex } , ${ index } ) => ${ id } ` ) ;
@@ -2816,8 +2696,6 @@ let folderDebugMode = false;
28162696let folderDebugModeWindow = [ ] ;
28172697let folderReq = [ ] ;
28182698let folderTypePrefs = utils . normalizePrefs ( { } ) ;
2819- let vmPendingExpandedDetailOwner = null ;
2820- let vmFolderDetailObserver = null ;
28212699let liveRefreshTimer = null ;
28222700let liveRefreshMs = 0 ;
28232701let liveRefreshInFlight = false ;
0 commit comments