From aa6845b32b2e765797218844c70b3dec88e704f2 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Sat, 23 May 2026 14:57:58 +0800 Subject: [PATCH] feat: add show_filters_icon property to Link for controlling Web UI filter icon display This commit adds a new `show_filters_icon` 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 `_show_filters_icon` attribute to Link class (default: True) - Added `show_filters_icon` property getter - Added `update_show_filters_icon()` method for updating the property - Updated `asdict()` to include the new field in both topology and regular dumps - Added `show_filters_icon` field to LinkBase schema - Updated API routes to handle the new field in create and update operations **API Impact:** - POST /v3/projects/{project_id}/links - accepts `show_filters_icon` in request body - PUT /v3/projects/{project_id}/links/{link_id} - can update `show_filters_icon` - GET /v3/projects/{project_id}/links/{link_id} - returns `show_filters_icon` 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/api/routes/controller/links.py | 4 ++++ gns3server/controller/link.py | 21 +++++++++++++++++++++ gns3server/schemas/controller/links.py | 1 + 3 files changed, 26 insertions(+) diff --git a/gns3server/api/routes/controller/links.py b/gns3server/api/routes/controller/links.py index 6afa6f7cc..ce9caf450 100644 --- a/gns3server/api/routes/controller/links.py +++ b/gns3server/api/routes/controller/links.py @@ -107,6 +107,8 @@ async def create_link(project_id: UUID, link_data: schemas.LinkCreate) -> schema await link.update_link_style(link_data["link_style"]) if "suspend" in link_data: await link.update_suspend(link_data["suspend"]) + if "show_filters_icon" in link_data: + await link.update_show_filters_icon(link_data["show_filters_icon"]) try: for node in link_data["nodes"]: await link.add_node( @@ -171,6 +173,8 @@ async def update_link(link_data: schemas.LinkUpdate, link: Link = Depends(dep_li await link.update_link_style(link_data["link_style"]) if "suspend" in link_data: await link.update_suspend(link_data["suspend"]) + if "show_filters_icon" in link_data: + await link.update_show_filters_icon(link_data["show_filters_icon"]) if "nodes" in link_data: await link.update_nodes(link_data["nodes"]) return link.asdict() diff --git a/gns3server/controller/link.py b/gns3server/controller/link.py index ecd74b045..8ba8bc410 100644 --- a/gns3server/controller/link.py +++ b/gns3server/controller/link.py @@ -89,6 +89,7 @@ class Link: self._filters = {} self._link_style = {} self._wireshark = False + self._show_filters_icon = True @property def filters(self): @@ -97,6 +98,13 @@ class Link: """ return self._filters + @property + def show_filters_icon(self): + """ + Get whether to show filters icon in Web UI + """ + return self._show_filters_icon + @property def project(self): """ @@ -167,6 +175,17 @@ class Link: self._project.emit_notification("link.updated", self.asdict()) self._project.dump() + async def update_show_filters_icon(self, value): + """ + Update the show_filters_icon property. + + :param value: Boolean indicating whether to show filters icon in Web UI + """ + if value != self._show_filters_icon: + self._show_filters_icon = value + self._project.emit_notification("link.updated", self.asdict()) + self._project.dump() + async def update_link_style(self, link_style): if link_style != self._link_style: self._link_style = link_style @@ -555,6 +574,7 @@ class Link: "filters": self._filters, "link_style": self._link_style, "suspend": self._suspended, + "show_filters_icon": self._show_filters_icon, } return { "nodes": res, @@ -569,4 +589,5 @@ class Link: "suspend": self._suspended, "link_style": self._link_style, "wireshark": self._wireshark, + "show_filters_icon": self._show_filters_icon, } diff --git a/gns3server/schemas/controller/links.py b/gns3server/schemas/controller/links.py index 258696ea3..211d60f23 100644 --- a/gns3server/schemas/controller/links.py +++ b/gns3server/schemas/controller/links.py @@ -62,6 +62,7 @@ class LinkBase(BaseModel): suspend: Optional[bool] = None link_style: Optional[LinkStyle] = None filters: Optional[dict] = None + show_filters_icon: Optional[bool] = None class LinkCreate(LinkBase):