flet-easy 0.3.0.dev3__tar.gz → 0.3.0.dev5__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 (159) hide show
  1. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/PKG-INFO +1 -1
  2. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/pyproject.toml +1 -1
  3. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/__init__.py +0 -1
  4. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/datasy.py +29 -14
  5. flet_easy-0.3.0.dev5/src/flet_easy/extra.py +23 -0
  6. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/fletEasy.py +19 -1
  7. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/pagesy.py +5 -0
  8. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/route.py +98 -88
  9. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/pyproject.toml +1 -1
  10. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/witch-main.py +25 -44
  11. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/without-main.py +20 -24
  12. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/pyproject.toml +1 -1
  13. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/login.py +1 -1
  14. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/main.py +1 -2
  15. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/counter.py +1 -1
  16. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/index.py +1 -0
  17. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v3.py +10 -5
  18. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/uv.lock +1526 -1257
  19. flet_easy-0.3.0.dev3/.vscode/settings.json +0 -7
  20. flet_easy-0.3.0.dev3/src/flet_easy/extra.py +0 -52
  21. flet_easy-0.3.0.dev3/tests/d2.py +0 -93
  22. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  24. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/docs-update.yml +0 -0
  25. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/linters.yml +0 -0
  26. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/publish-pypi.yml +0 -0
  27. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/tests.yml +0 -0
  28. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.gitignore +0 -0
  29. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.markdownlint.yaml +0 -0
  30. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.python-version +0 -0
  31. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/CHANGELOG.md +0 -0
  32. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/CONTRIBUTING.md +0 -0
  33. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/LICENSE +0 -0
  34. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/README.md +0 -0
  35. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/by-means-of-functions.md +0 -0
  36. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/in-automatic.md +0 -0
  37. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/through-classes.md +0 -0
  38. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/through-decorators.md +0 -0
  39. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/ControlResponse.gif +0 -0
  40. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/Use-class-new-page.gif +0 -0
  41. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/app-example.gif +0 -0
  42. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/fs-init.gif +0 -0
  43. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/jwt-app.gif +0 -0
  44. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/jwt-web.gif +0 -0
  45. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/on_keyboard.gif +0 -0
  46. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/protected-route.gif +0 -0
  47. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-advanced.gif +0 -0
  48. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-custom.gif +0 -0
  49. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-simple.gif +0 -0
  50. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/share-data.gif +0 -0
  51. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/use-example.gif +0 -0
  52. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/view-config.gif +0 -0
  53. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/app-api.png +0 -0
  54. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/favicon.png +0 -0
  55. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/funtion_add_page.png +0 -0
  56. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/logo.png +0 -0
  57. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/on-resize.png +0 -0
  58. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/run_view.png +0 -0
  59. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/struct-views.png +0 -0
  60. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/FletEasy.png +0 -0
  61. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/export_asgi.png +0 -0
  62. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/fastapi_run.png +0 -0
  63. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/method_run.png +0 -0
  64. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/struct-app.png +0 -0
  65. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/template_dxs.png +0 -0
  66. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/js/dynamic-year.js +0 -0
  67. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/basic-jwt.md +0 -0
  68. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/begin.md +0 -0
  69. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/cli-to-create-app.md +0 -0
  70. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/control-view-configuration.md +0 -0
  71. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/events.md +0 -0
  72. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/general-settings.md +0 -0
  73. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/page-404.md +0 -0
  74. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/route-protection.md +0 -0
  75. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/data-sharing-between-pages.md +0 -0
  76. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/dynamic-routes.md +0 -0
  77. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/events/keyboard-event.md +0 -0
  78. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/events/on-resize.md +0 -0
  79. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/how-to-use.md +0 -0
  80. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/index.md +0 -0
  81. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/installation.md +0 -0
  82. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/middleware.md +0 -0
  83. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/overrides/main.html +0 -0
  84. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/ref.md +0 -0
  85. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/responsiveControlsy.md +0 -0
  86. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/run-the-app.md +0 -0
  87. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/stylesheets/extra.css +0 -0
  88. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/working-with-other-apps.md +0 -0
  89. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/media/app-example.gif +0 -0
  90. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/media/logo.png +0 -0
  91. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/mkdocs.yml +0 -0
  92. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/ruff.toml +0 -0
  93. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/auto_route.py +0 -0
  94. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/cli/main.py +0 -0
  95. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/exceptions.py +0 -0
  96. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/extrasJwt.py +0 -0
  97. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/inheritance.py +0 -0
  98. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/job.py +0 -0
  99. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/jwt.py +0 -0
  100. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/middleware.py +0 -0
  101. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/view_404.py +0 -0
  102. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/b.py +0 -0
  103. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/b2.py +0 -0
  104. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/c1.py +0 -0
  105. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/README.md +0 -0
  106. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/assets/database.db +0 -0
  107. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/assets/icon.png +0 -0
  108. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/__init__.py +0 -0
  109. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/counter.py +0 -0
  110. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/custom.py +0 -0
  111. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/drawer.py +0 -0
  112. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/register.py +0 -0
  113. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/__init__.py +0 -0
  114. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/counter.py +0 -0
  115. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/login.py +0 -0
  116. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/register.py +0 -0
  117. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/__init__.py +0 -0
  118. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/config.py +0 -0
  119. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/sensitive.py +0 -0
  120. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/__init__.py +0 -0
  121. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/connection.py +0 -0
  122. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/methods.py +0 -0
  123. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/models.py +0 -0
  124. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/dashboard.py +0 -0
  125. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/login.py +0 -0
  126. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/share.py +0 -0
  127. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/favicon.png +0 -0
  128. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icon.png +0 -0
  129. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-192 - copia.png +0 -0
  130. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-192.png +0 -0
  131. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-512.png +0 -0
  132. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-maskable-512.png +0 -0
  133. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/loading-animation.png +0 -0
  134. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/index.html +0 -0
  135. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/manifest.json +0 -0
  136. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/controllers/__init__.py +0 -0
  137. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/controllers/contador.py +0 -0
  138. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/core/__init__.py +0 -0
  139. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/core/config.py +0 -0
  140. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/main.py +0 -0
  141. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/model/__init__.py +0 -0
  142. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/model/contador.py +0 -0
  143. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/counter.py +0 -0
  144. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/index.py +0 -0
  145. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/login.py +0 -0
  146. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/on_keyboard.py +0 -0
  147. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/pubsub.py +0 -0
  148. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/resize.py +0 -0
  149. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/response.py +0 -0
  150. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/share_data.py +0 -0
  151. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/task.py +0 -0
  152. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/test.py +0 -0
  153. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/routing.py +0 -0
  154. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v1.py +0 -0
  155. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v2.py +0 -0
  156. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v4.py +0 -0
  157. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/x.py +0 -0
  158. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/x1.py +0 -0
  159. {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/x2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-easy
3
- Version: 0.3.0.dev3
3
+ Version: 0.3.0.dev5
4
4
  Summary: ⚡Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more.
5
5
  Project-URL: Homepage, https://github.com/Daxexs
6
6
  Project-URL: Repository, https://github.com/Daxexs/flet-easy
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flet-easy"
3
- version = "0.3.0.dev3"
3
+ version = "0.3.0.dev5"
4
4
  description = "⚡Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more."
5
5
  authors = [{ name = "Daxexs", email = "Daxexsdev@gmail.com" }]
6
6
 
@@ -11,4 +11,3 @@ from flet_easy.inheritance import (
11
11
  )
12
12
  from flet_easy.jwt import EasyKey, decode, decode_async
13
13
  from flet_easy.pagesy import AddPagesy, Pagesy, MiddlewareRequest
14
- from flet_easy.extra import cache_control
@@ -1,8 +1,8 @@
1
1
  from collections import deque
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import Any, Callable, Dict
3
+ from typing import Any, Callable, Dict, Tuple
4
4
 
5
- from flet import Page
5
+ from flet import Control, ControlEvent, Page
6
6
 
7
7
  from flet_easy.exceptions import LoginError
8
8
  from flet_easy.extra import Msg, Redirect
@@ -42,6 +42,7 @@ class Datasy:
42
42
  * `login` : method to create sessions of all sections in the browser (client storage), requires as parameters the key and the value, the same used in the `page.client_storage.set` method.
43
43
  * `go` : `go`: Method to change the application path, supports url redirections.
44
44
  * `go_back` : Method to go back to the previous route.
45
+ * `go_navigation_bar` : Handles navigation bar changes. Use this method in the on_change event of 'ft.NavigationBar' or 'ft.CupertinoNavigationBar' controls.
45
46
  * `history_routes` : Get the history of the routes.
46
47
  * `route` : route provided by the route event, it is useful when using middlewares to check if the route is assecible.
47
48
  * `redirect` : To redirect to a path before the page loads, it is used in middleware.
@@ -55,7 +56,7 @@ class Datasy:
55
56
  secret_key: str,
56
57
  auto_logout: bool,
57
58
  page_on_keyboard: Keyboardsy,
58
- go: Callable[[str], None] = None,
59
+ go: Callable[[str, int], None] = None,
59
60
  ) -> None:
