Coverage for src/lexigram/admin/actions/row_manager/groups.py: 86%
35 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
1"""
2Action group management for row actions.
4Handles grouping of related actions in dropdown menus.
5"""
7from __future__ import annotations
9from collections.abc import Callable
10from typing import Any
12from lexigram.admin.actions.row_manager.types import ActionGroup, ActionStyle, RowAction
15class ActionGroupManager:
16 """Manages action groups and their visibility."""
18 def __init__(self) -> None:
19 """Initialize the action group manager."""
20 self._groups: dict[str, ActionGroup] = {}
22 def add_group(self, group: ActionGroup) -> None:
23 """Add an action group."""
24 self._groups[group.name] = group
26 def get_group(self, name: str) -> ActionGroup | None:
27 """Get an action group by name."""
28 return self._groups.get(name)
30 def get_all_groups(self) -> list[ActionGroup]:
31 """Get all action groups."""
32 return list(self._groups.values())
34 def get_visible_groups(self, record: Any) -> list[ActionGroup]:
35 """Get visible action groups for a record."""
36 groups = []
38 for group in self._groups.values():
39 # Check group visibility
40 if not group.visible(record):
41 continue
43 # Filter visible actions in group
44 visible_actions = [
45 action for action in group.actions if action.visible(record)
46 ]
48 if visible_actions:
49 # Create filtered group
50 filtered_group = ActionGroup(
51 name=group.name,
52 label=group.label,
53 icon=group.icon,
54 actions=visible_actions,
55 style=group.style,
56 visible=group.visible,
57 )
58 groups.append(filtered_group)
60 return groups
62 def create_group(
63 self,
64 name: str,
65 label: str,
66 actions: list[RowAction],
67 icon: str | None = "menu",
68 style: ActionStyle = ActionStyle.SECONDARY,
69 visible: Callable[[Any], bool] | None = None,
70 ) -> ActionGroup:
71 """Create a new action group."""
72 if visible is None:
74 def visible(record) -> Any:
75 return True
77 group = ActionGroup(
78 name=name,
79 label=label,
80 actions=actions,
81 icon=icon,
82 style=style,
83 visible=visible,
84 )
85 self.add_group(group)
86 return group
88 def remove_group(self, name: str) -> None:
89 """Remove an action group."""
90 if name in self._groups:
91 del self._groups[name]
93 def clear_groups(self) -> None:
94 """Clear all action groups."""
95 self._groups.clear()