link.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from pathlib import Path
  2. from typing import Any, Callable, Union
  3. from .. import globals
  4. from ..dependencies import register_vue_component
  5. from ..element import Element
  6. from .mixins.text_element import TextElement
  7. component = register_vue_component(Path('link.js'))
  8. class Link(TextElement):
  9. def __init__(self,
  10. text: str = '',
  11. target: Union[Callable[..., Any], str, Element] = '#',
  12. new_tab: bool = False,
  13. ) -> None:
  14. """Link
  15. Create a hyperlink.
  16. To jump to a specific location within a page you can place linkable anchors with `ui.link_target("name")`
  17. and link to it with `ui.link(target="#name")`.
  18. :param text: display text
  19. :param target: page function, NiceGUI element on the same page or string that is a an absolute URL or relative path from base URL
  20. :param new_tab: open link in new tab (default: False)
  21. """
  22. super().__init__(tag=component.tag, text=text)
  23. if isinstance(target, str):
  24. self._props['href'] = target
  25. elif isinstance(target, Element):
  26. self._props['href'] = f'#c{target.id}'
  27. elif callable(target):
  28. self._props['href'] = globals.page_routes[target]
  29. self._props['target'] = '_blank' if new_tab else '_self'
  30. self._classes = ['nicegui-link']
  31. self.use_component(component)
  32. class LinkTarget(Element):
  33. def __init__(self, name: str) -> None:
  34. """Link target
  35. Create an anchor tag that can be used as inner-page target for links.
  36. :param name: target name
  37. """
  38. super().__init__('a')
  39. self._props['name'] = name