skill_web/
router.rs

1//! Application routing configuration
2//!
3//! Defines all routes and provides navigation utilities.
4
5use yew::prelude::*;
6use yew_router::prelude::*;
7
8use crate::pages::{
9    analytics::AnalyticsPage,
10    dashboard::DashboardPage,
11    skills::SkillsPage,
12    skill_detail::SkillDetailPage,
13    run::RunPage,
14    history::HistoryPage,
15    settings::SettingsPage,
16    search_test::SearchTestPage,
17    onboarding::OnboardingPage,
18    not_found::NotFoundPage,
19};
20
21/// Application routes
22#[derive(Clone, Routable, PartialEq, Debug)]
23pub enum Route {
24    /// Dashboard - main overview page
25    #[at("/")]
26    Dashboard,
27
28    /// Skills browser - list and search skills
29    #[at("/skills")]
30    Skills,
31
32    /// Skill detail - view specific skill
33    #[at("/skills/:name")]
34    SkillDetail { name: String },
35
36    /// Skill instance configuration
37    #[at("/skills/:name/instances/:instance")]
38    SkillInstance { name: String, instance: String },
39
40    /// Run interface - execute skill tools
41    #[at("/run")]
42    Run,
43
44    /// Run with pre-selected skill
45    #[at("/run/:skill")]
46    RunSkill { skill: String },
47
48    /// Run with pre-selected skill and tool
49    #[at("/run/:skill/:tool")]
50    RunSkillTool { skill: String, tool: String },
51
52    /// Execution history
53    #[at("/history")]
54    History,
55
56    /// Execution detail
57    #[at("/history/:id")]
58    HistoryDetail { id: String },
59
60    /// Settings page
61    #[at("/settings")]
62    Settings,
63
64    /// Search testing page
65    #[at("/search-test")]
66    SearchTest,
67
68    /// Analytics dashboard
69    #[at("/analytics")]
70    Analytics,
71
72    /// Onboarding wizard
73    #[at("/onboarding")]
74    Onboarding,
75
76    /// Onboarding step
77    #[at("/onboarding/:step")]
78    OnboardingStep { step: String },
79
80    /// 404 - Not found
81    #[not_found]
82    #[at("/404")]
83    NotFound,
84}
85
86/// Switch function to render the appropriate page based on route
87pub fn switch(route: Route) -> Html {
88    match route {
89        Route::Dashboard => html! { <DashboardPage /> },
90        Route::Skills => html! { <SkillsPage /> },
91        Route::SkillDetail { name } => html! { <SkillDetailPage {name} /> },
92        Route::SkillInstance { name, instance } => html! {
93            <SkillDetailPage {name} selected_instance={Some(instance)} />
94        },
95        Route::Run => html! { <RunPage /> },
96        Route::RunSkill { skill } => html! { <RunPage selected_skill={Some(skill)} /> },
97        Route::RunSkillTool { skill, tool } => html! {
98            <RunPage selected_skill={Some(skill)} selected_tool={Some(tool)} />
99        },
100        Route::History => html! { <HistoryPage /> },
101        Route::HistoryDetail { id } => html! { <HistoryPage selected_id={Some(id)} /> },
102        Route::Settings => html! { <SettingsPage /> },
103        Route::SearchTest => html! { <SearchTestPage /> },
104        Route::Analytics => html! { <AnalyticsPage /> },
105        Route::Onboarding => html! { <OnboardingPage /> },
106        Route::OnboardingStep { step } => html! { <OnboardingPage {step} /> },
107        Route::NotFound => html! { <NotFoundPage /> },
108    }
109}
110
111/// Get the display name for a route (for breadcrumbs, etc.)
112impl Route {
113    pub fn display_name(&self) -> &'static str {
114        match self {
115            Route::Dashboard => "Dashboard",
116            Route::Skills => "Skills",
117            Route::SkillDetail { .. } => "Skill Details",
118            Route::SkillInstance { .. } => "Instance Configuration",
119            Route::Run | Route::RunSkill { .. } | Route::RunSkillTool { .. } => "Run",
120            Route::History | Route::HistoryDetail { .. } => "History",
121            Route::Settings => "Settings",
122            Route::SearchTest => "Search Test",
123            Route::Analytics => "Analytics",
124            Route::Onboarding | Route::OnboardingStep { .. } => "Setup",
125            Route::NotFound => "Not Found",
126        }
127    }
128
129    /// Check if this route should show the sidebar
130    pub fn show_sidebar(&self) -> bool {
131        !matches!(self, Route::Onboarding | Route::OnboardingStep { .. })
132    }
133}