60
61
  self.__page: Page = None
61
62
  self.__url_params: Dict[str, Any] = None
@@ -68,7 +69,8 @@ class Datasy:
68
69
  self.__on_resize: Resizesy = None
69
70
  self.__route: str = None
70
71
  self.__go = go
71
- self.__history_routes: deque[str] = deque()
72
+ self.__history_routes: deque[Tuple[str, int]] = deque()
73
+ self._dynamic_control: Dict[str, Tuple[Control, Callable[[Control], None]]] = {}
72
74
 
73
75
  self.__secret_key: SecretKey = secret_key
74
76
  self.__auto_logout: bool = auto_logout
@@ -89,10 +91,6 @@ class Datasy:
89
91
  def history_routes(self):
90
92
  return self.__history_routes
91
93
 
92
- @history_routes.setter
93
- def history_routes(self, history_routes: deque[str]):
94
- self.__history_routes = history_routes
95
-
96
94
  @property
97
95
  def url_params(self):
98
96
  return self.__url_params
@@ -365,17 +363,34 @@ class Datasy:
365
363
  """To change the application path, it is important for better validation to avoid using `page.go()`."""
366
364
  return lambda _=None: self.__go(route)
367
365
 
366
+ def go_navigation_bar(self, e: ControlEvent) -> None:
367
+ """Handles navigation bar changes. Use this method in the on_change event of
368
+ 'ft.NavigationBar' or 'ft.CupertinoNavigationBar' controls."""
369
+ self.__go(e.control.selected_index)
370
+
368
371
  def redirect(self, route: str):
