Coverage for gws-app/gws/base/client/core.py: 0%

71 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1from typing import Optional 

2 

3import gws 

4 

5 

6class ElementConfig(gws.ConfigWithAccess): 

7 """GWS client UI element configuration""" 

8 

9 tag: str 

10 """element tag""" 

11 before: str = '' 

12 """insert before this tag""" 

13 after: str = '' 

14 """insert after this tag""" 

15 

16 

17class Config(gws.ConfigWithAccess): 

18 """GWS client configuration""" 

19 

20 options: Optional[dict] 

21 """client options""" 

22 elements: Optional[list[ElementConfig]] 

23 """client UI elements""" 

24 addElements: Optional[list[ElementConfig]] 

25 """add elements to the parent element list""" 

26 removeElements: Optional[list[ElementConfig]] 

27 """remove elements from the parent element list""" 

28 

29 

30class ElementProps(gws.Data): 

31 tag: str 

32 

33 

34class Props(gws.Data): 

35 options: Optional[dict] 

36 elements: Optional[list[ElementProps]] 

37 

38 

39class Element(gws.Node): 

40 tag: str 

41 after: str 

42 before: str 

43 

44 def configure(self): 

45 self.tag = self.cfg('tag') 

46 self.after = self.cfg('after') 

47 self.before = self.cfg('before') 

48 

49 def props(self, user): 

50 return gws.Data(tag=self.tag) 

51 

52 

53class Object(gws.Client): 

54 options: dict 

55 elements: list[Element] 

56 

57 def configure(self): 

58 app_client = gws.u.get(self.root.app, 'client') 

59 

60 self.elements = self.create_children(Element, self._get_elements(app_client)) 

61 

62 self.options = gws.u.merge( 

63 app_client.options if app_client else {}, 

64 self.cfg('options')) 

65 

66 def props(self, user): 

67 return Props( 

68 options=self.options, 

69 elements=self.elements, 

70 ) 

71 

72 def _get_elements(self, app_client): 

73 elements = self.cfg('elements') 

74 if elements: 

75 return elements 

76 

77 if not app_client: 

78 return [] 

79 

80 add = self.cfg('addElements', default=[]) 

81 remove = self.cfg('removeElements', default=[]) 

82 elements = list(app_client.elements) 

83 

84 for c in add: 

85 n = self._find_element(elements, c.tag) 

86 if n >= 0: 

87 elements.pop(n) 

88 if c.before: 

89 n = self._find_element(elements, c.before) 

90 if n >= 0: 

91 elements.insert(n, c) 

92 elif c.after: 

93 n = self._find_element(elements, c.after) 

94 if n >= 0: 

95 elements.insert(n + 1, c) 

96 else: 

97 elements.append(c) 

98 

99 remove_tags = [c.tag for c in remove] 

100 return [e for e in elements if e.tag not in remove_tags] 

101 

102 def _find_element(self, elements, tag): 

103 for n, el in enumerate(elements): 

104 if el.tag == tag: 

105 return n 

106 return -1