Spaces:
Sleeping
Sleeping
| /** | |
| * Path-finder: tap empty Cytoscape canvas → clear path-focus-store (no dimmed backdrop). | |
| */ | |
| (function () { | |
| function isLiveCy(cy) { | |
| return cy && typeof cy.destroyed === "function" && !cy.destroyed(); | |
| } | |
| function cyOf(el) { | |
| if (!el) return null; | |
| if (isLiveCy(el._cytoscape)) return el._cytoscape; | |
| // cytoscape.js registers the live instance on its container as _cyreg.cy | |
| if (el._cyreg && isLiveCy(el._cyreg.cy)) return el._cyreg.cy; | |
| return null; | |
| } | |
| function findCy(host) { | |
| if (!host) return null; | |
| let cy = cyOf(host); | |
| if (cy) return cy; | |
| for (const el of host.querySelectorAll("div")) { | |
| cy = cyOf(el); | |
| if (cy) return cy; | |
| } | |
| return null; | |
| } | |
| function clearPathFocus() { | |
| if ( | |
| window.dash_clientside && | |
| typeof window.dash_clientside.set_props === "function" | |
| ) { | |
| window.dash_clientside.set_props("path-focus-store", { data: null }); | |
| return; | |
| } | |
| const btn = document.getElementById("path-clear-highlight-btn"); | |
| if (btn) btn.click(); | |
| } | |
| function wireGraph(host) { | |
| const cy = findCy(host); | |
| if (!cy) return false; | |
| if (host.__pathFocusCy === cy) return true; | |
| host.__pathFocusCy = cy; | |
| cy.on("tap", (evt) => { | |
| if (evt.target !== cy) return; | |
| cy.$(":selected").unselect(); | |
| clearPathFocus(); | |
| }); | |
| return true; | |
| } | |
| function boot() { | |
| const host = document.getElementById("graph"); | |
| if (!host) return; | |
| if (!wireGraph(host)) { | |
| host.__pathFocusCy = null; | |
| } | |
| } | |
| if (document.readyState === "loading") { | |
| document.addEventListener("DOMContentLoaded", boot); | |
| } else { | |
| boot(); | |
| } | |
| setInterval(boot, 800); | |
| })(); | |