369
372
  """Useful if you do not want to access a route that has already been sent."""
370
373
  return Redirect(route)
371
374
 
372
- def go_back(self):
375
+ def go_back(self) -> Callable[[ControlEvent], None]:
373
376
  """Go back to the previous route."""
374
- return lambda _=None: (
375
- (self.history_routes.pop(), self.__go(self.history_routes.pop()))
376
- if len(self.history_routes) > 1
377
- else (print("-> I can't go back! There is no route history."), None)
378
- )
377
+
378
+ def go_back_func():
379
+ if len(self.history_routes) > 1:
380
+ self.history_routes.pop()
381
+ route, index = self.history_routes.pop()
382
+ if index is not None:
383
+ self.view.navigation_bar.selected_index = index
384
+
385
+ self.__go(route)
386
+ else:
387
+ print("-> I can't go back! there is no history. ")
388
+
389
+ return lambda _=None: go_back_func()
390
+
391
+ def dynamic_control(self, control: Control, func_update: Callable[[Control], None]) -> None:
392
+ """Adds dynamic control to the page."""
393
+ self._dynamic_control[self.page.route] = (control, func_update)
379
394
 
380
395
 
381
396
  def evaluate_secret_key(data: Datasy):
@@ -0,0 +1,23 @@
1
+ from dataclasses import dataclass
2
+ from re import Pattern, compile
3
+ from typing import Callable, Dict, Optional, Tuple
4
+
5
+
6
+ @dataclass
7
+ class Msg:
8
+ method: str
9
+ key: str = None
10
+ value: str | dict = None
11
+
12
+
13
+ @dataclass
14
+ class Redirect:
15
+ route: str = None
16
+
17
+
18
+ TYPE_PATTERNS: Dict[str, Tuple[Pattern[str], Callable[[str], Optional[bool]]]] = {
19
+ "int": (compile(r"-?\d+"), int),
20
+ "float": (compile(r"-?\d+\.\d+"), float),
21
+ "str": (compile(r"[^/]+"), str),
22
+ "bool": (compile(r"(true|True|false|False)"), lambda x: x in ["true", "True"]),
23
+ }
@@ -126,6 +126,20 @@ class FletEasy(FletEasyX):
126
126
  """
127
127
 
128
128
  __self = None
129
+ __slots__ = (
130
+ "__route_prefix",
131
+ "__path_views",
132
+ "__pagesys",
133
+ "_data",
134
+ "_pages",
135
+ "_page_404",
136
+ "_view_data",
137
+ "_view_config",
138
+ "_config_login",
139
+ "_config_event",
140
+ "_middlewares",
141
+ "_middlewares_after",
142
+ )
129
143
 
130
144
  def __init__(
131
145
  self,
@@ -155,7 +169,7 @@ class FletEasy(FletEasyX):
155
169
  # add data to middleware request
156
170
  MiddlewareRequest._data = self._data
157
171
 
158
- self.__pagesys = automatic_routing(self.__path_views)
172
+ self.__pagesys = automatic_routing(self.__path_views) if self.__path_views else None
159
173
 
160
174
  # -------------------------------------------------------------------
161
175
  def __pre_config(self, page: Page):
@@ -248,6 +262,7 @@ class FletEasy(FletEasyX):
248
262
  route=route,
249
263
  view=func,
250
264
  title=data.get("title"),
265
+ index=data.get("index"),
251
266
  clear=data.get("page_clear"),
252
267
  share_data=data.get("share_data"),
253
268
  protected_route=data.get("protected_route"),
@@ -283,6 +298,7 @@ class FletEasy(FletEasyX):
283
298
  cls,
284
299
  route: str,
285
300
  title: str = None,
301
+ index: Optional[int] = None,
286
302
  page_clear: bool = False,
287
303
  share_data: bool = False,
288
304
  protected_route: bool = False,
@@ -295,6 +311,7 @@ class FletEasy(FletEasyX):
295
311
  """Decorator to add a new page to the app, you need the following parameters:
