Make new enum router less breaking
This commit is contained in:
1 parent
b51ffa0590
commit
61dc549ba1
16 files changed
+74
-63
No files matched your search
@@ -44,8 +44,8 @@ fn NavBar(cx: Scope) -> Element {
|
||||
render! {
|
||||
nav {
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "Home" } }
|
||||
li { Link { target: Route::BlogList {}, "Blog" } }
|
||||
li { Link { to: Route::Home {}, "Home" } }
|
||||
li { Link { to: Route::BlogList {}, "Blog" } }
|
||||
}
|
||||
}
|
||||
Outlet {}
|
||||
@@ -77,13 +77,13 @@ fn BlogList(cx: Scope) -> Element {
|
||||
ul {
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 1".into() },
|
||||
to: Route::BlogPost { name: "Blog post 1".into() },
|
||||
"Read the first blog post"
|
||||
}
|
||||
}
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 2".into() },
|
||||
to: Route::BlogPost { name: "Blog post 2".into() },
|
||||
"Read the second blog post"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ fn main() {}
|
||||
fn GoToDioxus(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: NavigationTarget::External("https://dioxuslabs.com".into()),
|
||||
to: NavigationTarget::External("https://dioxuslabs.com".into()),
|
||||
"ExternalTarget target"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,8 +48,8 @@ fn NavBar(cx: Scope) -> Element {
|
||||
render! {
|
||||
nav {
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "Home" } }
|
||||
li { Link { target: Route::BlogList {}, "Blog" } }
|
||||
li { Link { to: Route::Home {}, "Home" } }
|
||||
li { Link { to: Route::BlogList {}, "Blog" } }
|
||||
}
|
||||
}
|
||||
Outlet {}
|
||||
@@ -78,13 +78,13 @@ fn BlogList(cx: Scope) -> Element {
|
||||
ul {
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 1".into() },
|
||||
to: Route::BlogPost { name: "Blog post 1".into() },
|
||||
"Read the first blog post"
|
||||
}
|
||||
}
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 2".into() },
|
||||
to: Route::BlogPost { name: "Blog post 2".into() },
|
||||
"Read the second blog post"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ fn NavBar(cx: Scope) -> Element {
|
||||
Link {
|
||||
// The Link component will navigate to the route specified
|
||||
// in the target prop which is checked to exist at compile time
|
||||
target: Route::Home {},
|
||||
to: Route::Home {},
|
||||
"Home"
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -58,12 +58,12 @@ fn ClientList(cx: Scope) -> Element {
|
||||
h2 { "List of Clients" }
|
||||
|
||||
Link {
|
||||
target: Route::ClientAdd {},
|
||||
to: Route::ClientAdd {},
|
||||
class: "pure-button pure-button-primary",
|
||||
"Add Client"
|
||||
}
|
||||
Link {
|
||||
target: Route::Settings {},
|
||||
to: Route::Settings {},
|
||||
class: "pure-button",
|
||||
"Settings"
|
||||
}
|
||||
@@ -161,7 +161,7 @@ fn ClientAdd(cx: Scope) -> Element {
|
||||
"Save"
|
||||
}
|
||||
Link {
|
||||
target: Route::ClientList {},
|
||||
to: Route::ClientList {},
|
||||
class: "pure-button pure-button-primary red",
|
||||
"Cancel"
|
||||
}
|
||||
@@ -190,7 +190,7 @@ fn Settings(cx: Scope) -> Element {
|
||||
}
|
||||
|
||||
Link {
|
||||
target: Route::ClientList {},
|
||||
to: Route::ClientList {},
|
||||
class: "pure-button",
|
||||
"Go back"
|
||||
}
|
||||
|
||||
@@ -48,10 +48,10 @@ fn Footer(cx: Scope) -> Element {
|
||||
|
||||
nav {
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "Home" } }
|
||||
li { Link { target: Route::Games {}, "Games" } }
|
||||
li { Link { target: Route::Play {}, "Play" } }
|
||||
li { Link { target: Route::Settings {}, "Settings" } }
|
||||
li { Link { to: Route::Home {}, "Home" } }
|
||||
li { Link { to: Route::Games {}, "Games" } }
|
||||
li { Link { to: Route::Play {}, "Play" } }
|
||||
li { Link { to: Route::Settings {}, "Settings" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -43,8 +43,8 @@ fn Header(cx: Scope) -> Element {
|
||||
render! {
|
||||
h1 { "Your app here" }
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "home" } }
|
||||
li { Link { target: Route::Settings {}, "settings" } }
|
||||
li { Link { to: Route::Home {}, "home" } }
|
||||
li { Link { to: Route::Settings {}, "settings" } }
|
||||
}
|
||||
Outlet {}
|
||||
}
|
||||
|
||||
+4
-4
@@ -48,8 +48,8 @@ fn NavBar(cx: Scope) -> Element {
|
||||
render! {
|
||||
nav {
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "Home" } }
|
||||
li { Link { target: Route::BlogList {}, "Blog" } }
|
||||
li { Link { to: Route::Home {}, "Home" } }
|
||||
li { Link { to: Route::BlogList {}, "Blog" } }
|
||||
}
|
||||
}
|
||||
Outlet {}
|
||||
@@ -78,13 +78,13 @@ fn BlogList(cx: Scope) -> Element {
|
||||
ul {
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 1".into() },
|
||||
to: Route::BlogPost { name: "Blog post 1".into() },
|
||||
"Read the first blog post"
|
||||
}
|
||||
}
|
||||
li {
|
||||
Link {
|
||||
target: Route::BlogPost { name: "Blog post 2".into() },
|
||||
to: Route::BlogPost { name: "Blog post 2".into() },
|
||||
"Read the second blog post"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@ fn NavBar(cx: Scope) -> Element {
|
||||
render! {
|
||||
h1 { "Your app here" }
|
||||
ul {
|
||||
li { Link { target: Route::Home {}, "home" } }
|
||||
li { Link { target: Route::BlogList {}, "blog" } }
|
||||
li { Link { target: Route::BlogPost { post: "tim".into() }, "tims' blog" } }
|
||||
li { Link { target: Route::BlogPost { post: "bill".into() }, "bills' blog" } }
|
||||
li { Link { target: Route::BlogPost { post: "james".into() }, "james amazing' blog" } }
|
||||
li { Link { to: Route::Home {}, "home" } }
|
||||
li { Link { to: Route::BlogList {}, "blog" } }
|
||||
li { Link { to: Route::BlogPost { post: "tim".into() }, "tims' blog" } }
|
||||
li { Link { to: Route::BlogPost { post: "bill".into() }, "bills' blog" } }
|
||||
li { Link { to: Route::BlogPost { post: "james".into() }, "james amazing' blog" } }
|
||||
}
|
||||
Outlet {}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ fn BlogPost(cx: Scope, post: String) -> Element {
|
||||
render! {
|
||||
div {
|
||||
h3 { "blog post: {post}" }
|
||||
Link { target: Route::BlogList {}, "back to blog list" }
|
||||
Link { to: Route::BlogList {}, "back to blog list" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ enum Route {
|
||||
#[inline_props]
|
||||
fn Blog(cx: Scope, id: i32) -> Element {
|
||||
render! {
|
||||
Link { target: Route::Home {}, "Go to counter" }
|
||||
Link { to: Route::Home {}, "Go to counter" }
|
||||
table {
|
||||
tbody {
|
||||
for _ in 0..*id {
|
||||
@@ -50,7 +50,7 @@ fn Home(cx: Scope) -> Element {
|
||||
|
||||
cx.render(rsx! {
|
||||
Link {
|
||||
target: Route::Blog {
|
||||
to: Route::Blog {
|
||||
id: *count.get()
|
||||
},
|
||||
"Go to blog"
|
||||
|
||||
@@ -52,7 +52,7 @@ enum Route {
|
||||
#[inline_props]
|
||||
fn Blog(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link { target: Route::Home {}, "Go to counter" }
|
||||
Link { to: Route::Home {}, "Go to counter" }
|
||||
table {
|
||||
tbody {
|
||||
for _ in 0..100 {
|
||||
@@ -74,7 +74,7 @@ fn Home(cx: Scope) -> Element {
|
||||
|
||||
cx.render(rsx! {
|
||||
Link {
|
||||
target: Route::Blog {},
|
||||
to: Route::Blog {},
|
||||
"Go to blog"
|
||||
}
|
||||
div {
|
||||
|
||||
@@ -60,7 +60,7 @@ fn Index(cx: Scope) -> Element {
|
||||
render! {
|
||||
h1 { "Index" }
|
||||
Link {
|
||||
target: Route::BlogList {},
|
||||
to: Route::BlogList {},
|
||||
"Go to the blog"
|
||||
}
|
||||
}
|
||||
@@ -79,11 +79,11 @@ fn BlogList(cx: Scope) -> Element {
|
||||
render! {
|
||||
h2 { "List of blog posts" }
|
||||
Link {
|
||||
target: Route::BlogPost { blog_id: 0 },
|
||||
to: Route::BlogPost { blog_id: 0 },
|
||||
"Blog post 1"
|
||||
}
|
||||
Link {
|
||||
target: Route::BlogPost { blog_id: 1 },
|
||||
to: Route::BlogPost { blog_id: 1 },
|
||||
"Blog post 2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,12 +39,12 @@ fn Route1(cx: Scope, user_id: usize, dynamic: usize, query: String, extra: Strin
|
||||
"Route1{{\n\tuser_id:{user_id},\n\tdynamic:{dynamic},\n\tquery:{query},\n\textra:{extra}\n}}"
|
||||
}
|
||||
Link {
|
||||
target: Route::Route1 { user_id: *user_id, dynamic: *dynamic, query: String::new(), extra: extra.clone() + "." },
|
||||
to: Route::Route1 { user_id: *user_id, dynamic: *dynamic, query: String::new(), extra: extra.clone() + "." },
|
||||
"Route1 with extra+\".\""
|
||||
}
|
||||
p { "Footer" }
|
||||
Link {
|
||||
target: Route::Route3 { dynamic: String::new() },
|
||||
to: Route::Route3 { dynamic: String::new() },
|
||||
"Home"
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,7 @@ fn Route2(cx: Scope, user_id: usize) -> Element {
|
||||
(0..*user_id).map(|i| rsx!{ p { "{i}" } }),
|
||||
p { "Footer" }
|
||||
Link {
|
||||
target: Route::Route3 { dynamic: String::new() },
|
||||
to: Route::Route3 { dynamic: String::new() },
|
||||
"Home"
|
||||
}
|
||||
}
|
||||
@@ -86,7 +86,7 @@ fn Route3(cx: Scope, dynamic: String) -> Element {
|
||||
}
|
||||
"dynamic: {dynamic}"
|
||||
Link {
|
||||
target: Route::Route2 { user_id: 8888 },
|
||||
to: Route::Route2 { user_id: 8888 },
|
||||
"hello world link"
|
||||
}
|
||||
button {
|
||||
@@ -101,7 +101,7 @@ fn Route3(cx: Scope, dynamic: String) -> Element {
|
||||
if route != current_route {
|
||||
render! {
|
||||
Link {
|
||||
target: route.clone(),
|
||||
to: route.clone(),
|
||||
"{route}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ pub struct GenericLinkProps<'a, R: Routable> {
|
||||
pub rel: Option<&'a str>,
|
||||
/// The navigation target. Roughly equivalent to the href attribute of an HTML anchor tag.
|
||||
#[props(into)]
|
||||
pub target: NavigationTarget<R>,
|
||||
pub to: NavigationTarget<R>,
|
||||
}
|
||||
|
||||
impl<R: Routable> Debug for GenericLinkProps<'_, R> {
|
||||
@@ -56,7 +56,7 @@ impl<R: Routable> Debug for GenericLinkProps<'_, R> {
|
||||
.field("onclick", &self.onclick.as_ref().map(|_| "onclick is set"))
|
||||
.field("onclick_only", &self.onclick_only)
|
||||
.field("rel", &self.rel)
|
||||
.field("target", &self.target.to_string())
|
||||
.field("to", &self.to.to_string())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
@@ -106,7 +106,7 @@ impl<R: Routable> Debug for GenericLinkProps<'_, R> {
|
||||
/// id: "link_id",
|
||||
/// new_tab: true,
|
||||
/// rel: "link_rel",
|
||||
/// target: Route::Index {},
|
||||
/// to: Route::Index {},
|
||||
///
|
||||
/// "A fully configured link"
|
||||
/// }
|
||||
@@ -132,7 +132,7 @@ pub fn GenericLink<'a, R: Routable + Clone>(cx: Scope<'a, GenericLinkProps<'a, R
|
||||
onclick,
|
||||
onclick_only,
|
||||
rel,
|
||||
target,
|
||||
to,
|
||||
} = cx.props;
|
||||
|
||||
// hook up to router
|
||||
@@ -150,7 +150,7 @@ pub fn GenericLink<'a, R: Routable + Clone>(cx: Scope<'a, GenericLinkProps<'a, R
|
||||
|
||||
let current_route = router.current();
|
||||
let current_url = current_route.to_string();
|
||||
let href = target.to_string();
|
||||
let href = to.to_string();
|
||||
let ac = active_class
|
||||
.and_then(|active_class| (href == current_url).then(|| format!(" {active_class}")))
|
||||
.unwrap_or_default();
|
||||
@@ -159,7 +159,7 @@ pub fn GenericLink<'a, R: Routable + Clone>(cx: Scope<'a, GenericLinkProps<'a, R
|
||||
let class = format!("{}{ac}", class.unwrap_or_default());
|
||||
let tag_target = new_tab.then_some("_blank").unwrap_or_default();
|
||||
|
||||
let is_external = matches!(target, NavigationTarget::External(_));
|
||||
let is_external = matches!(to, NavigationTarget::External(_));
|
||||
let is_router_nav = !is_external && !new_tab;
|
||||
let prevent_default = is_router_nav.then_some("onclick").unwrap_or_default();
|
||||
let rel = rel
|
||||
@@ -169,7 +169,7 @@ pub fn GenericLink<'a, R: Routable + Clone>(cx: Scope<'a, GenericLinkProps<'a, R
|
||||
let do_default = onclick.is_none() || !onclick_only;
|
||||
let action = move |event| {
|
||||
if do_default && is_router_nav {
|
||||
router.push(target.clone());
|
||||
router.push(to.clone());
|
||||
}
|
||||
|
||||
if let Some(handler) = onclick {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
//! Types pertaining to navigation.
|
||||
|
||||
use std::{
|
||||
convert::TryFrom,
|
||||
fmt::{Debug, Display},
|
||||
str::FromStr,
|
||||
};
|
||||
@@ -55,11 +54,23 @@ pub enum NavigationTarget<R: Routable> {
|
||||
External(String),
|
||||
}
|
||||
|
||||
impl<R: Routable> TryFrom<&str> for NavigationTarget<R> {
|
||||
type Error = NavigationTargetParseError<R>;
|
||||
impl<R: Routable> From<&str> for NavigationTarget<R> {
|
||||
fn from(value: &str) -> Self {
|
||||
value
|
||||
.parse()
|
||||
.unwrap_or_else(|_| Self::External(value.to_string()))
|
||||
}
|
||||
}
|
||||
|
||||
fn try_from(value: &str) -> Result<Self, Self::Error> {
|
||||
value.parse()
|
||||
impl<R: Routable> From<&String> for NavigationTarget<R> {
|
||||
fn from(value: &String) -> Self {
|
||||
value.as_str().into()
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Routable> From<String> for NavigationTarget<R> {
|
||||
fn from(value: String) -> Self {
|
||||
value.as_str().into()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ fn href_internal() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
"Link"
|
||||
}
|
||||
}
|
||||
@@ -97,7 +97,7 @@ fn href_external() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: NavigationTarget::External("https://dioxuslabs.com/".into()),
|
||||
to: NavigationTarget::External("https://dioxuslabs.com/".into()),
|
||||
"Link"
|
||||
}
|
||||
}
|
||||
@@ -135,7 +135,7 @@ fn with_class() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
class: "test_class",
|
||||
"Link"
|
||||
}
|
||||
@@ -167,7 +167,7 @@ fn with_active_class_active() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Root {},
|
||||
to: Route::Root {},
|
||||
active_class: "active_class",
|
||||
class: "test_class",
|
||||
"Link"
|
||||
@@ -207,7 +207,7 @@ fn with_active_class_inactive() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
active_class: "active_class",
|
||||
class: "test_class",
|
||||
"Link"
|
||||
@@ -247,7 +247,7 @@ fn with_id() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
id: "test_id",
|
||||
"Link"
|
||||
}
|
||||
@@ -286,7 +286,7 @@ fn with_new_tab() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
new_tab: true,
|
||||
"Link"
|
||||
}
|
||||
@@ -318,7 +318,7 @@ fn with_new_tab_external() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: NavigationTarget::External("https://dioxuslabs.com/".into()),
|
||||
to: NavigationTarget::External("https://dioxuslabs.com/".into()),
|
||||
new_tab: true,
|
||||
"Link"
|
||||
}
|
||||
@@ -357,7 +357,7 @@ fn with_rel() {
|
||||
fn Root(cx: Scope) -> Element {
|
||||
render! {
|
||||
Link {
|
||||
target: Route::Test {},
|
||||
to: Route::Test {},
|
||||
rel: "test_rel",
|
||||
"Link"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user