From 53dd1f24c7cffe369be70aa71b90e8fe44d64f6f Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 2 Apr 2022 09:21:43 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1ade=20la=20funci=C3=B3n=20arc()=20para?= =?UTF-8?q?=20capturar=20el=20componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recibe un componente mutable que podría modificarse justo antes de ser añadido a un contenedor. Es una posible solución para poder desarrollar un mecanismo aceptable de Triggers/Hooks/Actions (THA) para PageTop. --- pagetop-admin/src/summary.rs | 7 +++--- pagetop-user/src/lib.rs | 8 +++++-- pagetop/src/base/component/container.rs | 2 +- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/menu.rs | 2 +- pagetop/src/base/module/demopage/mod.rs | 28 ++++++++++++----------- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/response/page/component.rs | 9 ++++++++ pagetop/src/response/page/container.rs | 12 ++++------ pagetop/src/response/page/mod.rs | 2 +- pagetop/src/response/page/page.rs | 6 ++--- pagetop/src/theme/definition.rs | 2 +- 14 files changed, 50 insertions(+), 36 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index b91b97fa..6e6f2158 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -38,17 +38,18 @@ pub async fn summary() -> app::Result { .with_title("Admin") - .add_to("top-menu", top_menu) + .add_to("top-menu", top_menu.arc()) .add_to("content", grid::Row::new() .add_column(grid::Column::new() - .add(side_menu) + .add(side_menu.arc()) ) .add_column(grid::Column::new() .add(Chunck::with(html! { p { "Columna 2"} - })) + }).arc()) ) + .arc() ) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index dd0b362b..414fb3e4 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -31,7 +31,7 @@ impl ModuleTrait for UserModule { } } -fn form_login() -> impl PageComponent { +fn form_login() -> ArcComponent { Form::new() .with_id("user-login") .add(form::Input::textfield() @@ -41,13 +41,16 @@ fn form_login() -> impl PageComponent { "app" => SETTINGS.app.name.to_owned() ]).as_str()) .with_autofocus(true) + .arc() ) .add(form::Input::password() .with_name("pass") .with_label(l("password").as_str()) .with_help_text(l("password_help").as_str()) + .arc() ) - .add(form::Button::submit(l("login").as_str())) + .add(form::Button::submit(l("login").as_str()).arc()) + .arc() } async fn login() -> app::Result { @@ -58,6 +61,7 @@ async fn login() -> app::Result { .add_to("content", Container::new() .with_id("welcome") .add(form_login()) + .arc() ) .render() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index b85288af..2e48ba10 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -109,7 +109,7 @@ impl Container { self } - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: ArcComponent) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index e5169ff3..9317f9eb 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -85,7 +85,7 @@ impl Form { self } - pub fn add(mut self, element: impl PageComponent) -> Self { + pub fn add(mut self, element: ArcComponent) -> Self { self.elements.add(element); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index c8594642..a007c83b 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -56,7 +56,7 @@ impl Column { self } - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: ArcComponent) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 03a39e39..2a185894 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -57,7 +57,7 @@ impl Row { } pub fn add_column(mut self, column: grid::Column) -> Self { - self.columns.add(column); + self.columns.add(column.arc()); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index daabdd60..3f2b4ff4 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -222,7 +222,7 @@ impl Menu { } pub fn add(mut self, item: MenuItem) -> Self { - self.items.add(item); + self.items.add(item.arc()); self } diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 489b6d3b..d71c7176 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -35,7 +35,7 @@ async fn demo() -> app::Result { .render() } -fn hello_world() -> Container { +fn hello_world() -> ArcComponent { Container::header() .add(grid::Row::new() .add_column(grid::Column::new() @@ -68,15 +68,17 @@ fn hello_world() -> Container { i class="fas fa-paper-plane" {} "Get quote" } - })) + }).arc()) ) .add_column(grid::Column::new() - .add(Image::image("/bootsier/images/demo-header.svg")) + .add(Image::image("/bootsier/images/demo-header.svg").arc()) ) + .arc() ) + .arc() } -fn hello_world_original() -> Chunck { +fn hello_world_original() -> ArcComponent { Chunck::with(html! { header id="header" class="header" { div class="container" { @@ -121,10 +123,10 @@ fn hello_world_original() -> Chunck { } } } - }) + }).arc() } -fn just_visiting() -> Chunck { +fn just_visiting() -> ArcComponent { Chunck::with(html! { div id="details" class="basic-1" { div class="container" { @@ -151,10 +153,10 @@ fn just_visiting() -> Chunck { } } } - }) + }).arc() } -fn about_pagetop() -> Chunck { +fn about_pagetop() -> ArcComponent { Chunck::with(html! { div id="pagetop" class="basic-2" { div class="container" { @@ -175,10 +177,10 @@ fn about_pagetop() -> Chunck { } } } - }) + }).arc() } -fn promo_pagetop() -> Chunck { +fn promo_pagetop() -> ArcComponent { Chunck::with(html! { div id="promo" class="basic-3" { div class="container" { @@ -200,10 +202,10 @@ fn promo_pagetop() -> Chunck { } } } - }) + }).arc() } -fn reporting_problems() -> Chunck { +fn reporting_problems() -> ArcComponent { Chunck::with(html! { div id="reporting" class="basic-4" { div class="container" { @@ -223,5 +225,5 @@ fn reporting_problems() -> Chunck { } } } - }) + }).arc() } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 90111723..b169351d 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -77,7 +77,7 @@ impl ThemeTrait for BootsierTheme { } } } - })) + }).arc()) .render() } } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 630b8a9b..b9a920d3 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -3,8 +3,11 @@ use crate::response::page::PageAssets; use downcast_rs::{Downcast, impl_downcast}; +use std::sync::Arc; use std::any::type_name; +pub type ArcComponent = Arc; + pub trait PageComponent: Downcast + Send + Sync { fn new() -> Self where Self: Sized; @@ -33,6 +36,12 @@ pub trait PageComponent: Downcast + Send + Sync { 0 } + #[allow(unused_mut)] + fn arc(mut self) -> ArcComponent where Self: Sized { + let component = self; + Arc::new(component) + } + #[allow(unused_variables)] fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/response/page/container.rs index 72287560..7e5d4953 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,24 +1,22 @@ use crate::html::{Markup, html}; -use crate::response::page::{PageAssets, PageComponent, render_component}; - -use std::sync::Arc; +use crate::response::page::{ArcComponent, PageAssets, render_component}; #[derive(Clone)] -pub struct PageContainer(Vec>); +pub struct PageContainer(Vec); impl PageContainer { pub fn new() -> Self { PageContainer(Vec::new()) } - pub fn new_with(component: impl PageComponent) -> Self { + pub fn new_with(component: ArcComponent) -> Self { let mut container = PageContainer::new(); container.add(component); container } - pub fn add(&mut self, component: impl PageComponent) { - self.0.push(Arc::new(component)); + pub fn add(&mut self, component: ArcComponent) { + self.0.push(component); } pub fn render(&self, assets: &mut PageAssets) -> Markup { diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index f34070e2..63c19a47 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,7 @@ pub use assets::{ }; mod component; -pub use component::PageComponent; +pub use component::{ArcComponent, PageComponent}; mod container; pub use container::PageContainer; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index cb561626..5cbe80cb 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,7 +1,7 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::{Classes, DOCTYPE, Markup, OptAttr, html}; -use crate::response::page::{PageAssets, PageComponent, PageContainer}; +use crate::response::page::*; use std::sync::RwLock; use std::collections::HashMap; @@ -100,7 +100,7 @@ impl<'a> Page<'a> { pub fn add_to( &mut self, region: &'a str, - component: impl PageComponent + component: ArcComponent ) -> &mut Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); @@ -205,7 +205,7 @@ pub fn render_component( } } -pub fn add_component_to(region: &'static str, component: impl PageComponent) { +pub fn add_component_to(region: &'static str, component: ArcComponent) { let mut hmap = COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index acc30f47..db4c0e37 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -104,7 +104,7 @@ pub trait ThemeTrait: Send + Sync { div { h1 { (s) } } - })) + }).arc()) .render() } }