296
312
  * route: text string of the url, for example(`'/FletEasy'`).
297
313
  * `title` : Define the title of the page. (optional).
314
+ * `index` : Define the index of the page, use in controls like `ft.CupertinoNavigationBar` or `ft.NavigationBar`. (optional)
298
315
  * clear: Removes the pages from the `page.views` list of flet. (optional)
299
316
  * `share_data` : It is a boolean value, which is useful if you want to share data between pages, in a more restricted way. (optional)
300
317
  * protected_route: Protects the route of the page, according to the configuration of the `login` decorator of the `FletEasy` class. (optional)
@@ -329,6 +346,7 @@ class FletEasy(FletEasyX):
329
346
  data = {
330
347
  "route": route,
331
348
  "title": title,
349
+ "index": index,
332
350
  "page_clear": page_clear,
333
351
  "share_data": share_data,
334
352
  "protected_route": protected_route,
@@ -15,6 +15,7 @@ class Pagesy:
15
15
  * `route`: text string of the url, for example(`'/task'`).
16
16
  * `view`: Stores the page function.
17
17
  * `title` : Define the title of the page.
18
+ * `index` : Define the index of the page, use in controls like `ft.NavigationBar` and `ft.CupertinoNavigationBar`.
18
19
  * `clear`: Removes the pages from the `page.views` list of flet. (optional)
19
20
  * `share_data` : It is a boolean value, which is useful if you want to share data between pages, in a more restricted way. (optional)
20
21
  * `protected_route`: Protects the route of the page, according to the configuration of the `login` decorator of the `FletEasy` class. (optional)
@@ -33,6 +34,7 @@ class Pagesy:
33
34
  route: str,
34
35
  view: ViewHandler,
35
36
  title: Optional[str] = None,
37
+ index: Optional[int] = None,
36
38
  clear: bool = False,
37
39
  share_data: bool = False,
38
40
  protected_route: bool = False,
@@ -45,6 +47,7 @@ class Pagesy:
45
47
  self.route = route
46
48
  self.view = view
47
49
  self.title = title
50
+ self.index = index
48
51
  self.clear = clear
49
52
  self.share_data = share_data
50
53
  self.protected_route = protected_route
@@ -178,6 +181,7 @@ class AddPagesy:
178
181
  self,
179
182
  route: str,
180
183
  title: Optional[str] = None,
184
+ index: Optional[int] = None,
181
185
  page_clear: bool = False,
182
186
  share_data: bool = False,
183
187
  protected_route: bool = False,
@@ -199,6 +203,7 @@ class AddPagesy:
199
203
  route=self.__build_route(route),
200
204
  view=func,
201
205
  title=title,
206
+ index=index,
202
207
  clear=page_clear,
203
208
  share_data=share_data,
204
209
  protected_route=protected_route,
@@ -39,6 +39,7 @@ class FletEasyX:
39
39
  self._pages = deque()
40
40
  self.__history_pages: Dict[str, View] = {}
41
41
  self.__view_404 = page_404_fs
42
+ self.__automatically_imply_leading = False
42
43
 
43
44
  self.__page: Page = None
44
45
  self._page_404: Pagesy = None
@@ -76,9 +77,7 @@ class FletEasyX:
76
77
  self.__pagesy = None
77
78
 
78
79
  def __view_pop(self, e: ViewPopEvent):
79
- if len(self._data.history_routes) > 1:
80
- self._data.history_routes.pop()
81
- self._go(self._data.history_routes.pop())
80
+ self._data.go_back()()
82
81
 
83
82
  async def __on_keyboard(self, e: KeyboardEvent):
84
83
  self.__page_on_keyboard.call = e
@@ -125,13 +124,17 @@ class FletEasyX:
125
124
  """Add the `View` configuration, to reuse on every page."""
126
125
  self._data.view = self.__check_async(self._view_data, self._data, result=True)
127
126
 
127
+ if self._data.view:
128
+ self.__automatically_imply_leading = getattr(
129
+ self._data.view.appbar, "automatically_imply_leading", True
130
+ )
131
+
128
132
  if self.__route_login is not None:
129
133
  self._data._create_login()
130
134
 
131
135
  def _add_configuration_start(self, page: Page):
132
136
  """Add general settings to the pages."""
133
137
  self.__page = page
134
- self.__page.views.clear()
135
138
  self.__config_datasy()
136
139
 
137
140
  """ Add view configuration """
@@ -150,7 +153,7 @@ class FletEasyX:
150
153
  """ Executing charter events """
151
154
  self.__page.on_route_change = self.__route_change
152
155
  self.__page.on_view_pop = self.__view_pop
153
- self.__page.on_error = lambda e: print("Page error:", e.data)
156
+ self.__page.on_error = lambda e: print("Page error:", e)
154
157
  self.__page.on_disconnect = self.__disconnect
155
158
 
156
159
  """ activation of charter events """
@@ -167,8 +170,10 @@ class FletEasyX:
167
170
  """Add a new page and update it."""
168
171
 
169
172
  # To make the page change faster.
170
- if len(self.__page.views) == 2:
171
- self.__page.views.remove(self.__page.views[1])
173
+ self.__manage_dynamic_appbar(route)
174
+
175
+ if len(self.__page.views) > 1:
176
+ self.__page.views.pop()
172
177
 
173
178
  view = self.__history_pages.get(route)
174
179
 
@@ -186,8 +191,13 @@ class FletEasyX:
186
191
  if pagesy.cache:
187
192
  self.__history_pages[route] = view
188
193
 
194
+ dynamic_control = self._data._dynamic_control.get(route)
195
+
196
+ if dynamic_control:
197
+ self.__check_async(dynamic_control[1], dynamic_control[0], result=True)
198
+
189
199
  self.__page.views.append(view)
190
- self._data.history_routes.append(route)
200
+ self._data.history_routes.append((route, pagesy.index))
191
201
  self.__page.update()
192
202
 
193
203
  if self._middlewares_after:
@@ -198,6 +208,21 @@ class FletEasyX:
198
208
  for middleware in pagesy._middlewares_request:
199
209
  self.__check_async(middleware.after_request)
200
210
 
211
+ def __manage_dynamic_appbar(self, route: str) -> None:
212
+ """Manage the appbar automatically_imply_leading parameter"""
213
+ if route == self.__route_init:
214
+ self._data.history_routes.clear()
215
+ appbar = getattr(self._data.view, "appbar", None)
216
+
217
+ if appbar and getattr(appbar, "automatically_imply_leading", None):
218
+ appbar.automatically_imply_leading = False
219
+
220
+ elif self.__automatically_imply_leading:
221
+ appbar = getattr(self._data.view, "appbar", None)
222
+
223
+ if appbar:
224
+ appbar.automatically_imply_leading = True
225
+
201
226
  def __reload_datasy(
202
227
  self,
203
228
  pagesy: Pagesy,
@@ -249,107 +274,92 @@ class FletEasyX:
249
274
 
250
275
  return False
251
276
 
252
- def __run_middlewares(
253
- self,
254
- route: str,
255
- middleware: Middleware,
256
- url_params: Dict[str, Any],
257
- pagesy: Pagesy,
258
- use_route_change: bool,
259
- use_reload: bool,
260
- ):
261
- """Controla los middleware de la aplicación en general y en cada una de las páginas."""
262
-
263
- if self.__execute_middleware(pagesy, url_params, middleware):
264
- return True
277
+ def _go(self, route: Union[str, int], use_route_change: bool = False, use_reload: bool = False):
278
+ """method to go to the route, if the route is not found, it will return a 404 page."""
279
+ pg_404 = True
265
280
 
266
- if self.__execute_middleware(pagesy, url_params, pagesy.middleware):
267
- return True
281
+ for page in self._pages:
282
+ if isinstance(route, int):
283
+ if page.index != route:
284
+ continue
285
+ route = page.route
268
286
 
269
- self.__reload_datasy(pagesy, url_params)
270
- if use_route_change:
271
- self._view_append(route, pagesy)
272
- else:
273
- if self.__page.route != route or use_reload:
274
- self.__pagesy = pagesy
275
- self.__page.go(route)
287
+ route_match = self._verify_url(page.route, route, page.custom_params)
276
288
 
277
- return True
289
+ if route_match is None:
290
+ continue
278
291
 
279
- def _go(self, route: str, use_route_change: bool = False, use_reload: bool = False):
280
- """Go to the route, if the route is not found, it will return a 404 page."""
281
- pg_404 = True
292
+ pg_404 = False
282
293
 
283
- for page in self._pages:
284
- route_math = self._verify_url(page.route, route, page.custom_params)
285
- if route_math is not None:
286
- pg_404 = False
287
- try:
288
- if page.protected_route:
289
- self.__check_protected_route(
290
- page,
291
- route,
292
- route_math,
293
- use_route_change,
294
- use_reload,
295
- )
296
- break
297
- else:
298
- if self.__run_middlewares(
299
- route,
300
- self._middlewares,
301
- route_math,
302
- page,
303
- use_route_change,
304
- use_reload,
305
- ):
306
- break
307
- except Exception as e:
308
- raise RouteError(e)
309
- if pg_404:
310
- page = self._page_404 or Pagesy(route, self.__view_404, "Flet-Easy 404")
294
+ try:
295
+ if page.protected_route:
296
+ if not self.__check_protected_route_optimized(
297
+ page, route, route_match, use_route_change, use_reload
298
+ ):
299
+ return
300
+ break
311
301
 
312
- if page.route is None:
313
- page.route = route
302
+ if self.__run_middlewares_optimized(
303
+ route, route_match, page, use_route_change, use_reload
304
+ ):
305
+ break
314
306
 
315
- self.__reload_datasy(page)
307
+ except Exception as e:
308
+ raise RouteError(e)
316
309
 
317
- if use_route_change:
318
- self._view_append(page.route, page)
319
- else:
320
- if self.__page.route != route or use_reload:
321
- self.__pagesy = page
322
- self.__page.go(page.route)
310
+ if pg_404:
311
+ self._handle_404_case(route, use_route_change, use_reload)
323
312
 
324
- def __check_protected_route(
325
- self, page: Pagesy, route: str, route_math: str, use_route_change: bool, use_reload: bool
313
+ def __check_protected_route_optimized(
314
+ self, page, route, route_match, use_route_change, use_reload
326
315
  ):
327
- """Check if the route is protected and if it is, check if the user is logged in."""
328
- assert self.__route_login is not None, (
329
- "Configure the route of the login page, in the Flet-Easy class in the parameter (route_login)"
330
- )
316
+ """Optimized protected route checker"""
317
+ if self.__route_login is None:
318
+ raise AssertionError("Configure the route of the login page in Flet-Easy class")
331
319
 
332
320
  try:
333
321
  auth = self.__check_async(self._config_login, self._data, result=True)
322
+ if not auth:
323
+ self._go(self.__route_login)
324
+ return False
325
+
326
+ self.__reload_datasy(page, route_match)
327
+ self._navigate(route, page, use_route_change, use_reload)
328
+ return True
334
329
  except Exception as e:
335
330
  raise LoginRequiredError(
336
- "Use async methods in the function decorated by 'login', to avoid conflicts.",
337
- e,
331
+ "use async methods in the function decorated by 'login', to avoid conflicts.", e
338
332
  )
339
333
 
340
- if auth:
341
- self.__reload_datasy(page, route_math)
334
+ def __run_middlewares_optimized(self, route, route_match, page, use_route_change, use_reload):
335
+ """Optimized middleware runner"""
336
+ if self._middlewares and self.__execute_middleware(page, route_match, self._middlewares):
337
+ return True
342
338
 
343
- if use_route_change:
344
- self._view_append(route, page)
339
+ if page.middleware and self.__execute_middleware(page, route_match, page.middleware):
340
+ return True
345
341
 
346
- else:
347
- if self.__page.route != route or use_reload:
348
- self.__pagesy = page
349
- self.__page.go(route)
342
+ self.__reload_datasy(page, route_match)
343
+ self._navigate(route, page, use_route_change, use_reload)
344
+ return True
350
345
 
346
+ def _navigate(self, route, page, use_route_change, use_reload):
347
+ """Unified navigation handler"""
348
+ if use_route_change:
349
+ self._view_append(route, page)
351
350
  else:
352
- self._go(self.__route_login)
351
+ if self.__page.route != route or use_reload:
352
+ self.__pagesy = page
353
+ self.__page.go(route)
354
+
355
+ def _handle_404_case(self, route, use_route_change, use_reload):
356
+ """Optimized 404 handler"""
357
+ page = self._page_404 or Pagesy(route, self.__view_404, "Flet-Easy 404")
358
+ if page.route is None:
359
+ page.route = route
360
+
361
+ self.__reload_datasy(page)
362
+ self._navigate(page.route, page, use_route_change, use_reload)
353
363
 
354
364
  @classmethod
355
365
  def __compile_pattern(cls, pattern_parts: list[str]) -> Pattern[str]:
@@ -2,7 +2,7 @@
2
2
  name = "flet-app"
3
3
  version = "0.1.0"
4
4
  license = "MIT"
5
- dependencies = ["flet", "flet-easy==0.3.0.dev2", "sqlmodel"]
5
+ dependencies = ["flet", "flet-easy==0.3.0.dev4"]
6
6
 
7
7
  [[project.authors]]
8
8
  name = "Daxexs"
@@ -5,7 +5,7 @@ import flet as ft
5
5
 
6
6
  import flet_easy as fs
7
7
 
8
- app = fs.FletEasy()
8
+ app = fs.FletEasy(route_init="/")
9
9
 
10
10
 
11
11
  # remove animation on route change
@@ -31,6 +31,7 @@ def config_view(data: fs.Datasy):
31
31
  data.page.update()
32
32
 
33
33
  appbar = ft.AppBar(
34
+ # automatically_imply_leading=False,
34
35
  bgcolor=ft.Colors.BLACK45,
35
36
  actions=[
36
37
  ft.IconButton(
@@ -41,16 +42,6 @@ def config_view(data: fs.Datasy):
41
42
  ],
42
43
  )
43
44
 
44
- def index_bar_route(e: ft.ControlEvent):
45
- route = e.control.selected_index
46
-
47
- if route == 0:
48
- data.go("/")()
49
- elif route == 1:
50
- data.go("/test2")()
51
- elif route == 2:
52
- data.go("/test3")()
53
-
54
45
  return ft.View(
55
46
  appbar=appbar,
56
47
  navigation_bar=ft.NavigationBar(
@@ -62,7 +53,7 @@ def config_view(data: fs.Datasy):
62
53
  label="counter 3",
63
54
  ),
64
55
  ],
65
- on_change=index_bar_route,
56
+ on_change=data.go_navigation_bar,
66
57
  ),
67
58
  )
68
59
 
@@ -94,79 +85,69 @@ class Counter(ft.Container):
94
85
 
95
86
 
96
87
  # add cache to the page
97
- @app.page("/", title="Test 1", cache=True)
88
+ @app.page("/", title="Test 1", index=0, cache=True)
98
89
  def index_page(data: fs.Datasy):
99
90
  page = data.page
100
- new_appbar = fs.cache_control(data.view.appbar)
101
- new_appbar.title = ft.Text("Test 1")
91
+ appbar = data.view.appbar
92
+
93
+ async def update_title(e: ft.AppBar):
94
+ e.title = ft.Text("Test 1")
95
+
96
+ data.dynamic_control(appbar, update_title)
102
97
 
103
98
  return ft.View(
104
99
  controls=[
105
100
  ft.Text("Counter 1", size=50),
106
101
  Counter(page.update, ft.Colors.RED),
107
102
  ],
108
- appbar=new_appbar,
103
+ appbar=appbar,
109
104
  navigation_bar=data.view.navigation_bar,
110
105
  horizontal_alignment="center",
111
106
  vertical_alignment="center",
112
107
  )
113
108
 
114
109
 
115
- def m(data: fs.Datasy):
116
- page = data.page
117
- page.run_task(x)
118
-
119
-
120
- @app.page("/test2", title="Test 2", middleware=[m])
110
+ @app.page("/test2", title="Test 2", index=1)
121
111
  def test_page(data: fs.Datasy):
122
112
  page = data.page
123
- data.view.appbar.title = ft.Text("Test 2")
113
+ appbar = data.view.appbar
114
+
115
+ appbar.title = ft.Text("Test 2")
124
116
 
125
117
  return ft.View(
126
118
  controls=[
127
119
  ft.Text("Counter 2 - (cache disabled)", size=50),
128
120
  Counter(page.update, ft.Colors.BLUE),
129
121
  ],
130
- appbar=data.view.appbar,
122
+ appbar=appbar,
131
123
  navigation_bar=data.view.navigation_bar,
132
124
  vertical_alignment="center",
133
125
  horizontal_alignment="center",
134
126
  )
135
127
 
136
128
 
137
- async def x():
138
- for i in range(10):
139
- print(i)
140
- await asyncio.sleep(1)
141
- return "Done"
142
-
143
-
144
129
  # add cache to the page
145
- @app.page("/test3", title="Test 3", cache=True)
130
+ @app.page("/test3", title="Test 3", index=2, cache=True)
146
131
  async def test2_page(data: fs.Datasy):
147
132
  page = data.page
148
- new_appbar = fs.cache_control(data.view.appbar)
149
- new_appbar.title = ft.Text("Test 3")
133
+ appbar = data.view.appbar
150
134
 
151
- page.run_task(x)
135
+ data.dynamic_control(appbar, func_update=lambda e: setattr(e, "title", ft.Text("Test 3")))
136
+ data.dynamic_control(
137
+ appbar,
138
+ func_update=lambda e: setattr(e, "automatically_imply_leading", False),
139
+ )
152
140
 
153
141
  return ft.View(
154
142
  controls=[
155
143
  ft.Text("Counter 3", size=50),
156
144
  Counter(page.update, ft.Colors.GREEN),
157
145
  ],
158
- appbar=new_appbar,
146
+ appbar=appbar,
159
147
  navigation_bar=data.view.navigation_bar,
160
148
  horizontal_alignment="center",
161
149
  vertical_alignment="center",
162
150
  )
163
151
 
164
152
 
165
- async def main(page: ft.Page):
166
- app.start(page)
167
-
168
-
169
- # app.run()
170
- if __name__ == "__main__":
171
- #ft.app(target=main)
172
- app.run()
153
+ app.run()