diff --git a/examples/v0/src/main.rs b/examples/v0/src/main.rs index 47e17c5..ee33c58 100644 --- a/examples/v0/src/main.rs +++ b/examples/v0/src/main.rs @@ -37,6 +37,18 @@ struct TodoItem { title: String, } +#[derive(Hemplate)] +struct PageSwap { + content: SafeHtml, + title: &'static str, +} + +#[derive(Hemplate)] +#[hemplate = "partials"] +struct DocsContent { + message: &'static str, +} + #[tokio::main] async fn main() { let state = Arc::new(ExampleState::default()); @@ -63,16 +75,7 @@ async fn home(request: PageRequest) -> impl IntoResponse { // req: page_swap/002, req: examples/001 async fn docs(request: PageRequest) -> impl IntoResponse { - let partial = ui::page_swap::lower_html( - r#"
- -

Docs

This page was swapped without a full reload.

- Docs -
"#, - ); + let partial = render_page_swap("Docs", "This page was swapped without a full reload."); request .page(partial, shell) .title("Docs") @@ -155,8 +158,8 @@ fn registry(state: Arc) -> HandlerRegistry { .register(ui::page_swap::handles::load_docs.id().id, |_| { // req: page_swap/002, req: examples/001 ( - ui::page_swap::slots::content.html(SafeHtml::trusted( - "

Docs

This content came from an EffectBatch.

", + ui::page_swap::slots::content.html(render_docs_content( + "This content came from an EffectBatch.", )), ui::page_swap::slots::title.text("Docs"), push("/docs"), @@ -170,7 +173,7 @@ fn all_examples() -> String { ui::todos::lower_html(include_str!("../templates/todos.heml")), ui::wizard::lower_html(include_str!("../templates/wizard.heml")), ui::auth::lower_html(include_str!("../templates/auth.heml")), - ui::page_swap::lower_html(include_str!("../templates/page_swap.heml")), + render_page_swap("Welcome", "Welcome"), ui::notifications::lower_html(include_str!("../templates/notifications.heml")), ] .join("\n") @@ -214,8 +217,25 @@ fn render_todos(todos: &[Todo]) -> SafeHtml { }) } +fn render_page_swap(title: &'static str, message: &'static str) -> String { + // req: html_safety/002 req: view/001 + ui::page_swap::lower_html(render_template(&PageSwap { + content: render_docs_content(message), + title, + })) +} + +fn render_docs_content(message: &'static str) -> SafeHtml { + // req: html_safety/002 req: view/001 + render_html(&DocsContent { message }) +} + fn render_html(template: &impl Hemplate) -> SafeHtml { - SafeHtml::trusted(template.render().expect("v0 hemplate partial renders")) + SafeHtml::trusted(render_template(template)) +} + +fn render_template(template: &impl Hemplate) -> String { + template.render().expect("v0 hemplate view renders") } #[cfg(test)] @@ -227,6 +247,43 @@ mod tests { Selector::parse(value).expect("test selector parses") } + // req: html_safety/002 req: view/001 req: test/005 + #[test] + fn docs_content_payload_is_rendered_by_a_hemplate_view() { + let html = render_docs_content("This content came from an EffectBatch."); + let document = Html::parse_fragment(html.as_str()); + assert_eq!( + document + .select(&selector("h1")) + .next() + .map(|heading| heading.text().collect::()), + Some("Docs".to_owned()) + ); + assert_eq!( + document + .select(&selector("p")) + .next() + .map(|paragraph| paragraph.text().collect::()), + Some("This content came from an EffectBatch.".to_owned()) + ); + } + + // req: html_safety/002 req: view/001 req: test/005 + #[test] + fn docs_page_partial_is_rendered_by_a_hemplate_view() { + let html = render_page_swap("Docs", "This page was swapped without a full reload."); + let document = Html::parse_fragment(&html); + assert_eq!(document.select(&selector("main[data-slhx-root=\"docs\"]")).count(), 1); + assert_eq!(document.select(&selector("article[data-sid]")).count(), 1); + assert_eq!( + document + .select(&selector("article h1")) + .next() + .map(|heading| heading.text().collect::()), + Some("Docs".to_owned()) + ); + } + // req: html_safety/002 req: view/001 req: test/005 #[test] fn todos_payload_is_rendered_by_a_hemplate_view() { diff --git a/examples/v0/templates/page_swap.heml b/examples/v0/templates/page_swap.heml index 6ddbb54..7269647 100644 --- a/examples/v0/templates/page_swap.heml +++ b/examples/v0/templates/page_swap.heml @@ -2,6 +2,6 @@ -
Welcome
- Welcome +
{+= self.content =+}
+ {+ self.title +} diff --git a/examples/v0/templates/partials/docs_content.heml b/examples/v0/templates/partials/docs_content.heml new file mode 100644 index 0000000..6c5b734 --- /dev/null +++ b/examples/v0/templates/partials/docs_content.heml @@ -0,0 +1 @@ +

Docs

{+ self.message +}