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
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1from typing import Optional
3import gws
6class ElementConfig(gws.ConfigWithAccess):
7 """GWS client UI element configuration"""
9 tag: str
10 """element tag"""
11 before: str = ''
12 """insert before this tag"""
13 after: str = ''
14 """insert after this tag"""
17class Config(gws.ConfigWithAccess):
18 """GWS client configuration"""
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"""
30class ElementProps(gws.Data):
31 tag: str
34class Props(gws.Data):
35 options: Optional[dict]
36 elements: Optional[list[ElementProps]]
39class Element(gws.Node):
40 tag: str
41 after: str
42 before: str
44 def configure(self):
45 self.tag = self.cfg('tag')
46 self.after = self.cfg('after')
47 self.before = self.cfg('before')
49 def props(self, user):
50 return gws.Data(tag=self.tag)
53class Object(gws.Client):
54 options: dict
55 elements: list[Element]
57 def configure(self):
58 app_client = gws.u.get(self.root.app, 'client')
60 self.elements = self.create_children(Element, self._get_elements(app_client))
62 self.options = gws.u.merge(
63 app_client.options if app_client else {},
64 self.cfg('options'))
66 def props(self, user):
67 return Props(
68 options=self.options,
69 elements=self.elements,
70 )
72 def _get_elements(self, app_client):
73 elements = self.cfg('elements')
74 if elements:
75 return elements
77 if not app_client:
78 return []
80 add = self.cfg('addElements', default=[])
81 remove = self.cfg('removeElements', default=[])
82 elements = list(app_client.elements)
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)
99 remove_tags = [c.tag for c in remove]
100 return [e for e in elements if e.tag not in remove_tags]
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