from myfasthtml.controls.Panel import Panel from myfasthtml.controls.Properties import Properties from myfasthtml.controls.VisNetwork import VisNetwork from myfasthtml.core.commands import Command from myfasthtml.core.instances import SingleInstance, InstancesManager from myfasthtml.core.network_utils import from_parent_child_list class InstancesDebugger(SingleInstance): def __init__(self, parent, _id=None): super().__init__(parent, _id=_id) self._panel = Panel(self, _id="-panel") self._command = Command("ShowInstance", "Display selected Instance", self.on_network_event).htmx(target=f"#{self._panel.get_id()}_r") def render(self): nodes, edges = self._get_nodes_and_edges() vis_network = VisNetwork(self, nodes=nodes, edges=edges, _id="-vis", events_handlers={"select_node": self._command}) return self._panel.set_main(vis_network) def on_network_event(self, event_data: dict): session, instance_id = event_data["nodes"][0].split("#") properties = {"Id": "_id", "Parent Id": "_parent._id"} return self._panel.set_right(Properties(self, InstancesManager.get(session, instance_id), properties, _id="-properties")) def _get_nodes_and_edges(self): instances = self._get_instances() nodes, edges = from_parent_child_list( instances, id_getter=lambda x: x.get_full_id(), label_getter=lambda x: f"{x.get_id()}", parent_getter=lambda x: x.get_full_parent_id() ) for edge in edges: edge["color"] = "green" edge["arrows"] = {"to": {"enabled": False, "type": "circle"}} for node in nodes: node["shape"] = "box" return nodes, edges def _get_instances(self): return list(InstancesManager.instances.values()) def __ft__(self): return self.render()