choice_element.py 1.1 KB

1234567891011121314151617181920212223242526272829
  1. from typing import Any, Callable, Dict, List, Literal, Optional, Union
  2. import justpy as jp
  3. from .value_element import ValueElement
  4. class ChoiceElement(ValueElement):
  5. def __init__(self, view: jp.HTMLBaseComponent, options: Union[List, Dict], *,
  6. value: Any, on_change: Optional[Callable] = None) -> None:
  7. self.values = options if isinstance(options, list) else list(options.keys())
  8. self.labels = options if isinstance(options, list) else list(options.values())
  9. view.options = [{'value': index, 'label': option} for index, option in enumerate(self.labels)]
  10. super().__init__(view, value=value, on_change=on_change)
  11. def value_to_view(self, value: Any):
  12. try:
  13. return self.values.index(value)
  14. except ValueError:
  15. return value
  16. def handle_change(self, msg: Dict) -> Literal[False]:
  17. index = msg['value']['value'] if isinstance(msg['value'], dict) else msg['value']
  18. msg['index'] = index
  19. msg['label'] = self.labels[index]
  20. msg['value'] = self.values[index]
  21. return super().handle_change(msg)