From 53227c9e1a9ddaf3a5cc444d071afe5d6e09b8d4 Mon Sep 17 00:00:00 2001 From: Rayko <71210053+Raykosan@users.noreply.github.com> Date: Mon, 14 Sep 2026 21:00:11 +0300 Subject: [PATCH] Update rs_bypass.js --- web/rs_bypass.js | 81 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/web/rs_bypass.js b/web/rs_bypass.js index b0f6e8d..0b3bb01 100644 --- a/web/rs_bypass.js +++ b/web/rs_bypass.js @@ -298,6 +298,21 @@ app.registerExtension({ } }); + const beforeCovered = self.data.bypassedNodes.length; + self.data.bypassedNodes = self.data.bypassedNodes.filter(item => { + const node = nodes.find(n => n.id === item.id); + if (!node) return true; + const coveredByGroup = self.data.bypassedGroups.some(gItem => { + if (!gItem.enabled) return false; + const group = groups.find(g => g.id === gItem.id); + if (!group || !isNodeInGroup(node, group)) return false; + const groupNodes = nodes.filter(nn => nn.comfyClass !== "RS_Bypass" && isNodeInGroup(nn, group)); + return groupNodes.length > 0 && groupNodes.every(nn => nn.mode === 4); + }); + return !coveredByGroup; + }); + if (self.data.bypassedNodes.length !== beforeCovered) changed = true; + groups.forEach(group => { if (!group || (!group.bounding && !group._bounding)) return; const groupNodes = nodes.filter(n => n.comfyClass !== "RS_Bypass" && isNodeInGroup(n, group)); @@ -313,13 +328,12 @@ app.registerExtension({ nodes.forEach(n => { if (n.comfyClass === "RS_Bypass") return; - - // Ищем группу из кэша, в которую входит нода (если есть) + const groupEntry = self.data.bypassedGroups.find(gItem => { const group = groups.find(g => g.id === gItem.id); return group && isNodeInGroup(n, group); }); - + if (n.mode === 4) { const managedByBypassedGroup = self.data.bypassedGroups.some(gItem => { if (!gItem.enabled) return false; @@ -328,9 +342,9 @@ app.registerExtension({ const groupNodes = nodes.filter(nn => nn.comfyClass !== "RS_Bypass" && isNodeInGroup(nn, group)); return groupNodes.length > 0 && groupNodes.every(nn => nn.mode === 4); }); - + if (managedByBypassedGroup) return; - + if (!self.data.bypassedNodes.some(item => item.id === n.id)) { self.data.bypassedNodes.push({ id: n.id, enabled: true }); changed = true; @@ -342,14 +356,11 @@ app.registerExtension({ } } } else if (n.mode === 0 && groupEntry && !groupEntry.enabled) { - // Нода выключена, но её группа из кэша в статусе partial. - // Считаем её отслеживаемой: добавляем с enabled=false. - // Отсекаем случай «группа выключена целиком» — там нет ни одной забайпашенной соседки. const group = groups.find(g => g.id === groupEntry.id); if (!group) return; const groupNodes = nodes.filter(nn => nn.comfyClass !== "RS_Bypass" && isNodeInGroup(nn, group)); const hasBypassedSibling = groupNodes.some(nn => nn.mode === 4); - + if (hasBypassedSibling && !self.data.bypassedNodes.some(item => item.id === n.id)) { self.data.bypassedNodes.push({ id: n.id, enabled: false }); changed = true; @@ -411,24 +422,24 @@ app.registerExtension({ title: "📁 " + (group.title || "Group"), state: state }); - - if (state === "partial" || state === "none") { - // Собираем только «свои» ноды этой группы + + if (state === "partial") { const childItems = []; self.data.bypassedNodes.forEach(nItem => { const targetNode = nodes.find(n => n.id === nItem.id); if (!targetNode) return; if (!isNodeInGroup(targetNode, group)) return; if (nodesPlacedInGroups.has(targetNode.id)) return; + if (nItem.enabled) return; childItems.push({ node: targetNode, entry: nItem }); }); - + childItems.forEach((child, ci) => { displayItems.push({ type: "node", id: child.node.id, title: " ️ " + (child.node.title || child.node.type), - state: child.entry.enabled ? "all" : "none", + state: "none", isChild: true, isLastChild: ci === childItems.length - 1 }); @@ -437,26 +448,23 @@ app.registerExtension({ } }); - // Остальные ноды — standalone или чья группа не в кэше self.data.bypassedNodes.forEach(item => { const targetNode = nodes.find(n => n.id === item.id); if (!targetNode) return; if (nodesPlacedInGroups.has(targetNode.id)) return; - - const coveredByEnabledGroup = self.data.bypassedGroups.some(gItem => { - if (!gItem.enabled) return false; + + const belongsToCachedGroup = self.data.bypassedGroups.some(gItem => { const group = groups.find(g => g.id === gItem.id); return group && isNodeInGroup(targetNode, group); }); - - if (!coveredByEnabledGroup) { - displayItems.push({ - type: "node", - id: targetNode.id, - title: "️ " + (targetNode.title || targetNode.type), - state: item.enabled ? "all" : "none" - }); - } + if (belongsToCachedGroup) return; + + displayItems.push({ + type: "node", + id: targetNode.id, + title: " ️ " + (targetNode.title || targetNode.type), + state: item.enabled ? "all" : "none" + }); }); if (displayItems.length > 0) { @@ -574,9 +582,8 @@ app.registerExtension({ const title = group.title || "Group " + group.id; if (query && !title.toLowerCase().includes(query)) return; - const cachedGroup = self.data.bypassedGroups.find(item => item.id === group.id); const isExpanded = self.data.expandedGroups[group.id] || false; - + const bypassedCount = groupNodes.filter(n => n.mode === 4).length; let groupColor = "#ddd"; if (bypassedCount === groupNodes.length) groupColor = "#ff4444"; @@ -630,21 +637,18 @@ app.registerExtension({ groupNodes.forEach(n => { const nodeTitle = n.title || n.type; if (query && !nodeTitle.toLowerCase().includes(query)) return; - - const cachedNode = self.data.bypassedNodes.find(item => item.id === n.id); - // Если персональной записи нет — считаем состояние по реальному mode (может быть забайпашено через родительскую группу) - const isNodeBypassed = cachedNode ? cachedNode.enabled : (n.mode === 4); + + const isNodeBypassed = n.mode === 4; const nodeColor = isNodeBypassed ? "#ff4444" : "#ddd"; - + const nodeItem = document.createElement("div"); - nodeItem.textContent = "️ " + nodeTitle; + nodeItem.textContent = " ️ " + nodeTitle; nodeItem.style.cssText = "padding:10px 12px 10px 32px;cursor:pointer;color:" + nodeColor + ";border-bottom:1px solid #333;font-size:12px;transition:background-color 0.15s;"; nodeItem.onmouseover = () => nodeItem.style.background = "#333"; nodeItem.onmouseout = () => nodeItem.style.background = "#1a1a1a"; nodeItem.onclick = (ev) => { ev.stopPropagation(); let entry = self.data.bypassedNodes.find(item => item.id === n.id); - // Текущее состояние — либо из личной записи, либо из реального mode const currentlyBypassed = entry ? entry.enabled : (n.mode === 4); const newState = !currentlyBypassed; if (entry) { @@ -669,8 +673,7 @@ app.registerExtension({ const title = n.title || n.type; if (query && !title.toLowerCase().includes(query)) return; - const cachedNode = self.data.bypassedNodes.find(item => item.id === n.id); - const isBypassed = cachedNode ? cachedNode.enabled : false; + const isBypassed = n.mode === 4; const nodeColor = isBypassed ? "#ff4444" : "#ddd"; const item = document.createElement("div"); @@ -1036,4 +1039,4 @@ app.registerExtension({ }; } } -}); \ No newline at end of file +});