Skip to content

Conversation

@Einswilli
Copy link
Contributor

Angular-like routing system

This PR provides a routing system that allows to define flex application routes using Angular-like style

  1. simple routing
from flex.navigation import router_config

router_config.add_routes([
    {"path": "/", "component": HomePage},
    {"path": "/settings", "component": SettingsPage}
])
  1. Dynamic routes with parameters
router_config.add_routes([
    {
        "path": "/users/:id",
        "component": lambda route: UserDetailPage(route.params['id'])
    },
    {
        "path": "/products/*category",
        "component": lambda route: ProductsPage(route.params['category'])
    }
])

# Navigate to  
navigate("/users/123")
  1. Nested routes
from flex.navigation import RouteDefinition

router_config.add_route(
    path="/admin",
    component=AdminLayoutPage,
    children=[
        RouteDefinition(
            path="/dashboard",
            component=AdminDashboardPage
        ),
        RouteDefinition(
            path="/users",
            component=AdminUsersPage
        )
    ]
)
  1. Guards and Middlewares
router_config.add_route(
    path="/profile",
    component=ProfilePage,
    guards=[AuthGuard()],
    middleware=[AnalyticsMiddleware()]
)
  1. Subrouters
# Create a separate router for admin module
admin_module = ModuleRouter()
admin_module.name = 'admin'

# Define routes for admin_module
admin_module.add_routes([
    {"path": "/", "component": AdminHomePage},
    {"path": "/users", "component": AdminUsersPage},
    {"path": "/settings", "component": AdminSettingsPage}
])

# Register the admin routing module to the main router config 
router_config.add_module_routes("/admin", admin_module)

# URLs become:
# /admin/ -> AdminHomePage
# /admin/users -> AdminUsersPage
# /admin/settings -> AdminSettingsPage
  1. Custom routers (OOP style)
admin_routes = [
    {"path": "/", "component": AdminHomePage},
    {"path": "/users", "component": AdminUsersPage},
    {"path": "/settings", "component": AdminSettingsPage}
]

@register_router
class AdminRouter(ModuleRouter):
    """My Admin Routing Module."""

    name = 'Admin'
    base_path = '/admin'
    is_root = false
    routes = admin_routes
    sub_routers = []

@register_router
class MyAppRouter(ModuleRouter):
    """My Application Routing Module."""

    name = 'MyAppRouter'
    base_path = '/'
    is_root = True
    routes = []
    sub_routers = [AdminRouter]
  1. Route Transitions
routes = [
    {
        'path': '/login',
        'component': LoginPage,
        'meta':{
            'transition': RouteTransition(
                transition_type = TransitionType.ZOOM_IN,
                duration = 350
            )
        }
    },
    {
        'path': '/dashboard',
        'component': DashboardHomePage,
        'meta':{
            'transition': RouteTransition(
                transition_type = TransitionType.FLIP_HORIZONTAL,
                duration = 350
            )
        }
    },
]

@Einswilli Einswilli merged commit 18e1f18 into master Jun 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants