Modifica identificador por handler()

This commit is contained in:
Manuel Cillero 2022-05-07 23:16:00 +02:00
parent e8226daa4b
commit 68a347382d
40 changed files with 200 additions and 152 deletions

View file

@ -1,5 +1,7 @@
use pagetop::prelude::*; use pagetop::prelude::*;
pub const ADMIN_MODULE: &str = "pagetop-admin::module::admin";
localize!("src/locales"); localize!("src/locales");
mod summary; mod summary;
@ -7,6 +9,10 @@ mod summary;
pub struct Admin; pub struct Admin;
impl ModuleTrait for Admin { impl ModuleTrait for Admin {
fn handler(&self) -> &'static str {
ADMIN_MODULE
}
fn name(&self) -> String { fn name(&self) -> String {
l("module_name") l("module_name")
} }

View file

@ -1,5 +1,7 @@
use pagetop::prelude::*; use pagetop::prelude::*;
pub const NODE_MODULE: &str = "pagetop-node::module::node";
localize!("src/locales"); localize!("src/locales");
//mod entity; //mod entity;
@ -8,6 +10,10 @@ mod migration;
pub struct Node; pub struct Node;
impl ModuleTrait for Node { impl ModuleTrait for Node {
fn handler(&self) -> &'static str {
NODE_MODULE
}
fn name(&self) -> String { fn name(&self) -> String {
l("module_name") l("module_name")
} }

View file

@ -1,5 +1,7 @@
use pagetop::prelude::*; use pagetop::prelude::*;
pub const USER_MODULE: &str = "pagetop-user::module::user";
localize!("src/locales"); localize!("src/locales");
mod migration; mod migration;
@ -7,6 +9,10 @@ mod migration;
pub struct User; pub struct User;
impl ModuleTrait for User { impl ModuleTrait for User {
fn handler(&self) -> &'static str {
USER_MODULE
}
fn name(&self) -> String { fn name(&self) -> String {
l("module_name") l("module_name")
} }

View file

@ -1,30 +1,26 @@
use crate::Lazy; use crate::Lazy;
use crate::api::TypeId;
use super::{ActionItem, ActionsHolder}; use super::{ActionItem, ActionsHolder};
use std::sync::RwLock; use std::sync::RwLock;
use std::collections::HashMap; use std::collections::HashMap;
// Registered actions. // Registered actions.
static ACTIONS: Lazy<RwLock<HashMap<TypeId, ActionsHolder>>> = Lazy::new(|| { static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| {
RwLock::new(HashMap::new()) RwLock::new(HashMap::new())
}); });
pub fn add_action(action: ActionItem) { pub fn add_action(action: ActionItem) {
let mut hmap = ACTIONS.write().unwrap(); let mut hmap = ACTIONS.write().unwrap();
let action_id = action.type_id(); let action_handler = action.handler();
if let Some(actions) = hmap.get_mut(&action_id) { if let Some(actions) = hmap.get_mut(action_handler) {
actions.add(action); actions.add(action);
} else { } else {
hmap.insert(action_id, ActionsHolder::new_with(action)); hmap.insert(action_handler, ActionsHolder::new_with(action));
} }
} }
pub fn run_actions<B, F>(action_id: TypeId, f: F) pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&ActionItem) -> B {
where if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) {
F: FnMut(&ActionItem) -> B
{
if let Some(actions) = ACTIONS.read().unwrap().get(&action_id) {
actions.iter_map(f) actions.iter_map(f)
} }
} }

View file

