From b81e913227bd78b1984c258388322e6fe1381079 Mon Sep 17 00:00:00 2001 From: AlexsandrSnytkin Date: Fri, 18 Sep 2026 21:16:25 +0700 Subject: [PATCH] fix(ui): expose reliable block deletion --- ui_server.py | 10 ++++++++++ 1 file changed, 10 insertions(+) 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();