Merge pull request #2745 from yueguobin/feat/link-show-filters-icon

feat: add show_filters_icon property to Link for controlling Web UI filter icon display
This commit is contained in:
Jeremy Grossmann 2026-05-24 22:05:04 +08:00 committed by GitHub
commit 279ea9eed3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 33 additions and 0 deletions

View File

@ -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()

View File

@ -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 getattr(self, '_show_filters_icon', True)
@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": getattr(self, '_show_filters_icon', True),
}
return {
"nodes": res,
@ -569,4 +589,5 @@ class Link:
"suspend": self._suspended,
"link_style": self._link_style,
"wireshark": self._wireshark,
"show_filters_icon": getattr(self, '_show_filters_icon', True),
}

View File

@ -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"])

View File

@ -62,6 +62,10 @@ class LinkBase(BaseModel):
suspend: Optional[bool] = None
link_style: Optional[LinkStyle] = None
filters: Optional[dict] = None
show_filters_icon: Optional[bool] = Field(
True,
description="Show filters icon in Web UI"
)
class LinkCreate(LinkBase):

View File

@ -221,6 +221,7 @@ async def test_json(project, compute):
}
],
"filters": {},
"show_filters_icon": True,
"link_style": {},
"suspend": False,
'wireshark': False,
@ -254,6 +255,7 @@ async def test_json(project, compute):
],
"link_style": {},
"filters": {},
"show_filters_icon": True,
"suspend": False
}