68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
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()
|