ex4nicegui 0.6.2__tar.gz → 0.6.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/PKG-INFO +1 -1
  2. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/__init__.py +1 -1
  3. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/__init__.py +10 -0
  4. ex4nicegui-0.6.4/ex4nicegui/reactive/empty.js +3 -0
  5. ex4nicegui-0.6.4/ex4nicegui/reactive/empty.py +6 -0
  6. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/base.py +4 -0
  7. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/echarts.py +4 -3
  8. ex4nicegui-0.6.4/ex4nicegui/reactive/officials/element.py +19 -0
  9. ex4nicegui-0.6.4/ex4nicegui/reactive/officials/tab.py +57 -0
  10. ex4nicegui-0.6.4/ex4nicegui/reactive/officials/tab_panel.py +23 -0
  11. ex4nicegui-0.6.4/ex4nicegui/reactive/officials/tab_panels.py +46 -0
  12. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/table.py +10 -1
  13. ex4nicegui-0.6.4/ex4nicegui/reactive/officials/tabs.py +43 -0
  14. ex4nicegui-0.6.4/ex4nicegui/reactive/transitionGroup.js +39 -0
  15. ex4nicegui-0.6.4/ex4nicegui/reactive/transitionGroup.py +25 -0
  16. ex4nicegui-0.6.4/ex4nicegui/reactive/vfor.js +13 -0
  17. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/vfor.py +71 -59
  18. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/signals.py +6 -4
  19. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/PKG-INFO +1 -1
  20. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/SOURCES.txt +9 -0
  21. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/requires.txt +1 -1
  22. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/setup.py +1 -1
  23. ex4nicegui-0.6.2/ex4nicegui/reactive/vfor.js +0 -3
  24. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/LICENSE +0 -0
  25. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/README.md +0 -0
  26. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/__init__.py +0 -0
  27. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/dataSource.py +0 -0
  28. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/dataSourceFacade.py +0 -0
  29. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/__init__.py +0 -0
  30. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/containers.py +0 -0
  31. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/layouts.py +0 -0
  32. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/models.py +0 -0
  33. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/text.py +0 -0
  34. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_aggrid.py +0 -0
  35. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_date_picker.js +0 -0
  36. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_date_picker.py +0 -0
  37. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_echarts.py +0 -0
  38. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_radio.py +0 -0
  39. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_range.py +0 -0
  40. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_select.py +0 -0
  41. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_slider.py +0 -0
  42. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/elements/ui_table.py +0 -0
  43. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/index.py +0 -0
  44. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/protocols.py +0 -0
  45. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/bi/types.py +0 -0
  46. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/experimental_/__init__.py +0 -0
  47. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/experimental_/gridLayout/__init__.py +0 -0
  48. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/experimental_/gridLayout/index.py +0 -0
  49. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/gsap/__init__.py +0 -0
  50. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/gsap/gsap.py +0 -0
  51. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/gsap/timeline.js +0 -0
  52. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/gsap/timeline.py +0 -0
  53. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/gsap/wrapGsap.js +0 -0
  54. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/__init__.py +0 -0
  55. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/gridFlex/GridFlex.js +0 -0
  56. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/gridFlex/__init__.py +0 -0
  57. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/gridFlex/gridFlex.py +0 -0
  58. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/gridFlex/utils.py +0 -0
  59. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/rxFlex/__init__.py +0 -0
  60. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/rxFlex/index.py +0 -0
  61. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/layout/rxFlex/types.py +0 -0
  62. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/__init__.py +0 -0
  63. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/__init__.py +0 -0
  64. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-color.ems.js +0 -0
  65. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-dispatch.ems.js +0 -0
  66. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-drag.ems.js +0 -0
  67. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-ease.ems.js +0 -0
  68. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-interpolate.ems.js +0 -0
  69. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-selection.ems.js +0 -0
  70. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-timer.ems.js +0 -0
  71. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-transition.ems.js +0 -0
  72. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/d3/d3-zoom.ems.js +0 -0
  73. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/CSSPlugin.js +0 -0
  74. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/CSSRulePlugin.js +0 -0
  75. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/CustomEase.js +0 -0
  76. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/Draggable.js +0 -0
  77. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/EasePack.js +0 -0
  78. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/EaselPlugin.js +0 -0
  79. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/Flip.js +0 -0
  80. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/MotionPathPlugin.js +0 -0
  81. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/Observer.js +0 -0
  82. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/PixiPlugin.js +0 -0
  83. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/ScrollToPlugin.js +0 -0
  84. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/ScrollTrigger.js +0 -0
  85. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/TextPlugin.js +0 -0
  86. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/__init__.py +0 -0
  87. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/all.js +0 -0
  88. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/gsap-core.js +0 -0
  89. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/utils/__init__.py +0 -0
  90. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/utils/matrix.js +0 -0
  91. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/utils/paths.js +0 -0
  92. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/libs/gsap/utils/strings.js +0 -0
  93. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/EChartsComponent/ECharts.js +0 -0
  94. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/EChartsComponent/ECharts.py +0 -0
  95. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/EChartsComponent/__init__.py +0 -0
  96. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/UseDraggable/UseDraggable.js +0 -0
  97. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/UseDraggable/UseDraggable.py +0 -0
  98. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/UseDraggable/__init__.py +0 -0
  99. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/dropZone/__init__.py +0 -0
  100. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/dropZone/dropZone.js +0 -0
  101. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/dropZone/dropZone.py +0 -0
  102. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/fileWatcher.py +0 -0
  103. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/local_file_picker.py +0 -0
  104. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/mermaid/__init__.py +0 -0
  105. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/mermaid/mermaid.js +0 -0
  106. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/mermaid/mermaid.py +0 -0
  107. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/__init__.py +0 -0
  108. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/aggrid.py +0 -0
  109. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/button.py +0 -0
  110. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/card.py +0 -0
  111. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/checkbox.py +0 -0
  112. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/circular_progress.py +0 -0
  113. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/color_picker.py +0 -0
  114. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/column.py +0 -0
  115. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/date.py +0 -0
  116. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/drawer.py +0 -0
  117. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/expansion.py +0 -0
  118. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/grid.py +0 -0
  119. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/html.js +0 -0
  120. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/html.py +0 -0
  121. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/icon.py +0 -0
  122. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/image.py +0 -0
  123. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/input.py +0 -0
  124. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/knob.py +0 -0
  125. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/label.py +0 -0
  126. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/linear_progress.py +0 -0
  127. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/number.py +0 -0
  128. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/radio.py +0 -0
  129. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/row.py +0 -0
  130. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/select.py +0 -0
  131. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/slider.py +0 -0
  132. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/switch.py +0 -0
  133. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/textarea.py +0 -0
  134. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/upload.py +0 -0
  135. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/officials/utils.py +0 -0
  136. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/q_pagination.py +0 -0
  137. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/rxui.py +0 -0
  138. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/useMouse/UseMouse.js +0 -0
  139. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/useMouse/UseMouse.py +0 -0
  140. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/useMouse/__init__.py +0 -0
  141. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/usePagination.py +0 -0
  142. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/utils.py +0 -0
  143. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/reactive/vmodel.py +0 -0
  144. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/tools/__init__.py +0 -0
  145. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/tools/debug.py +0 -0
  146. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/__init__.py +0 -0
  147. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/apiEffect.py +0 -0
  148. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/asyncComputed.py +0 -0
  149. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/clientScope.py +0 -0
  150. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/common.py +0 -0
  151. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/effect.py +0 -0
  152. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui/utils/scheduler.py +0 -0
  153. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/dependency_links.txt +0 -0
  154. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/not-zip-safe +0 -0
  155. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/ex4nicegui.egg-info/top_level.txt +0 -0
  156. {ex4nicegui-0.6.2 → ex4nicegui-0.6.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ex4nicegui
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: Extension library based on nicegui, providing data responsive,BI functionality modules
5
5
  Home-page:
6
6
  Author: carson_jia
@@ -45,4 +45,4 @@ __all__ = [
45
45
  "is_setter_ref",
46
46
  ]
47
47
 
48
- __version__ = "0.6.2"
48
+ __version__ = "0.6.4"
@@ -46,6 +46,11 @@ from .officials.expansion import ExpansionBindableUi as expansion
46
46
  from .officials.linear_progress import LinearProgressBindableUi as linear_progress
47
47
  from .officials.knob import KnobBindableUi as knob
48
48
  from .officials.circular_progress import CircularProgressBindableUi as circular_progress
49
+ from .officials.tabs import TabsBindableUi as tabs
50
+ from .officials.tab import TabBindableUi as tab
51
+ from .officials.tab_panels import TabPanelsBindableUi as tab_panels
52
+ from .officials.tab_panel import TabPanelBindableUi as tab_panel
53
+ from .officials.element import ElementBindableUi as element
49
54
  from .q_pagination import PaginationBindableUi as q_pagination
50
55
 
51
56
  from .local_file_picker import local_file_picker
@@ -63,6 +68,11 @@ pagination = q_pagination
63
68
 
64
69
 
65
70
  __all__ = [
71
+ "element",
72
+ "tab_panels",
73
+ "tab_panel",
74
+ "tabs",
75
+ "tab",
66
76
  "circular_progress",
67
77
  "knob",
68
78
  "UploadResult",
@@ -0,0 +1,3 @@
1
+ export default {
2
+ template: '<slot></slot>'
3
+ }
@@ -0,0 +1,6 @@
1
+ from __future__ import annotations
2
+ from nicegui.element import Element
3
+
4
+
5
+ class Empty(Element, component="empty.js"):
6
+ pass
@@ -244,6 +244,10 @@ class BindableUi(Generic[TWidget]):
244
244
 
245
245
  return self
246
246
 
247
+ def update(self):
248
+ """Update the element on the client side."""
249
+ self.element.update()
250
+
247
251
 
248
252
  # class SingleValueBindableUi(BindableUi[TWidget], Generic[T, TWidget]):
249
253
  # def __init__(self, value: TMaybeRef[T], element: TWidget) -> None:
@@ -2,7 +2,7 @@ from pathlib import Path
2
2
  from typing import Any, Callable, Dict, List, Union, cast, Optional
3
3
  from typing_extensions import Literal
4
4
  from ex4nicegui.reactive.utils import ParameterClassifier
5
- from ex4nicegui.utils.apiEffect import ui_effect
5
+ from ex4nicegui.utils.signals import on
6
6
 
7
7
  from ex4nicegui.utils.signals import (
8
8
  ReadonlyRef,
@@ -10,6 +10,7 @@ from ex4nicegui.utils.signals import (
10
10
  ref_computed,
11
11
  _TMaybeRef as TMaybeRef,
12
12
  to_value,
13
+ to_raw,
13
14
  )
14
15
  from .base import BindableUi
15
16
  from ex4nicegui.reactive.EChartsComponent.ECharts import (
@@ -136,10 +137,10 @@ class EChartsBindableUi(BindableUi[echarts]):
136
137
  return super().bind_prop(prop, ref_ui)
137
138
 
138
139
  def bind_options(self, ref_ui: ReadonlyRef[Dict]):
139
- @ui_effect
140
+ @on(ref_ui)
140
141
  def _():
141
142
  ele = self.element
142
- ele.update_options(to_value(ref_ui), self.__update_setting)
143
+ ele.update_options(to_raw(to_value(ref_ui)), self.__update_setting)
143
144
  ele.update()
144
145
 
145
146
  return self
@@ -0,0 +1,19 @@
1
+ from typing import (
2
+ Any,
3
+ )
4
+ from nicegui import ui
5
+ from .base import BindableUi
6
+
7
+
8
+ class ElementBindableUi(BindableUi[ui.element]):
9
+ def __init__(self, tag: str) -> None:
10
+ element = ui.element(tag)
11
+
12
+ super().__init__(element)
13
+
14
+ def __enter__(self):
15
+ self.element.__enter__()
16
+ return self
17
+
18
+ def __exit__(self, *_: Any):
19
+ self.element.__exit__(*_)
@@ -0,0 +1,57 @@
1
+ from typing import Dict, Optional
2
+ from ex4nicegui.reactive.utils import ParameterClassifier
3
+ from ex4nicegui.utils.signals import (
4
+ to_value,
5
+ _TMaybeRef as TMaybeRef,
6
+ )
7
+ from nicegui import ui
8
+ from .base import BindableUi
9
+
10
+
11
+ class TabBindableUi(BindableUi[ui.tab]):
12
+ def __init__(
13
+ self,
14
+ name: TMaybeRef[str],
15
+ label: Optional[TMaybeRef[str]] = None,
16
+ icon: Optional[TMaybeRef[str]] = None,
17
+ ) -> None:
18
+ pc = ParameterClassifier(
19
+ locals(),
20
+ maybeRefs=["name", "label", "icon"],
21
+ )
22
+
23
+ value_kws = pc.get_values_kws()
24
+ element = ui.tab(**value_kws)
25
+ super().__init__(element)
26
+
27
+ bindings_kws = pc.get_bindings()
28
+ self.__bind_label(bindings_kws, value_kws)
29
+
30
+ if "label" in bindings_kws:
31
+ bindings_kws.pop("label")
32
+
33
+ for key, value in bindings_kws.items():
34
+ self.bind_prop(key, value) # type: ignore
35
+
36
+ # def bind_prop(self, prop: str, ref_ui: TMaybeRef):
37
+ # if prop == "name":
38
+ # return self.bind_name(ref_ui)
39
+
40
+ # return super().bind_prop(prop, ref_ui)
41
+
42
+ def __bind_label(self, binding_kws: Dict, value_kws: Dict):
43
+ name_ref = binding_kws.get("name") or value_kws.get("name")
44
+ label_ref = binding_kws.get("label") or value_kws.get("label")
45
+
46
+ @self._ui_effect
47
+ def _():
48
+ self.element._props["label"] = (
49
+ to_value(label_ref) if label_ref is not None else to_value(name_ref)
50
+ )
51
+ self.element.update()
52
+
53
+ # def bind_name(self, ref_ui: TMaybeRef):
54
+ # @self._ui_effect
55
+ # def _():
56
+ # self.element._props["name"] = to_value(ref_ui)
57
+ # self.element.update()
@@ -0,0 +1,23 @@
1
+ from ex4nicegui.reactive.utils import ParameterClassifier
2
+ from ex4nicegui.utils.signals import (
3
+ _TMaybeRef as TMaybeRef,
4
+ )
5
+ from nicegui import ui
6
+ from .base import BindableUi
7
+
8
+
9
+ class TabPanelBindableUi(BindableUi[ui.tab_panel]):
10
+ def __init__(
11
+ self,
12
+ name: TMaybeRef[str],
13
+ ) -> None:
14
+ pc = ParameterClassifier(
15
+ locals(),
16
+ maybeRefs=["name"],
17
+ )
18
+
19
+ element = ui.tab_panel(**pc.get_values_kws())
20
+ super().__init__(element)
21
+
22
+ for key, value in pc.get_bindings().items():
23
+ self.bind_prop(key, value) # type: ignore
@@ -0,0 +1,46 @@
1
+ from typing import Any, Callable, Optional
2
+ from ex4nicegui.reactive.utils import ParameterClassifier
3
+ from ex4nicegui.utils.signals import (
4
+ to_value,
5
+ _TMaybeRef as TMaybeRef,
6
+ )
7
+ from nicegui import ui
8
+ from .base import BindableUi
9
+
10
+
11
+ class TabPanelsBindableUi(BindableUi[ui.tab_panels]):
12
+ def __init__(
13
+ self,
14
+ value: Optional[TMaybeRef[str]] = None,
15
+ *,
16
+ on_change: Optional[Callable[..., Any]] = None,
17
+ animated: TMaybeRef[bool] = True,
18
+ keep_alive: TMaybeRef[bool] = True,
19
+ ) -> None:
20
+ pc = ParameterClassifier(
21
+ locals(),
22
+ maybeRefs=["value", "animated", "keep_alive"],
23
+ v_model=("value", "on_change"),
24
+ events=["on_change"],
25
+ )
26
+
27
+ element = ui.tab_panels(**pc.get_values_kws())
28
+ super().__init__(element)
29
+
30
+ for key, value in pc.get_bindings().items():
31
+ self.bind_prop(key, value) # type: ignore
32
+
33
+ @property
34
+ def value(self):
35
+ return self.element.value
36
+
37
+ def bind_prop(self, prop: str, ref_ui: TMaybeRef):
38
+ if prop == "value":
39
+ return self.bind_value(ref_ui)
40
+
41
+ return super().bind_prop(prop, ref_ui)
42
+
43
+ def bind_value(self, ref_ui: TMaybeRef):
44
+ @self._ui_effect
45
+ def _():
46
+ self.element.set_value(to_value(ref_ui))
@@ -17,6 +17,7 @@ from ex4nicegui.utils.signals import (
17
17
  to_value,
18
18
  to_raw,
19
19
  on,
20
+ RefWrapper,
20
21
  )
21
22
  from nicegui import ui
22
23
  from .base import BindableUi
@@ -34,8 +35,16 @@ class TableBindableUi(BindableUi[ui.table]):
34
35
  on_select: Optional[Callable[..., Any]] = None,
35
36
  on_pagination_change: Optional[Callable[..., Any]] = None,
36
37
  ) -> None:
38
+ local_args = locals()
39
+ rows_data = local_args.get("rows")
40
+ if isinstance(rows_data, RefWrapper):
41
+ local_args.update(rows=lambda: rows_data.value)
42
+ columns_data = local_args.get("columns") # type: ignore
43
+ if isinstance(columns_data, RefWrapper):
44
+ local_args.update(columns=lambda: columns_data.value)
45
+
37
46
  pc = ParameterClassifier(
38
- locals(),
47
+ local_args,
39
48
  maybeRefs=[
40
49
  "columns",
41
50
  "rows",
@@ -0,0 +1,43 @@
1
+ from typing import Any, Callable, Optional
2
+ from ex4nicegui.reactive.utils import ParameterClassifier
3
+ from ex4nicegui.utils.signals import (
4
+ to_value,
5
+ _TMaybeRef as TMaybeRef,
6
+ )
7
+ from nicegui import ui
8
+ from .base import BindableUi
9
+
10
+
11
+ class TabsBindableUi(BindableUi[ui.tabs]):
12
+ def __init__(
13
+ self,
14
+ value: Optional[TMaybeRef[str]] = None,
15
+ on_change: Optional[Callable[..., Any]] = None,
16
+ ) -> None:
17
+ pc = ParameterClassifier(
18
+ locals(),
19
+ maybeRefs=["value"],
20
+ v_model=("value", "on_change"),
21
+ events=["on_change"],
22
+ )
23
+
24
+ element = ui.tabs(**pc.get_values_kws())
25
+ super().__init__(element)
26
+
27
+ for key, value in pc.get_bindings().items():
28
+ self.bind_prop(key, value) # type: ignore
29
+
30
+ @property
31
+ def value(self):
32
+ return self.element.value
33
+
34
+ def bind_prop(self, prop: str, ref_ui: TMaybeRef):
35
+ if prop == "value":
36
+ return self.bind_value(ref_ui)
37
+
38
+ return super().bind_prop(prop, ref_ui)
39
+
40
+ def bind_value(self, ref_ui: TMaybeRef):
41
+ @self._ui_effect
42
+ def _():
43
+ self.element.set_value(to_value(ref_ui))
@@ -0,0 +1,39 @@
1
+ export default {
2
+ props: {
3
+ // childOrderKey: Array,
4
+ // transitionGroupArgs: Array,
5
+ },
6
+ data() {
7
+ return {
8
+ }
9
+ },
10
+ mounted() {
11
+ },
12
+ render() {
13
+ // debugger
14
+ const h = Vue.h
15
+ const vfgt = Vue.Fragment
16
+ const slotBox = this.$slots.default()
17
+ console.log('tg:', slotBox);
18
+ const wrap = () => [h(vfgt, slotBox)]
19
+ // const wrap = slotBox
20
+ console.log(wrap);
21
+
22
+
23
+ // slotBox[0].children = this.childOrderKey.map(idx => {
24
+ // return slotBox[0].children[idx]
25
+ // })
26
+ // console.log(slots);
27
+
28
+ return h(
29
+ Vue.TransitionGroup,
30
+ {
31
+ tag: 'span',
32
+ name: 'list',
33
+ // css: false,
34
+ // ...this.transitionGroupArgs
35
+ }, wrap
36
+ )
37
+
38
+ }
39
+ }
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+ from nicegui.element import Element
3
+ from typing import (
4
+ Any,
5
+ Dict,
6
+ List,
7
+ )
8
+
9
+
10
+ class TransitionGroup(Element, component="transitionGroup.js"):
11
+ def __init__(self) -> None:
12
+ super().__init__()
13
+
14
+ def apply_transition_group(self, args: Dict[str, Any]):
15
+ self._props["transitionGroupArgs"] = args
16
+ self.update()
17
+
18
+ def update_child_order_keys(self, keys: List[Any]):
19
+ print(f"keys:{keys=}")
20
+ self._props["childOrderKey"] = keys
21
+ self.update()
22
+
23
+
24
+ def transition_group(fn):
25
+ pass
@@ -0,0 +1,13 @@
1
+ export default {
2
+ props: { itemIds: Array },
3
+
4
+ render() {
5
+ const slotBox = this.$slots.default()
6
+
7
+ const slots = this.itemIds.map(({ elementId }) => {
8
+ return slotBox.find(v => v.key === elementId)
9
+ });
10
+
11
+ return slots
12
+ }
13
+ }
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
  from nicegui.element import Element
3
- from nicegui import ui
3
+ from nicegui import context
4
4
  from ex4nicegui.utils.clientScope import _CLIENT_SCOPE_MANAGER
5
5
  from ex4nicegui.utils.signals import (
6
6
  TReadonlyRef,
@@ -8,6 +8,9 @@ from ex4nicegui.utils.signals import (
8
8
  to_ref,
9
9
  to_ref_wrapper,
10
10
  TGetterOrReadonlyRef,
11
+ to_value,
12
+ is_reactive,
13
+ RefWrapper,
11
14
  )
12
15
  from typing import (
13
16
  Any,
@@ -24,9 +27,25 @@ from functools import partial
24
27
  from dataclasses import dataclass
25
28
  from signe.core.scope import Scope
26
29
  from .utils import get_attribute
30
+ from ex4nicegui.reactive.empty import Empty
31
+ # from .transitionGroup import TransitionGroup
27
32
 
28
33
  _T = TypeVar("_T")
29
- _T_data = TGetterOrReadonlyRef[List[Any]]
34
+ _T_data = Union[List[Any], TGetterOrReadonlyRef[List[Any]], RefWrapper]
35
+
36
+
37
+ class VforItem(Empty):
38
+ pass
39
+
40
+
41
+ class VforContainer(Element, component="vfor.js"):
42
+ def __init__(self) -> None:
43
+ super().__init__()
44
+ self._props["itemIds"] = []
45
+
46
+ def update_items(self, item_ids: List[Dict]):
47
+ self._props["itemIds"] = item_ids
48
+ self.update()
30
49
 
31
50
 
32
51
  class VforStore(Generic[_T]):
@@ -40,10 +59,10 @@ class VforStore(Generic[_T]):
40
59
 
41
60
  def get(self) -> TReadonlyRef[_T]:
42
61
  def base_setter(value):
43
- self._source.value[self._data_index.value] = value
62
+ to_value(self._source)[self._data_index.value] = value
44
63
 
45
64
  wrapper = to_ref_wrapper(
46
- lambda: self._source.value[self._data_index.value],
65
+ lambda: to_value(self._source)[self._data_index.value],
47
66
  base_setter,
48
67
  )
49
68
  wrapper._is_readonly = True
@@ -62,10 +81,6 @@ class StoreItem:
62
81
  scope: Scope
63
82
 
64
83
 
65
- class VforContainer(Element, component="vfor.js"):
66
- pass
67
-
68
-
69
84
  def _get_key_with_index(idx: int, data: Any):
70
85
  return idx
71
86
 
@@ -112,20 +127,25 @@ class vfor(Generic[_T]):
112
127
  self,
113
128
  data: _T_data,
114
129
  *,
115
- key: Optional[str] = None,
130
+ key: Optional[Union[str, Callable[[int, Any], Any]]] = None,
116
131
  ) -> None:
117
- self._container = VforContainer()
118
- self._data = data
119
- self._get_key = (
120
- _get_key_with_index if key is None else partial(_get_key_with_getter, key)
121
- )
132
+ self._vfor_container = VforContainer()
133
+ self._data = to_ref_wrapper(lambda: data) if is_reactive(data) else data
134
+ self._get_key = _get_key_with_index
135
+
136
+ if isinstance(key, str):
137
+ self._get_key = partial(_get_key_with_getter, key)
138
+ elif isinstance(key, Callable):
139
+ self._get_key = key
140
+
122
141
  self._store_map: Dict[Union[Any, int], StoreItem] = {}
123
142
 
124
143
  def __call__(self, fn: Callable[[Any], None]):
125
144
  def build_element(index: int, value):
126
145
  key = self._get_key(index, value)
127
- with VforContainer() as element:
128
- store = VforStore(self._data, index)
146
+
147
+ with self._vfor_container, VforItem() as element:
148
+ store = VforStore(self._data, index) # type: ignore
129
149
  scope = _CLIENT_SCOPE_MANAGER.new_scope()
130
150
 
131
151
  @scope.run
@@ -134,54 +154,46 @@ class vfor(Generic[_T]):
134
154
 
135
155
  return key, element, store, scope
136
156
 
137
- with self._container:
138
- for idx, value in enumerate(self._data.value):
139
- key, element, store, scope = build_element(idx, value)
140
- self._store_map[key] = StoreItem(store, element.id, scope)
157
+ for idx, value in enumerate(to_value(self._data)): # type: ignore
158
+ key, element, store, scope = build_element(idx, value)
159
+ self._store_map[key] = StoreItem(store, element.id, scope)
160
+
161
+ ng_client = context.get_client()
141
162
 
142
163
  @on(self._data, deep=True)
143
164
  def _():
144
165
  data_map = {
145
- self._get_key(idx, d): d for idx, d in enumerate(self._data.value)
166
+ self._get_key(idx, d): d for idx, d in enumerate(to_value(self._data))
146
167
  }
147
168
 
148
- temp_box = ui.element("div")
149
-
150
- element_map: Dict[int, ui.element] = {}
151
- for element in list(self._container):
152
- element.move(temp_box)
153
- element_map[element.id] = element
154
-
155
- new_store_map: Dict[Union[Any, int], StoreItem] = {}
156
-
157
- with self._container:
158
- for idx, (key, value) in enumerate(data_map.items()):
159
- store_item = self._store_map.get(key)
160
- if store_item:
161
- # `data` may have changed the value of a dictionary item,
162
- # so should update the values in the store one by one.
163
- store_item.store.update(idx)
164
- element = element_map.get(store_item.elementId)
165
- assert element
166
- element.move(self._container)
167
-
168
- new_store_map[key] = store_item
169
- else:
170
- # new row item
171
- key, element, store, score = build_element(idx, value)
172
- store_item = StoreItem(store, element.id, score)
173
- element.move(self._container)
174
- new_store_map[key] = store_item
175
-
176
- del_store_items = tuple(
177
- value
169
+ for idx, (key, value) in enumerate(data_map.items()):
170
+ store_item = self._store_map.get(key)
171
+ if store_item:
172
+ # `data` may have changed the value of a dictionary item,
173
+ # so should update the values in the store one by one.
174
+ store_item.store.update(idx)
175
+
176
+ else:
177
+ # new row item
178
+ key, element, store, score = build_element(idx, value)
179
+ self._store_map[key] = StoreItem(store, element.id, score)
180
+
181
+ # remove item
182
+ remove_items = [
183
+ (key, value)
178
184
  for key, value in self._store_map.items()
179
- if key not in new_store_map
185
+ if key not in data_map
186
+ ]
187
+
188
+ for key, item in remove_items:
189
+ target = ng_client.elements.get(item.elementId)
190
+ self._vfor_container.remove(target) # type: ignore
191
+ item.scope.dispose()
192
+ del self._store_map[key]
193
+
194
+ self._vfor_container.update_items(
195
+ [
196
+ {"key": key, "elementId": self._store_map.get(key).elementId} # type: ignore
197
+ for key in data_map.keys()
198
+ ]
180
199
  )
181
-
182
- for store_item in del_store_items:
183
- store_item.scope.dispose()
184
-
185
- self._store_map.clear()
186
- self._store_map = new_store_map
187
- temp_box.delete()
@@ -99,7 +99,7 @@ def is_ref(obj):
99
99
  return signe.is_signal(obj) or isinstance(obj, (RefWrapper))
100
100
 
101
101
 
102
- def to_value(obj: _TMaybeRef[T]) -> T:
102
+ def to_value(obj: Union[_TMaybeRef[T], RefWrapper]) -> T:
103
103
  if is_ref(obj):
104
104
  return obj.value # type: ignore
105
105
  if isinstance(obj, Callable):
@@ -329,7 +329,7 @@ class effect_refreshable:
329
329
 
330
330
 
331
331
  def on(
332
- refs: Union[TGetterOrReadonlyRef, Sequence[TGetterOrReadonlyRef]],
332
+ refs: Union[TGetterOrReadonlyRef, RefWrapper, Sequence[TGetterOrReadonlyRef]],
333
333
  onchanges=False,
334
334
  priority_level=1,
335
335
  effect_kws: Optional[Dict[str, Any]] = None,
@@ -349,8 +349,10 @@ def on(
349
349
 
350
350
  """
351
351
  effect_kws = effect_kws or {}
352
- # if not isinstance(refs, Sequence):
353
- # refs = [refs]
352
+ if not isinstance(refs, Sequence):
353
+ refs = [refs] # type: ignore
354
+
355
+ refs = [(lambda: ref.value) if isinstance(ref, RefWrapper) else ref for ref in refs] # type: ignore
354
356
 
355
357
  effect_kws.update({"priority_level": priority_level})
356
358
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ex4nicegui
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: Extension library based on nicegui, providing data responsive,BI functionality modules
5
5
  Home-page:
6
6
  Author: carson_jia
@@ -76,10 +76,14 @@ ex4nicegui/libs/gsap/utils/matrix.js
76
76
  ex4nicegui/libs/gsap/utils/paths.js
77
77
  ex4nicegui/libs/gsap/utils/strings.js
78
78
  ex4nicegui/reactive/__init__.py
79
+ ex4nicegui/reactive/empty.js
80
+ ex4nicegui/reactive/empty.py
79
81
  ex4nicegui/reactive/fileWatcher.py
80
82
  ex4nicegui/reactive/local_file_picker.py
81
83
  ex4nicegui/reactive/q_pagination.py
82
84
  ex4nicegui/reactive/rxui.py
85
+ ex4nicegui/reactive/transitionGroup.js
86
+ ex4nicegui/reactive/transitionGroup.py
83
87
  ex4nicegui/reactive/usePagination.py
84
88
  ex4nicegui/reactive/utils.py
85
89
  ex4nicegui/reactive/vfor.js
@@ -109,6 +113,7 @@ ex4nicegui/reactive/officials/column.py
109
113
  ex4nicegui/reactive/officials/date.py
110
114
  ex4nicegui/reactive/officials/drawer.py
111
115
  ex4nicegui/reactive/officials/echarts.py
116
+ ex4nicegui/reactive/officials/element.py
112
117
  ex4nicegui/reactive/officials/expansion.py
113
118
  ex4nicegui/reactive/officials/grid.py
114
119
  ex4nicegui/reactive/officials/html.js
@@ -125,7 +130,11 @@ ex4nicegui/reactive/officials/row.py
125
130
  ex4nicegui/reactive/officials/select.py
126
131
  ex4nicegui/reactive/officials/slider.py
127
132
  ex4nicegui/reactive/officials/switch.py
133
+ ex4nicegui/reactive/officials/tab.py
134
+ ex4nicegui/reactive/officials/tab_panel.py
135
+ ex4nicegui/reactive/officials/tab_panels.py
128
136
  ex4nicegui/reactive/officials/table.py
137
+ ex4nicegui/reactive/officials/tabs.py
129
138
  ex4nicegui/reactive/officials/textarea.py
130
139
  ex4nicegui/reactive/officials/upload.py
131
140
  ex4nicegui/reactive/officials/utils.py
@@ -1,4 +1,4 @@
1
- signe>=0.4.11
1
+ signe>=0.4.14
2
2
  nicegui>=1.4.0
3
3
  typing_extensions
4
4
  executing