From a1f49427462a1675c901252461f89dfa3d6d1ce8 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Sat, 23 May 2026 16:57:39 +0800 Subject: [PATCH] feat: add show_filters_icon property to Link for controlling Web UI filter icon display This commit adds a new property to the Link class, allowing users to control whether filter icons are displayed in the Web UI at the individual link level. **Changes:** - Added attribute to Link class (default: True) - Added property getter - Added method for updating the property - Updated to include the new field with backward compatibility - Added field to LinkBase schema using Optional[bool] = Field(True, ...) pattern - Updated API routes to handle the new field in create and update operations - Added loading logic for show_filters_icon in project.open() to preserve settings when reopening projects **Schema Definition:** Uses the same pattern as the field: **API Impact:** - POST /v3/projects/{project_id}/links - accepts in request body - PUT /v3/projects/{project_id}/links/{link_id} - can update - GET /v3/projects/{project_id}/links/{link_id} - returns field **Future Applications:** This feature provides granular control for future AI fault injection modules to manage link-level protocol failures while maintaining clean UI presentation. --- gns3server/controller/link.py | 4 ++-- gns3server/controller/project.py | 2 ++ gns3server/schemas/controller/links.py | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/gns3server/controller/link.py b/gns3server/controller/link.py index 8ba8bc410..fe8d67e25 100644 --- a/gns3server/controller/link.py +++ b/gns3server/controller/link.py @@ -574,7 +574,7 @@ class Link: "filters": self._filters, "link_style": self._link_style, "suspend": self._suspended, - "show_filters_icon": self._show_filters_icon, + "show_filters_icon": getattr(self, '_show_filters_icon', True), } return { "nodes": res, @@ -589,5 +589,5 @@ class Link: "suspend": self._suspended, "link_style": self._link_style, "wireshark": self._wireshark, - "show_filters_icon": self._show_filters_icon, + "show_filters_icon": getattr(self, '_show_filters_icon', True), } diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index e0a38838c..d9c30a703 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -1208,6 +1208,8 @@ class Project: await link.update_filters(link_data["filters"]) if "link_style" in link_data: await link.update_link_style(link_data["link_style"]) + if "show_filters_icon" in link_data: + await link.update_show_filters_icon(link_data["show_filters_icon"]) for node_link in link_data.get("nodes", []): node = self.get_node(node_link["node_id"]) port = node.get_port(node_link["adapter_number"], node_link["port_number"]) diff --git a/gns3server/schemas/controller/links.py b/gns3server/schemas/controller/links.py index 6865e2462..be6846bb8 100644 --- a/gns3server/schemas/controller/links.py +++ b/gns3server/schemas/controller/links.py @@ -62,7 +62,10 @@ class LinkBase(BaseModel): suspend: Optional[bool] = None link_style: Optional[LinkStyle] = None filters: Optional[dict] = None - show_filters_icon: Optional[bool] = Field(default=True, description="Show filters icon in Web UI") + show_filters_icon: Optional[bool] = Field( + True, + description="Show filters icon in Web UI" + ) class LinkCreate(LinkBase):