from fasthtml.components import Div from myutils.ProxyObject import ProxyObject from myfasthtml.core.instances import MultipleInstance class Properties(MultipleInstance): def __init__(self, parent, obj=None, groups: dict = None, _id=None): super().__init__(parent, _id=_id) self.obj = obj self.groups = groups self.properties_by_group = self._create_properties_by_group() def set_obj(self, obj, groups: dict = None): self.obj = obj self.groups = groups self.properties_by_group = self._create_properties_by_group() def _mk_group_content(self, properties: dict): return Div( *[ Div( Div(k, cls="mf-properties-key", data_tooltip=f"{k}"), self._mk_property_value(v), cls="mf-properties-row" ) for k, v in properties.items() ], cls="mf-properties-group-content" ) def _mk_property_value(self, value): if isinstance(value, dict): return self._mk_group_content(value) if isinstance(value, (list, tuple)): return self._mk_group_content({i: item for i, item in enumerate(value)}) return Div(str(value), cls="mf-properties-value", title=str(value)) def render(self): return Div( *[ Div( Div( Div(group_name if group_name is not None else "", cls="mf-properties-group-header"), self._mk_group_content(proxy.as_dict()), cls="mf-properties-group-container" ), cls="mf-properties-group-card" ) for group_name, proxy in self.properties_by_group.items() ], id=self._id, cls="mf-properties" ) def _create_properties_by_group(self): if self.groups is None: return {None: ProxyObject(self.obj, {"*": ""})} return {k: ProxyObject(self.obj, v) for k, v in self.groups.items()} def __ft__(self): return self.render()