@ -3,6 +3,8 @@ pub use std::any::Any as AnyAction;
pub trait ActionTrait: AnyAction + Send + Sync { pub trait ActionTrait: AnyAction + Send + Sync {
fn new() -> Self where Self: Sized; fn new() -> Self where Self: Sized;
fn handler(&self) -> &'static str;
fn weight(&self) -> isize { fn weight(&self) -> isize {
0 0
} }

View file

@ -1,19 +1,25 @@
use crate::api::action::{ActionTrait, AnyAction}; use crate::api::action::{ActionTrait, AnyAction};
use super::{Assets, ComponentTrait}; use super::{Assets, ComponentTrait};
pub struct ActionBeforeRenderComponent { pub const BEFORE_RENDER_COMPONENT_ACTION: &str = "pagetop::action::before_render_component";
pub struct BeforeRenderComponentAction {
action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>,
weight: isize, weight: isize,
} }
impl ActionTrait for ActionBeforeRenderComponent { impl ActionTrait for BeforeRenderComponentAction {
fn new() -> Self { fn new() -> Self {
ActionBeforeRenderComponent { BeforeRenderComponentAction {
action: None, action: None,
weight: 0, weight: 0,
} }
} }
fn handler(&self) -> &'static str {
BEFORE_RENDER_COMPONENT_ACTION
}
fn weight(&self) -> isize { fn weight(&self) -> isize {
self.weight self.weight
} }
@ -23,7 +29,7 @@ impl ActionTrait for ActionBeforeRenderComponent {
} }
} }
impl ActionBeforeRenderComponent { impl BeforeRenderComponentAction {
pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self {
self.action = Some(action); self.action = Some(action);
self self

View file

@ -1,24 +1,18 @@
use crate::html::{Markup, html}; use crate::html::{Markup, html};
use crate::api::{TypeId, action::{action_ref, run_actions}}; use crate::api::action::{action_ref, run_actions};
use crate::util; use crate::util;
use super::{ActionBeforeRenderComponent, Assets}; use super::{BEFORE_RENDER_COMPONENT_ACTION, BeforeRenderComponentAction};
use super::Assets;
pub use std::any::Any as AnyComponent; pub use std::any::Any as AnyComponent;
pub trait BaseComponent { pub trait ComponentTrait: AnyComponent + Send + Sync {
fn type_name(&self) -> &'static str;
fn single_name(&self) -> &'static str;
fn qualified_name(&self, last: usize) -> &'static str;
}
pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync {
fn new() -> Self where Self: Sized; fn new() -> Self where Self: Sized;
fn handler(&self) -> &'static str;
fn name(&self) -> String { fn name(&self) -> String {
self.single_name().to_owned() util::single_type_name::<Self>().to_owned()
} }
fn description(&self) -> Option<String> { fn description(&self) -> Option<String> {
@ -47,20 +41,6 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync {
fn as_mut_any(&mut self) -> &mut dyn AnyComponent; fn as_mut_any(&mut self) -> &mut dyn AnyComponent;
} }
impl<C: ?Sized + ComponentTrait> BaseComponent for C {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn single_name(&self) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), 1)
}
fn qualified_name(&self, last: usize) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), last)
}
}
pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C {
component.as_ref_any().downcast_ref::<C>().unwrap() component.as_ref_any().downcast_ref::<C>().unwrap()
} }
@ -75,8 +55,8 @@ pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets)
// Acciones de los módulos antes de renderizar el componente. // Acciones de los módulos antes de renderizar el componente.
run_actions( run_actions(
TypeId::of::<ActionBeforeRenderComponent>(), BEFORE_RENDER_COMPONENT_ACTION,
|a| action_ref::<ActionBeforeRenderComponent>(&**a).run(component, assets) |a| action_ref::<BeforeRenderComponentAction>(&**a).run(component, assets)
); );
// Acciones del tema antes de renderizar el componente. // Acciones del tema antes de renderizar el componente.

View file

