diff --git a/ui_server.py b/ui_server.py
index 125b503..9c5c2db 100644
--- a/ui_server.py
+++ b/ui_server.py
@@ -1601,6 +1601,7 @@ HTML = """
Блоки конфигурации
+
Ctrl/Cmd + клик — выбрать несколько · перетаскивайте группу
@@ -1826,6 +1827,7 @@ HTML = """
Блоки сети
+
Ctrl/Cmd + клик — выбрать несколько · перетаскивайте группу
@@ -2145,8 +2147,10 @@ HTML = """
configBlocks.forEach(other => other.classList.toggle('is-selected', selectedConfigBlocks.has(other)));
$('configRestorePanel')?.querySelectorAll('.config-restore-item').forEach(item => item.classList.toggle('is-selected', selectedConfigBlocks.has(item._configBlock)));
const control = $('configContentScale');
+ const remove = $('configDeleteSelected');
if (!selectedConfigBlock) {
if (control) control.disabled = true;
+ if (remove) remove.disabled = true;
return;
}
const entry = configLayout[selectedConfigBlock.dataset.section] || {};
@@ -2155,6 +2159,7 @@ HTML = """
setValue('configContentScale', value);
setText('configContentScaleValue', `${value}%`);
if (control) control.disabled = selectedConfigBlocks.size !== 1;
+ if (remove) remove.disabled = !selectedConfigBlocks.size;
updateConfigBlockScale(selectedConfigBlock);
if (selectedConfigBlocks.size > 1) setText('configLayoutState', `выбрано ${selectedConfigBlocks.size} блока · перетаскивайте группу`);
}
@@ -2749,6 +2754,7 @@ HTML = """
renderConfigRestorePanel();
selectConfigBlock(configBlocks.find(block => !configBlockState(block)) || null);
$('configResetLayout')?.addEventListener('click', resetConfigLayout);
+ $('configDeleteSelected')?.addEventListener('click', deleteSelectedConfigBlocks);
$('configRestoreToggle')?.addEventListener('click', () => {
restorePanelOpen = !restorePanelOpen;
renderConfigRestorePanel();
@@ -2846,8 +2852,10 @@ HTML = """
networkBlocks.forEach(item => item.classList.toggle('is-selected', selectedNetworkBlocks.has(item)));
$('networkRestorePanel')?.querySelectorAll('.config-restore-item').forEach(item => item.classList.toggle('is-selected', selectedNetworkBlocks.has(item._networkBlock)));
const control = $('networkContentScale');
+ const remove = $('networkDeleteSelected');
if (!networkSelectedBlock) {
if (control) control.disabled = true;
+ if (remove) remove.disabled = true;
return;
}
const value = Math.max(50, Math.min(200, Math.round(Number(networkLayout[networkSelectedBlock.dataset.section]?.scale) || 100)));
@@ -2855,6 +2863,7 @@ HTML = """
setValue('networkContentScale', value);
setText('networkContentScaleValue', `${value}%`);
if (control) control.disabled = selectedNetworkBlocks.size !== 1;
+ if (remove) remove.disabled = !selectedNetworkBlocks.size;
updateNetworkBlockScale(networkSelectedBlock);
if (selectedNetworkBlocks.size > 1) setText('networkLayoutState', `выбрано ${selectedNetworkBlocks.size} блока · перетаскивайте группу`);
}
@@ -3303,6 +3312,7 @@ HTML = """
renderNetworkStructure();
selectNetworkBlock(networkBlocks.find(block => !networkState(block)) || null);
$('networkResetLayout')?.addEventListener('click', resetNetworkLayout);
+ $('networkDeleteSelected')?.addEventListener('click', deleteSelectedNetworkBlocks);
$('networkStructureToggle')?.addEventListener('click', () => {
networkStructureOpen = !networkStructureOpen;
renderNetworkStructure();