57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
import logging
|
|
|
|
from fasthtml.components import *
|
|
|
|
from components.BaseComponent import BaseComponentMultipleInstance
|
|
from components.entryselector.commands import EntrySelectorCommandManager
|
|
|
|
logger = logging.getLogger("EntrySelector")
|
|
|
|
|
|
class EntrySelector(BaseComponentMultipleInstance):
|
|
def __init__(self, session, _id, owner, data=None, hooks=None, key=None, boundaries=None):
|
|
super().__init__(session, _id)
|
|
self._key = key
|
|
self._owner = owner # debugger component
|
|
self.data = data
|
|
self.selected = None
|
|
self.hooks = hooks
|
|
self._boundaries = boundaries if boundaries else {"width": "300"}
|
|
self._commands = EntrySelectorCommandManager(self)
|
|
|
|
def set_data(self, data):
|
|
self.data = data
|
|
|
|
def set_selected(self, selected):
|
|
if selected is None:
|
|
self.selected = None
|
|
else:
|
|
self.selected = int(selected)
|
|
|
|
def set_boundaries(self, boundaries):
|
|
self._boundaries = boundaries
|
|
|
|
def select_entry(self, entry):
|
|
logger.debug(f"Selecting entry {entry}")
|
|
self.set_selected(entry)
|
|
if self.hooks is not None and (on_entry_selected := self.hooks.get("on_entry_selected", None)) is not None:
|
|
return on_entry_selected(entry)
|
|
else:
|
|
return None
|
|
|
|
def _mk_content(self):
|
|
if not self.data:
|
|
return [Div("no entry")]
|
|
|
|
return [Div(index,
|
|
**self._commands.select_entry(index),
|
|
cls=f"es-entry {'es-entry-selected' if index == self.selected else ''}")
|
|
for index in range(self.data)]
|
|
|
|
def __ft__(self):
|
|
return Div(
|
|
*self._mk_content(),
|
|
cls="flex es-container",
|
|
id=f"{self._id}",
|
|
)
|