@ -1,5 +1,8 @@
mod action; mod action;
pub use action::ActionBeforeRenderComponent; pub use action::{
BEFORE_RENDER_COMPONENT_ACTION,
BeforeRenderComponentAction,
};
mod assets; mod assets;
pub use assets::{ pub use assets::{
@ -12,7 +15,6 @@ pub use assets::{
mod definition; mod definition;
pub use definition::{ pub use definition::{
AnyComponent, AnyComponent,
BaseComponent,
ComponentTrait, ComponentTrait,
component_ref, component_ref,
component_mut, component_mut,

View file

@ -1,5 +1,3 @@
pub use std::any::TypeId;
pub mod action; // API to define functions that alter the behavior of PageTop core. pub mod action; // API to define functions that alter the behavior of PageTop core.
pub mod component; // API para crear nuevos componentes. pub mod component; // API para crear nuevos componentes.
pub mod module; // API para añadir módulos con nuevas funcionalidades. pub mod module; // API para añadir módulos con nuevas funcionalidades.

View file

@ -18,9 +18,9 @@ pub fn register_module(module: &'static dyn ModuleTrait) {
} }
fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) {
if !MODULES.read().unwrap().iter().any(|m| m.type_name() == module.type_name()) { if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) {
if !list.iter().any(|m| m.type_name() == module.type_name()) { if !list.iter().any(|m| m.handler() == module.handler()) {
trace::debug!("Registering \"{}\" module", module.single_name()); trace::debug!("Register module: \"{}\"", module.name());
list.push(module); list.push(module);
let mut dependencies = module.dependencies(); let mut dependencies = module.dependencies();

View file

@ -1,21 +1,16 @@
use crate::{app, util}; use crate::app;
use crate::api::action::ActionItem; use crate::api::action::ActionItem;
use crate::util;
#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
use crate::db::MigrationItem; use crate::db::MigrationItem;
pub trait BaseModule {
fn type_name(&self) -> &'static str;
fn single_name(&self) -> &'static str;
fn qualified_name(&self, last: usize) -> &'static str;
}
/// Los módulos deben implementar este *trait*. /// Los módulos deben implementar este *trait*.
pub trait ModuleTrait: BaseModule + Send + Sync { pub trait ModuleTrait: Send + Sync {
fn handler(&self) -> &'static str;
fn name(&self) -> String { fn name(&self) -> String {
self.single_name().to_owned() util::single_type_name::<Self>().to_owned()
} }
fn description(&self) -> Option<String> { fn description(&self) -> Option<String> {
@ -40,17 +35,3 @@ pub trait ModuleTrait: BaseModule + Send + Sync {
vec![] vec![]
} }
} }
impl<M: ?Sized + ModuleTrait> BaseModule for M {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn single_name(&self) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), 1)
}
fn qualified_name(&self, last: usize) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), last)
}
}

View file

@ -1,10 +1,5 @@
mod definition; mod definition;
pub use definition::{ pub use definition::ModuleTrait;
BaseModule,
ModuleTrait,
};
pub(crate) mod all; pub(crate) mod all;
pub use all::{ pub use all::register_module;
register_module,
};

View file

@ -12,8 +12,8 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| {
pub fn register_theme(theme: &'static dyn ThemeTrait) { pub fn register_theme(theme: &'static dyn ThemeTrait) {
let mut themes = THEMES.write().unwrap(); let mut themes = THEMES.write().unwrap();
if !themes.iter().any(|t| t.name() == theme.name()) { if !themes.iter().any(|t| t.handler() == theme.handler()) {
trace::debug!("Registering \"{}\" theme", theme.single_name()); trace::debug!("Register theme: \"{}\"", theme.name());
themes.push(theme); themes.push(theme);
} }
} }

View file

@ -6,18 +6,12 @@ use crate::response::page::Page;
use crate::base::component::Chunck; use crate::base::component::Chunck;
use crate::util; use crate::util;
pub trait BaseTheme {
fn type_name(&self) -> &'static str;
fn single_name(&self) -> &'static str;
fn qualified_name(&self, last: usize) -> &'static str;
}
/// Los temas deben implementar este "trait". /// Los temas deben implementar este "trait".
pub trait ThemeTrait: BaseTheme + Send + Sync { pub trait ThemeTrait: Send + Sync {
fn handler(&self) -> &'static str;
fn name(&self) -> String { fn name(&self) -> String {
self.single_name().to_owned() util::single_type_name::<Self>().to_owned()
} }
fn description(&self) -> Option<String> { fn description(&self) -> Option<String> {
@ -93,8 +87,8 @@ pub trait ThemeTrait: BaseTheme + Send + Sync {
/* /*
Cómo usarlo: Cómo usarlo:
match component.single_name() { match component.handler() {
"Block" => { BLOCK_COMPONENT => {
let block = component_mut::<Block>(component); let block = component_mut::<Block>(component);
block.alter_title("New title"); block.alter_title("New title");
}, },
@ -113,8 +107,8 @@ pub trait ThemeTrait: BaseTheme + Send + Sync {
/* /*
Cómo usarlo: Cómo usarlo:
match component.single_name() { match component.handler() {
"Block" => { BLOCK_COMPONENT => {
let block = component_ref::<Block>(component); let block = component_ref::<Block>(component);
match block.template() { match block.template() {
"default" => Some(block_default(block)), "default" => Some(block_default(block)),
@ -137,17 +131,3 @@ pub trait ThemeTrait: BaseTheme + Send + Sync {
.render() .render()
} }
} }
impl<T: ?Sized + ThemeTrait> BaseTheme for T {
fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
fn single_name(&self) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), 1)
}
fn qualified_name(&self, last: usize) -> &'static str {
util::partial_type_name(std::any::type_name::<Self>(), last)
}
}

View file

@ -1,8 +1,5 @@
mod definition; mod definition;
pub use definition::{ pub use definition::ThemeTrait;
BaseTheme,
ThemeTrait,
};
pub(crate) mod all; pub(crate) mod all;
pub use all::{ pub use all::{

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_BLOCK: &str = "pagetop::base::component::block::Block"; pub const BLOCK_COMPONENT: &str = "pagetop::component::block";
pub struct Block { pub struct Block {
renderable: fn() -> bool, renderable: fn() -> bool,
@ -25,6 +25,10 @@ impl ComponentTrait for Block {
} }
} }
fn handler(&self) -> &'static str {
BLOCK_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }
@ -34,7 +38,7 @@ impl ComponentTrait for Block {
} }
fn default_render(&self, assets: &mut Assets) -> Markup { fn default_render(&self, assets: &mut Assets) -> Markup {
let id = assets.serial_id(self.single_name(), self.id()); let id = assets.serial_id("block", self.id());
html! { html! {
div id=(id) class=[self.classes()] { div id=(id) class=[self.classes()] {
@match self.title() { @match self.title() {

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_CHUNCK: &str = "pagetop::base::component::chunck::Chunck"; pub const CHUNCK_COMPONENT: &str = "pagetop::component::chunck";
pub struct Chunck { pub struct Chunck {
renderable: fn() -> bool, renderable: fn() -> bool,
@ -19,6 +19,10 @@ impl ComponentTrait for Chunck {
} }
} }
fn handler(&self) -> &'static str {
CHUNCK_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_CONTAINER: &str = "pagetop::base::component::container::Container"; pub const CONTAINER_COMPONENT: &str = "pagetop::component::container";
pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub enum ContainerType { Header, Footer, Main, Section, Wrapper }
@ -29,6 +29,10 @@ impl ComponentTrait for Container {
} }
} }
fn handler(&self) -> &'static str {
CONTAINER_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_BUTTON: &str = "pagetop::base::component::form::button::Button"; pub const BUTTON_COMPONENT: &str = "pagetop::component::form::button";
pub enum ButtonType {Button, Reset, Submit} pub enum ButtonType {Button, Reset, Submit}
@ -32,6 +32,10 @@ impl ComponentTrait for Button {
.with_classes("form-button", ClassesOp::AddFirst) .with_classes("form-button", ClassesOp::AddFirst)
} }
fn handler(&self) -> &'static str {
BUTTON_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_DATE: &str = "pagetop::base::component::form::date::Date"; pub const DATE_COMPONENT: &str = "pagetop::component::form::date";
pub struct Date { pub struct Date {
renderable : fn() -> bool, renderable : fn() -> bool,
@ -40,6 +40,10 @@ impl ComponentTrait for Date {
.with_classes("form-type-date", ClassesOp::AddFirst) .with_classes("form-type-date", ClassesOp::AddFirst)
} }
fn handler(&self) -> &'static str {
DATE_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_FORM: &str = "pagetop::base::component::form::form::Form"; pub const FORM_COMPONENT: &str = "pagetop::component::form";
pub enum FormMethod {Get, Post} pub enum FormMethod {Get, Post}
@ -31,6 +31,10 @@ impl ComponentTrait for Form {
} }
} }
fn handler(&self) -> &'static str {
FORM_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_HIDDEN: &str = "pagetop::base::component::form::hidden::Hidden"; pub const HIDDEN_COMPONENT: &str = "pagetop::component::form::hidden";
pub struct Hidden { pub struct Hidden {
weight: isize, weight: isize,
@ -17,6 +17,10 @@ impl ComponentTrait for Hidden {
} }
} }
fn handler(&self) -> &'static str {
HIDDEN_COMPONENT
}
fn weight(&self) -> isize { fn weight(&self) -> isize {
self.weight self.weight
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_INPUT: &str = "pagetop::base::component::form::input::Input"; pub const INPUT_COMPONENT: &str = "pagetop::component::form::input";
pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub enum InputType {Email, Password, Search, Telephone, Textfield, Url}
@ -50,6 +50,10 @@ impl ComponentTrait for Input {
.with_classes("form-type-textfield", ClassesOp::AddFirst) .with_classes("form-type-textfield", ClassesOp::AddFirst)
} }
fn handler(&self) -> &'static str {
INPUT_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,21 +1,21 @@
mod form; mod form;
pub use form::{ pub use form::{
TYPENAME_FORM, Form, FormMethod FORM_COMPONENT, Form, FormMethod
}; };
mod input; mod input;
pub use input::{ pub use input::{
TYPENAME_INPUT, Input, InputType INPUT_COMPONENT, Input, InputType
}; };
mod hidden; mod hidden;
pub use hidden::{ pub use hidden::{
TYPENAME_HIDDEN, Hidden HIDDEN_COMPONENT, Hidden
}; };
mod date; mod date;
pub use date::{ pub use date::{
TYPENAME_DATE, Date DATE_COMPONENT, Date
}; };
mod button; mod button;
pub use button::{ pub use button::{
TYPENAME_BUTTON, Button, ButtonType BUTTON_COMPONENT, Button, ButtonType
}; };

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_COLUMN: &str = "pagetop::base::component::grid::column::Column"; pub const COLUMN_COMPONENT: &str = "pagetop::component::grid::column";
pub struct Column { pub struct Column {
renderable: fn() -> bool, renderable: fn() -> bool,
@ -23,6 +23,10 @@ impl ComponentTrait for Column {
} }
} }
fn handler(&self) -> &'static str {
COLUMN_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,8 +1,8 @@
mod row; mod row;
pub use row::{ pub use row::{
TYPENAME_ROW, Row ROW_COMPONENT, Row
}; };
mod column; mod column;
pub use column::{ pub use column::{
TYPENAME_COLUMN, Column COLUMN_COMPONENT, Column
}; };

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_ROW: &str = "pagetop::base::component::grid::row::Row"; pub const ROW_COMPONENT: &str = "pagetop::component::grid::row";
pub struct Row { pub struct Row {
renderable: fn() -> bool, renderable: fn() -> bool,
@ -23,6 +23,10 @@ impl ComponentTrait for Row {
} }
} }
fn handler(&self) -> &'static str {
ROW_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,6 +1,6 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_IMAGE: &str = "pagetop::base::component::image::Image"; pub const IMAGE_COMPONENT: &str = "pagetop::component::image";
pub struct Image { pub struct Image {
renderable: fn() -> bool, renderable: fn() -> bool,
@ -23,6 +23,10 @@ impl ComponentTrait for Image {
} }
} }
fn handler(&self) -> &'static str {
IMAGE_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }

View file

@ -1,7 +1,7 @@
use crate::prelude::*; use crate::prelude::*;
pub const TYPENAME_MENU: &str = "pagetop::base::component::menu::Menu"; pub const MENU_COMPONENT: &str = "pagetop::component::menu";
pub const TYPENAME_MENUITEM: &str = "pagetop::base::component::menu::MenuItem"; pub const MENUITEM_COMPONENT: &str = "pagetop::component::menu";
pub enum MenuItemType { pub enum MenuItemType {
Label(String), Label(String),
@ -30,6 +30,10 @@ impl ComponentTrait for MenuItem {
} }
} }
fn handler(&self) -> &'static str {
MENUITEM_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }
@ -190,6 +194,10 @@ impl ComponentTrait for Menu {
} }
} }
fn handler(&self) -> &'static str {
MENU_COMPONENT
}
fn is_renderable(&self) -> bool { fn is_renderable(&self) -> bool {
(self.renderable)() (self.renderable)()
} }
@ -211,7 +219,7 @@ impl ComponentTrait for Menu {
)) ))
.add_jquery(); .add_jquery();
let id = assets.serial_id(self.single_name(), self.id()); let id = assets.serial_id("menu", self.id());
html! { html! {
ul id=(id) class=[self.classes()] { ul id=(id) class=[self.classes()] {
(self.items().render(assets)) (self.items().render(assets))

View file

@ -1,28 +1,28 @@
mod container; mod container;
pub use container::{ pub use container::{
TYPENAME_CONTAINER, Container, ContainerType CONTAINER_COMPONENT, Container, ContainerType
}; };
pub mod grid; pub mod grid;
mod chunck; mod chunck;
pub use chunck::{ pub use chunck::{
TYPENAME_CHUNCK, Chunck CHUNCK_COMPONENT, Chunck
}; };
mod block; mod block;
pub use block::{ pub use block::{
TYPENAME_BLOCK, Block BLOCK_COMPONENT, Block
}; };
mod image; mod image;
pub use image::{ pub use image::{
TYPENAME_IMAGE, Image IMAGE_COMPONENT, Image
}; };
mod menu; mod menu;
pub use menu::{ pub use menu::{
TYPENAME_MENU, TYPENAME_MENUITEM, Menu, MenuItem, MenuItemType MENU_COMPONENT, MENUITEM_COMPONENT, Menu, MenuItem, MenuItemType
}; };
pub mod form; pub mod form;
pub use form::{ pub use form::{
TYPENAME_FORM, Form, FormMethod FORM_COMPONENT, Form, FormMethod
}; };

View file

@ -1,10 +1,16 @@
use crate::prelude::*; use crate::prelude::*;
pub const DEMOPAGE_MODULE: &str = "pagetop::module::demopage";
localize!("src/base/module/demopage/locales"); localize!("src/base/module/demopage/locales");
pub struct Demopage; pub struct Demopage;
impl ModuleTrait for Demopage { impl ModuleTrait for Demopage {
fn handler(&self) -> &'static str {
DEMOPAGE_MODULE
}
fn name(&self) -> String { fn name(&self) -> String {
l("module_name") l("module_name")
} }

View file

@ -1,10 +1,16 @@
use crate::prelude::*; use crate::prelude::*;
pub const ALINER_THEME: &str = "pagetop::theme::aliner";
include!(concat!(env!("OUT_DIR"), "/aliner.rs")); include!(concat!(env!("OUT_DIR"), "/aliner.rs"));
pub struct Aliner; pub struct Aliner;
impl ThemeTrait for Aliner { impl ThemeTrait for Aliner {
fn handler(&self) -> &'static str {
ALINER_THEME
}
fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) {
theme_static_files!(cfg, "/aliner"); theme_static_files!(cfg, "/aliner");
} }

View file

@ -1,5 +1,7 @@
use crate::prelude::*; use crate::prelude::*;
pub const BOOTSIER_THEME: &str = "pagetop::theme::bootsier";
include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); include!(concat!(env!("OUT_DIR"), "/bootsier.rs"));
localize!("src/base/theme/bootsier/locales"); localize!("src/base/theme/bootsier/locales");
@ -7,6 +9,10 @@ localize!("src/base/theme/bootsier/locales");
pub struct Bootsier; pub struct Bootsier;
impl ThemeTrait for Bootsier { impl ThemeTrait for Bootsier {
fn handler(&self) -> &'static str {
BOOTSIER_THEME
}
fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) {
theme_static_files!(cfg, "/bootsier"); theme_static_files!(cfg, "/bootsier");
} }

View file

@ -1,10 +1,16 @@
use crate::prelude::*; use crate::prelude::*;
pub const BULMIX_THEME: &str = "pagetop::theme::bulmix";
include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); include!(concat!(env!("OUT_DIR"), "/bulmix.rs"));
pub struct Bulmix; pub struct Bulmix;
impl ThemeTrait for Bulmix { impl ThemeTrait for Bulmix {
fn handler(&self) -> &'static str {
BULMIX_THEME
}
fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) {
theme_static_files!(cfg, "/bulmix"); theme_static_files!(cfg, "/bulmix");
} }
@ -29,12 +35,12 @@ impl ThemeTrait for Bulmix {
component: &mut dyn ComponentTrait, component: &mut dyn ComponentTrait,
_assets: &mut Assets _assets: &mut Assets
) { ) {
match component.type_name() { match component.handler() {
grid::TYPENAME_ROW => { grid::ROW_COMPONENT => {
let row = component_mut::<grid::Row>(component); let row = component_mut::<grid::Row>(component);
row.alter_classes("columns", ClassesOp::SetDefault); row.alter_classes("columns", ClassesOp::SetDefault);
}, },
grid::TYPENAME_COLUMN => { grid::COLUMN_COMPONENT => {
let col = component_mut::<grid::Column>(component); let col = component_mut::<grid::Column>(component);
col.alter_classes("column", ClassesOp::SetDefault); col.alter_classes("column", ClassesOp::SetDefault);
}, },

View file

@ -1,6 +1,11 @@
use crate::prelude::*; use crate::prelude::*;
pub const MINIMAL_THEME: &str = "pagetop::theme::minimal";
pub struct Minimal; pub struct Minimal;
impl ThemeTrait for Minimal { impl ThemeTrait for Minimal {
fn handler(&self) -> &'static str {
MINIMAL_THEME
}
} }

View file

@ -21,7 +21,6 @@ pub use crate::{
}; };
pub use crate::{action_item, api::{ pub use crate::{action_item, api::{
TypeId,
action::*, action::*,
component::*, component::*,
module::*, module::*,

View file

@ -1,6 +1,8 @@
use crate::api::action::{ActionTrait, AnyAction}; use crate::api::action::{ActionTrait, AnyAction};
use super::Page; use super::Page;
pub const BEFORE_RENDER_PAGE_ACTION: &str = "pagetop::action::before_render_page";
pub struct ActionBeforeRenderPage { pub struct ActionBeforeRenderPage {
action: Option<fn(&mut Page)>, action: Option<fn(&mut Page)>,
weight: isize, weight: isize,
@ -14,6 +16,10 @@ impl ActionTrait for ActionBeforeRenderPage {
} }
} }
fn handler(&self) -> &'static str {
BEFORE_RENDER_PAGE_ACTION
}
fn weight(&self) -> isize { fn weight(&self) -> isize {
self.weight self.weight
} }

View file

@ -1,5 +1,8 @@
mod action; mod action;
pub use action::ActionBeforeRenderPage; pub use action::{
BEFORE_RENDER_PAGE_ACTION,
ActionBeforeRenderPage,
};
mod page; mod page;
pub use page::Page; pub use page::Page;

View file

@ -1,9 +1,9 @@
use crate::{Lazy, app, trace}; use crate::{Lazy, app, trace};
use crate::config::SETTINGS; use crate::config::SETTINGS;
use crate::html::*; use crate::html::*;
use crate::api::{TypeId, action::{action_ref, run_actions}}; use crate::api::action::{action_ref, run_actions};
use crate::api::component::*; use crate::api::component::*;
use super::ActionBeforeRenderPage; use super::{BEFORE_RENDER_PAGE_ACTION, ActionBeforeRenderPage};
use std::collections::HashMap; use std::collections::HashMap;
@ -152,7 +152,7 @@ impl<'a> Page<'a> {
pub fn render(&mut self) -> app::Result<Markup> { pub fn render(&mut self) -> app::Result<Markup> {
// Acciones de los módulos antes de renderizar la página. // Acciones de los módulos antes de renderizar la página.
run_actions( run_actions(
TypeId::of::<ActionBeforeRenderPage>(), BEFORE_RENDER_PAGE_ACTION,
|a| action_ref::<ActionBeforeRenderPage>(&**a).run(self) |a| action_ref::<ActionBeforeRenderPage>(&**a).run(self)
); );

View file

@ -46,3 +46,7 @@ pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str {
} }
&type_name[(positions[last - 1].0 + 2)..] &type_name[(positions[last - 1].0 + 2)..]
} }
pub fn single_type_name<T: ?Sized>() -> &'static str {
partial_type_name(std::any::type_name::<T>(), 1)
}