From a39fee9297232efe730c836be98ad9b4b4fcdb0a Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 24 Jun 2023 01:02:27 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A5=20Cambia=20renderizar=20por=20prep?= =?UTF-8?q?arar=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/action.rs | 4 +- ...omponent.rs => after_prepare_component.rs} | 14 ++-- .../base/action/before_prepare_component.rs | 67 +++++++++++++++++++ pagetop/src/base/component/block.rs | 10 +-- pagetop/src/base/component/html.rs | 2 +- pagetop/src/base/component/l10n.rs | 2 +- pagetop/src/core/component/bundle.rs | 4 +- pagetop/src/core/component/definition.rs | 38 +++++++---- pagetop/src/core/component/one.rs | 8 +-- pagetop/src/core/theme/definition.rs | 22 +++++- pagetop/src/prelude.rs | 2 +- pagetop/src/response/fatal_error/error403.rs | 2 +- pagetop/src/response/fatal_error/error404.rs | 2 +- pagetop/src/response/page/definition.rs | 6 +- 14 files changed, 142 insertions(+), 41 deletions(-) rename pagetop/src/base/action/{before_render_component.rs => after_prepare_component.rs} (81%) create mode 100644 pagetop/src/base/action/before_prepare_component.rs diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs index 512a2d69..de26ffe3 100644 --- a/pagetop/src/base/action.rs +++ b/pagetop/src/base/action.rs @@ -1 +1,3 @@ -mod before_render_component; +mod before_prepare_component; + +mod after_prepare_component; diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/after_prepare_component.rs similarity index 81% rename from pagetop/src/base/action/before_render_component.rs rename to pagetop/src/base/action/after_prepare_component.rs index e0a56aed..44a9a4d5 100644 --- a/pagetop/src/base/action/before_render_component.rs +++ b/pagetop/src/base/action/after_prepare_component.rs @@ -1,19 +1,19 @@ #[macro_export] -macro_rules! action_before_render_component { +macro_rules! action_after_prepare_component { ( $ACTION_HANDLE:ident for $Component:ty ) => { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut RenderContext); - pub struct [] { + pub struct [] { action: Option, weight: isize, } - impl ActionTrait for [] { + impl ActionTrait for [] { fn new() -> Self { - [] { + [] { action: None, weight: 0, } @@ -32,7 +32,7 @@ macro_rules! action_before_render_component { } } - impl [] { + impl [] { #[allow(dead_code)] pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); @@ -53,12 +53,12 @@ macro_rules! action_before_render_component { } #[inline(always)] - pub fn run_actions_before_render_component( + pub fn run_actions_after_prepare_component( component: &mut $Component, rcx: &mut RenderContext ) { run_actions($ACTION_HANDLE, |action| - action_ref::<[]>(&**action) + action_ref::<[]>(&**action) .run(component, rcx) ); } diff --git a/pagetop/src/base/action/before_prepare_component.rs b/pagetop/src/base/action/before_prepare_component.rs new file mode 100644 index 00000000..e0ed8eee --- /dev/null +++ b/pagetop/src/base/action/before_prepare_component.rs @@ -0,0 +1,67 @@ +#[macro_export] +macro_rules! action_before_prepare_component { + ( $ACTION_HANDLE:ident for $Component:ty ) => { + $crate::paste! { + $crate::use_handle!($ACTION_HANDLE); + + type Action = fn(&$Component, &mut RenderContext); + + pub struct [] { + action: Option, + weight: isize, + } + + impl ActionTrait for [] { + fn new() -> Self { + [] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + $ACTION_HANDLE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [] { + #[allow(dead_code)] + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + if let Some(action) = self.action { + action(component, rcx) + } + } + } + + #[inline(always)] + pub fn run_actions_before_prepare_component( + component: &mut $Component, + rcx: &mut RenderContext + ) { + run_actions($ACTION_HANDLE, |action| + action_ref::<[]>(&**action) + .run(component, rcx) + ); + } + } + }; +} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index dfdd74f5..3275676c 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use_handle!(COMPONENT_BLOCK); -action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK for Block); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_BLOCK for Block); #[rustfmt::skip] #[derive(Default)] @@ -37,11 +37,11 @@ impl ComponentTrait for Block { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let id = rcx.required_id::(self.id()); html! { div id=(id) class=[self.classes().get()] { @@ -49,7 +49,7 @@ impl ComponentTrait for Block { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index eae2ba21..e1a53268 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -14,7 +14,7 @@ impl ComponentTrait for Html { COMPONENT_HTML } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { html! { (self.html()) } } diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index 79f181e7..598794c5 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -28,7 +28,7 @@ impl ComponentTrait for L10n { COMPONENT_L10N } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { match self.op() { L10nOp::None => html! {}, L10nOp::Text(text) => html! { (text) }, diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 06cba0a2..8ceccbd0 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -116,12 +116,12 @@ impl ComponentsBundle { // ComponentsBundle RENDER. - pub fn render(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().render(rcx))(" ") + (" ")(c.write().unwrap().prepare(rcx))(" ") } } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index fc7851e0..60609203 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -5,7 +5,7 @@ use crate::{util, Handle}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn render(&mut self, rcx: &mut RenderContext) -> Markup; + fn prepare(&mut self, rcx: &mut RenderContext) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -37,32 +37,44 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, rcx: &mut RenderContext) {} + fn before_prepare(&mut self, rcx: &mut RenderContext) {} #[allow(unused_variables)] - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { html! {} } + #[allow(unused_variables)] + fn after_prepare(&mut self, rcx: &mut RenderContext) {} + fn as_ref_any(&self) -> &dyn AnyComponent; fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } impl BaseComponent for C { - fn render(&mut self, rcx: &mut RenderContext) -> Markup { - // Acciones del componente antes de renderizar. - self.before_render(rcx); + fn prepare(&mut self, rcx: &mut RenderContext) -> Markup { + if self.is_renderable(rcx) { + // Acciones antes de preparar el componente. + self.before_prepare(rcx); - // Acciones del tema antes de renderizar el componente. - rcx.theme().before_render_component(self, rcx); + // Acciones del tema antes de preparar el componente. + rcx.theme().before_prepare_component(self, rcx); - match self.is_renderable(rcx) { - true => match rcx.theme().render_component(self, rcx) { + let markup = match rcx.theme().render_component(self, rcx) { Some(html) => html, - None => self.default_render(rcx), - }, - false => html! {}, + None => self.prepare_component(rcx), + }; + + // Acciones después de preparar el componente. + self.after_prepare(rcx); + + // Acciones del tema después de preparar el componente. + rcx.theme().after_prepare_component(self, rcx); + + markup + } else { + html! {} } } } diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index bafa3b0b..79aefa48 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -21,16 +21,16 @@ impl OneComponent { // OneComponent RENDER. - pub fn render(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { if let Some(component) = &self.0 { - return component.write().unwrap().render(rcx); + return component.write().unwrap().prepare(rcx); } html! {} } - pub fn optional_render(&self, rcx: &mut RenderContext) -> Option { + pub fn prepare_optional(&self, rcx: &mut RenderContext) -> Option { if let Some(component) = &self.0 { - let render = component.write().unwrap().render(rcx).into_string(); + let render = component.write().unwrap().prepare(rcx).into_string(); if !render.trim().is_empty() { return Some(html! { (render) }); } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 8a344a1c..c68bea0d 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -80,7 +80,27 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { #[rustfmt::skip] #[allow(unused_variables)] - fn before_render_component( + fn before_prepare_component( + &self, + component: &mut dyn ComponentTrait, + rcx: &mut RenderContext, + ) { + /* + Cómo usarlo: + + match component.handle() { + BLOCK_COMPONENT => { + let block = component_mut::(component); + block.alter_title("New title"); + }, + _ => {}, + } + */ + } + + #[rustfmt::skip] + #[allow(unused_variables)] + fn after_prepare_component( &self, component: &mut dyn ComponentTrait, rcx: &mut RenderContext, diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e3b10012..ae67e289 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -30,7 +30,7 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::core::{action::*, component::*, module::*, theme::*}; -pub use crate::{action, action_before_render_component}; +pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; pub use crate::base::component::*; diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index e0f6018d..1bf38614 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -15,7 +15,7 @@ impl ComponentTrait for Error403 { ERROR_403 } - fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { html! { div { h1 { ("FORBIDDEN ACCESS") } diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index edd83420..5db72178 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -15,7 +15,7 @@ impl ComponentTrait for Error404 { ERROR_404 } - fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { html! { div { h1 { ("RESOURCE NOT FOUND") } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 41f01a84..9925e5bb 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -121,11 +121,11 @@ impl Page { } pub fn title(&mut self) -> String { - self.title.render(&mut self.context).into_string() + self.title.prepare(&mut self.context).into_string() } pub fn description(&mut self) -> String { - self.description.render(&mut self.context).into_string() + self.description.prepare(&mut self.context).into_string() } pub fn metadata(&self) -> &Vec<(&str, &str)> { @@ -196,7 +196,7 @@ impl Page { let render = self .regions .get_extended_bundle(self.context.theme().single_name(), region) - .render(self.context()); + .prepare(self.context()); if render.is_empty() { None } else {