Coverage for src / lexigram / admin / actions / row_manager / groups.py: 0%

35 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-11 02:25 +0800

1""" 

2Action group management for row actions. 

3 

4Handles grouping of related actions in dropdown menus. 

5""" 

6 

7from __future__ import annotations 

8 

9from collections.abc import Callable 

10from typing import Any 

11 

12from lexigram.admin.actions.row_manager.types import ActionGroup, ActionStyle, RowAction 

13 

14 

15class ActionGroupManager: 

16 """Manages action groups and their visibility.""" 

17 

18 def __init__(self) -> None: 

19 """Initialize the action group manager.""" 

20 self._groups: dict[str, ActionGroup] = {} 

21 

22 def add_group(self, group: ActionGroup) -> None: 

23 """Add an action group.""" 

24 self._groups[group.name] = group 

25 

26 def get_group(self, name: str) -> ActionGroup | None: 

27 """Get an action group by name.""" 

28 return self._groups.get(name) 

29 

30 def get_all_groups(self) -> list[ActionGroup]: 

31 """Get all action groups.""" 

32 return list(self._groups.values()) 

33 

34 def get_visible_groups(self, record: Any) -> list[ActionGroup]: 

35 """Get visible action groups for a record.""" 

36 groups = [] 

37 

38 for group in self._groups.values(): 

39 # Check group visibility 

40 if not group.visible(record): 

41 continue 

42 

43 # Filter visible actions in group 

44 visible_actions = [ 

45 action for action in group.actions if action.visible(record) 

46 ] 

47 

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) 

59 

60 return groups 

61 

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: 

73 

74 def visible(record) -> Any: 

75 return True 

76 

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 

87 

88 def remove_group(self, name: str) -> None: 

89 """Remove an action group.""" 

90 if name in self._groups: 

91 del self._groups[name] 

92 

93 def clear_groups(self) -> None: 

94 """Clear all action groups.""" 

95 self._groups.clear()