Skip to content

Commit 5e5d1d6

Browse files
author
FolderView Plus Test
committed
Revert VM detail-row regrouping and restore rules workspace binding
1 parent ea1c720 commit 5e5d1d6

3 files changed

Lines changed: 2 additions & 137 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4044,6 +4044,7 @@ const downloadSelectedActiveRecoveryBackup = (...args) => getSettingsWorkspacesA
40444044
const deleteSelectedActiveRecoveryBackup = (...args) => getSettingsWorkspacesApi().deleteSelectedActiveRecoveryBackup(...args);
40454045
const runActiveRecoveryScheduler = (...args) => getSettingsWorkspacesApi().runActiveRecoveryScheduler(...args);
40464046
const compareActiveRecoverySnapshots = (...args) => getSettingsWorkspacesApi().compareActiveRecoverySnapshots(...args);
4047+
const setRulesWorkspaceType = (...args) => getSettingsWorkspacesApi().setRulesWorkspaceType(...args);
40474048
const changeActiveBackupSchedulePref = (...args) => getSettingsWorkspacesApi().changeActiveBackupSchedulePref(...args);
40484049
const undoActiveRecoveryChange = (...args) => getSettingsWorkspacesApi().undoActiveRecoveryChange(...args);
40494050
const syncRulesWorkspaceUi = (...args) => getSettingsWorkspacesApi().syncRulesWorkspaceUi(...args);
@@ -9319,4 +9320,3 @@ settingsActionSupportModule.registerWindowActions(window, {
93199320

93209321

93219322

9322-

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

Lines changed: 1 addition & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
};
745695
const 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-
12281111
let createFoldersInFlight = false;
12291112
let 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;
28162696
let folderDebugModeWindow = [];
28172697
let folderReq = [];
28182698
let folderTypePrefs = utils.normalizePrefs({});
2819-
let vmPendingExpandedDetailOwner = null;
2820-
let vmFolderDetailObserver = null;
28212699
let liveRefreshTimer = null;
28222700
let liveRefreshMs = 0;
28232701
let liveRefreshInFlight = false;

tests/vm-runtime-docker-parity-guard.test.mjs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,6 @@ test('vm runtime includes docker-parity quick state actions and branch-aware fol
2222
assert.match(vmJs, /const cloneVmFolderFromMenu = async/);
2323
});
2424

25-
test('vm runtime keeps native expanded detail rows attached to their folder-managed VM rows', () => {
26-
assert.match(vmJs, /const collectVmMemberRowGroup = \(row\) => \{/);
27-
assert.match(vmJs, /const applyVmMemberRowGroupOwnership = \(row,\s*folderId\) => \{/);
28-
assert.match(vmJs, /const placeVmManagedDetailRowsAfterOwner = \(ownerRow,\s*detailRows,\s*folderId\) => \{/);
29-
assert.match(vmJs, /let vmPendingExpandedDetailOwner = null;/);
30-
assert.match(vmJs, /let vmFolderDetailObserver = null;/);
31-
assert.match(vmJs, /const ensureVmFolderDetailObserver = \(\) => \{/);
32-
assert.match(vmJs, /rememberPendingVmDetailOwner\(this\.closest\('tr'\)\);/);
33-
assert.match(vmJs, /placeVmManagedDetailRowsAfterOwner\(pendingOwner\.row,\s*addedRows,\s*pendingOwner\.folderId\);/);
34-
assert.match(vmJs, /\$vmTR\.addClass\('fv-vm-member-row'\)/);
35-
assert.match(vmJs, /const vmRowGroup = applyVmMemberRowGroupOwnership\(\$vmTR\.get\(0\),\s*id\);/);
36-
});
37-
3825
test('vm runtime context menu keeps focus/pin/lock and clone actions in vm folder menu', () => {
3926
assert.match(vmJs, /Focus folder/);
4027
assert.match(vmJs, /Pin folder/);

0 commit comments

Comments
 (0)