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.
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/PKG-INFO +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/pyproject.toml +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/__init__.py +0 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/datasy.py +29 -14
- flet_easy-0.3.0.dev5/src/flet_easy/extra.py +23 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/fletEasy.py +19 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/pagesy.py +5 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/route.py +98 -88
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/pyproject.toml +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/witch-main.py +25 -44
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/cache-pages/without-main.py +20 -24
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/pyproject.toml +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/login.py +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/main.py +1 -2
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/counter.py +1 -1
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/index.py +1 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v3.py +10 -5
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/uv.lock +1526 -1257
- flet_easy-0.3.0.dev3/.vscode/settings.json +0 -7
- flet_easy-0.3.0.dev3/src/flet_easy/extra.py +0 -52
- flet_easy-0.3.0.dev3/tests/d2.py +0 -93
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/docs-update.yml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/linters.yml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/publish-pypi.yml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.github/workflows/tests.yml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.gitignore +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.markdownlint.yaml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/.python-version +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/CHANGELOG.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/CONTRIBUTING.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/LICENSE +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/README.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/by-means-of-functions.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/in-automatic.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/through-classes.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/add-pages/through-decorators.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/ControlResponse.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/Use-class-new-page.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/app-example.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/fs-init.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/jwt-app.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/jwt-web.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/on_keyboard.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/protected-route.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-advanced.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-custom.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/route-simple.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/share-data.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/use-example.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/gifs/view-config.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/app-api.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/favicon.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/funtion_add_page.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/logo.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/on-resize.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/run_view.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/struct-views.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/FletEasy.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/export_asgi.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/fastapi_run.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/method_run.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/struct-app.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/images/v0.2.0/template_dxs.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/assets/js/dynamic-year.js +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/basic-jwt.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/begin.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/cli-to-create-app.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/control-view-configuration.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/events.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/general-settings.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/page-404.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/customized-app/route-protection.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/data-sharing-between-pages.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/dynamic-routes.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/events/keyboard-event.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/events/on-resize.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/how-to-use.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/index.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/installation.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/middleware.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/overrides/main.html +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/ref.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/responsiveControlsy.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/run-the-app.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/stylesheets/extra.css +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/docs/working-with-other-apps.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/media/app-example.gif +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/media/logo.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/mkdocs.yml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/ruff.toml +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/auto_route.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/cli/main.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/exceptions.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/extrasJwt.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/inheritance.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/job.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/jwt.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/middleware.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/src/flet_easy/view_404.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/b.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/b2.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/c1.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/README.md +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/assets/database.db +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/assets/icon.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/counter.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/custom.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/drawer.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/components/register.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/counter.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/login.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/controllers/register.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/config.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/core/sensitive.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/connection.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/methods.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/models/models.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/dashboard.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/login.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-app/src/views/share.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/favicon.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icon.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-192 - copia.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-192.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-512.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/icon-maskable-512.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/icons/loading-animation.png +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/index.html +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/assets/manifest.json +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/controllers/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/controllers/contador.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/core/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/core/config.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/main.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/model/__init__.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/model/contador.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/counter.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/index.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/login.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/on_keyboard.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/pubsub.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/resize.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/response.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/share_data.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/task.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/flet-fastapi/views/test.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/routing.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v1.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v2.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/v4.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/x.py +0 -0
- {flet_easy-0.3.0.dev3 → flet_easy-0.3.0.dev5}/tests/x1.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
|
@@ -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
|
-
|
|
375
|
-
|
|
376
|
-
if len(self.history_routes) > 1
|
|
377
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
171
|
-
|
|
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
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
267
|
-
|
|
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
|
-
|
|
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
|
-
|
|
289
|
+
if route_match is None:
|
|
290
|
+
continue
|
|
278
291
|
|
|
279
|
-
|
|
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
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
313
|
-
|
|
302
|
+
if self.__run_middlewares_optimized(
|
|
303
|
+
route, route_match, page, use_route_change, use_reload
|
|
304
|
+
):
|
|
305
|
+
break
|
|
314
306
|
|
|
315
|
-
|
|
307
|
+
except Exception as e:
|
|
308
|
+
raise RouteError(e)
|
|
316
309
|
|
|
317
|
-
|
|
318
|
-
|
|
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
|
|
325
|
-
self, page
|
|
313
|
+
def __check_protected_route_optimized(
|
|
314
|
+
self, page, route, route_match, use_route_change, use_reload
|
|
326
315
|
):
|
|
327
|
-
"""
|
|
328
|
-
|
|
329
|
-
"Configure the route of the login page
|
|
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
|
-
"
|
|
337
|
-
e,
|
|
331
|
+
"use async methods in the function decorated by 'login', to avoid conflicts.", e
|
|
338
332
|
)
|
|
339
333
|
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
344
|
-
|
|
339
|
+
if page.middleware and self.__execute_middleware(page, route_match, page.middleware):
|
|
340
|
+
return True
|
|
345
341
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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.
|
|
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]:
|
|
@@ -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=
|
|
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
|
-
|
|
101
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
|
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=
|
|
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
|
-
|
|
149
|
-
new_appbar.title = ft.Text("Test 3")
|
|
133
|
+
appbar = data.view.appbar
|
|
150
134
|
|
|
151
|
-
|
|
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=
|
|
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
|
-
|
|
166
|
-
app.start(page)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
# app.run()
|
|
170
|
-
if __name__ == "__main__":
|
|
171
|
-
#ft.app(target=main)
|
|
172
|
-
app.run()
|
|
153
|
+
app.run()
|