refreshable_documentation.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from nicegui import ui
  2. from ..documentation_tools import text_demo
  3. def main_demo() -> None:
  4. import random
  5. numbers = []
  6. @ui.refreshable
  7. def number_ui() -> None:
  8. ui.label(', '.join(str(n) for n in sorted(numbers)))
  9. def add_number() -> None:
  10. numbers.append(random.randint(0, 100))
  11. number_ui.refresh()
  12. number_ui()
  13. ui.button('Add random number', on_click=add_number)
  14. def more() -> None:
  15. @text_demo('Refreshable UI with parameters', '''
  16. Here is a demo of how to use the refreshable decorator to create a UI that can be refreshed with different parameters.
  17. ''')
  18. def refreshable_with_parameters():
  19. from datetime import datetime
  20. import pytz
  21. @ui.refreshable
  22. def clock_ui(timezone: str):
  23. ui.label(f'Current time in {timezone}:')
  24. ui.label(datetime.now(tz=pytz.timezone(timezone)).strftime('%H:%M:%S'))
  25. clock_ui('Europe/Berlin')
  26. ui.button('Refresh', on_click=clock_ui.refresh)
  27. ui.button('Refresh for New York', on_click=lambda: clock_ui.refresh('America/New_York'))
  28. ui.button('Refresh for Tokyo', on_click=lambda: clock_ui.refresh('Asia/Tokyo'))
  29. @text_demo('Refreshable UI for input validation', '''
  30. Here is a demo of how to use the refreshable decorator to give feedback about the validity of user input.
  31. ''')
  32. def input_validation():
  33. import re
  34. pwd = ui.input('Password', password=True, on_change=lambda: show_info.refresh())
  35. rules = {
  36. 'Lowercase letter': lambda s: re.search(r'[a-z]', s),
  37. 'Uppercase letter': lambda s: re.search(r'[A-Z]', s),
  38. 'Digit': lambda s: re.search(r'\d', s),
  39. 'Special character': lambda s: re.search(r"[!@#$%^&*(),.?':{}|<>]", s),
  40. 'min. 8 characters': lambda s: len(s) >= 8,
  41. }
  42. @ui.refreshable
  43. def show_info():
  44. for rule, check in rules.items():
  45. with ui.row().classes('items-center gap-2'):
  46. if check(pwd.value or ''):
  47. ui.icon('done', color='green')
  48. ui.label(rule).classes('text-xs text-green strike-through')
  49. else:
  50. ui.icon('radio_button_unchecked', color='red')
  51. ui.label(rule).classes('text-xs text-red')
  52. show_info()