query.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from pathlib import Path
  2. from typing import Optional
  3. from typing_extensions import Self
  4. from ..dependencies import register_vue_component
  5. from ..element import Element
  6. from ..globals import get_client
  7. register_vue_component(name='query', path=Path(__file__).parent.joinpath('query.js'))
  8. class Query(Element):
  9. def __init__(self, selector: str) -> None:
  10. super().__init__('query')
  11. self._props['selector'] = selector
  12. self._props['classes'] = []
  13. self._props['style'] = {}
  14. self._props['props'] = {}
  15. self.use_component('query')
  16. def classes(self, add: Optional[str] = None, *, remove: Optional[str] = None, replace: Optional[str] = None) \
  17. -> Self:
  18. classes = self._update_classes_list(self._props['classes'], add, remove, replace)
  19. new_classes = [c for c in classes if c not in self._props['classes']]
  20. old_classes = [c for c in self._props['classes'] if c not in classes]
  21. if new_classes:
  22. self.run_method('add_classes', new_classes)
  23. if old_classes:
  24. self.run_method('remove_classes', old_classes)
  25. self._props['classes'] = classes
  26. return self
  27. def style(self, add: Optional[str] = None, *, remove: Optional[str] = None, replace: Optional[str] = None) \
  28. -> Self:
  29. old_style = Element._parse_style(remove)
  30. for key in old_style:
  31. self._props['style'].pop(key, None)
  32. if old_style:
  33. self.run_method('remove_style', list(old_style))
  34. self._props['style'].update(Element._parse_style(add))
  35. self._props['style'].update(Element._parse_style(replace))
  36. if self._props['style']:
  37. self.run_method('add_style', self._props['style'])
  38. return self
  39. def props(self, add: Optional[str] = None, *, remove: Optional[str] = None) -> Self:
  40. old_props = self._parse_props(remove)
  41. for key in old_props:
  42. self._props['props'].pop(key, None)
  43. if old_props:
  44. self.run_method('remove_props', list(old_props))
  45. new_props = self._parse_props(add)
  46. self._props['props'].update(new_props)
  47. if self._props['props']:
  48. self.run_method('add_props', self._props['props'])
  49. return self
  50. def query(selector: str) -> Query:
  51. """Query Selector
  52. To manipulate elements like the document body, you can use the `ui.query` function.
  53. With the query result you can add classes, styles, and attributes like with every other UI element.
  54. This can be useful for example to change the background color of the page (e.g. `ui.query('body').classes('bg-green')`).
  55. """
  56. for element in get_client().elements.values():
  57. if isinstance(element, Query) and element._props['selector'] == selector:
  58. return element
  59. return Query(selector)