Zwei Router: WorkspaceRoute (Workspace anlegen/oeffnen) und EditorRoute (Home/Editor), umgeschaltet ueber ein Signal in App. Die Navigationslinks werden nicht mehr einzeln ausgeschrieben, sondern aus dem Routen-Enum erzeugt (strum EnumIter). Die Beschriftung haengt per #[strum(message = "...")] an der Variante selbst, damit eine neue Route nur an einer Stelle gepflegt werden muss. CustomLink kapselt Link und markiert den aktiven Eintrag ueber active_class statt ueber eigenen Klick-Zustand - das funktioniert auch bei Deep-Links und dem Zurueck-Button.
62 lines
1.5 KiB
Rust
62 lines
1.5 KiB
Rust
use dioxus::prelude::*;
|
|
use strum::{EnumMessage, IntoEnumIterator};
|
|
use strum_macros::EnumIter;
|
|
use crate::components::custom_link::custom_link_component::CustomLink;
|
|
|
|
#[derive(Debug, Clone, Routable, PartialEq, EnumIter, EnumMessage)]
|
|
#[rustfmt::skip]
|
|
pub enum WorkspaceRoute {
|
|
#[layout(Workspace)]
|
|
#[route("/")]
|
|
#[strum(message = "Create new Workspace")]
|
|
NewWorkspace {},
|
|
#[route("/ws_open")]
|
|
#[strum(message = "Open Workspace")]
|
|
OpenWorkspace {},
|
|
}
|
|
|
|
/// Page to create new Workspace
|
|
#[component]
|
|
fn NewWorkspace() -> Element {
|
|
rsx! {
|
|
div {
|
|
"New Workspace",
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Page to open available Workspaces
|
|
#[component]
|
|
fn OpenWorkspace() -> Element {
|
|
rsx! {
|
|
div {
|
|
"Open Workspace",
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Workspace Layout
|
|
#[component]
|
|
fn Workspace() -> Element {
|
|
rsx! {
|
|
div {
|
|
class: "workspace-selector-layout",
|
|
div {
|
|
class: "workspace-selector-links",
|
|
for route in WorkspaceRoute::iter() {
|
|
CustomLink {
|
|
key: "{route}",
|
|
label: route.get_message().unwrap_or_default(),
|
|
href: route.clone(),
|
|
css: "workspace-selector",
|
|
}
|
|
}
|
|
}
|
|
div {
|
|
class: "workspace-selector-view",
|
|
Outlet::<WorkspaceRoute> { }
|
|
}
|
|
}
|
|
}
|
|
}
|