Skip to content

Commit b949d45

Browse files
authored
Allow to inject arbitrary components into the <head> (#1499)
1 parent d8bc32c commit b949d45

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

pgml-dashboard/src/components/layouts/head/mod.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use pgml_components::component;
1+
use pgml_components::{component, Component};
22
use sailfish::TemplateOnce;
33

44
#[derive(TemplateOnce, Default, Clone)]
@@ -10,6 +10,7 @@ pub struct Head {
1010
pub preloads: Vec<String>,
1111
pub context: Option<String>,
1212
pub canonical: Option<String>,
13+
pub additional_components: Vec<Component>,
1314
}
1415

1516
impl Head {
@@ -58,6 +59,25 @@ impl Head {
5859
self.context = context.to_owned();
5960
self
6061
}
62+
63+
/// Add a component to `<head>`.
64+
///
65+
/// This can be anything, e.g. a `<script>` tag or a `<meta>` or just some HTML or text.
66+
///
67+
/// # Example
68+
///
69+
/// ```
70+
/// use pgml_components::Component;
71+
/// use pgml_components::layouts::Head;
72+
///
73+
/// let head = Head::new()
74+
/// .add_component(Component::from("<script>console.log('hello');</script>"));
75+
/// ```
76+
///
77+
pub fn add_component(mut self, component: Component) -> Self {
78+
self.additional_components.push(component);
79+
self
80+
}
6181
}
6282

6383
component!(Head);

pgml-dashboard/src/components/layouts/head/template.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,8 @@
9797
};
9898
</script>
9999
<% } %>
100+
101+
<% for component in additional_components { %>
102+
<%+ component %>
103+
<% } %>
100104
</head>

pgml-dashboard/src/components/layouts/marketing/base/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::components::notifications::marketing::AlertBanner;
33
use crate::guards::Cluster;
44
use crate::models::User;
55
use crate::Notification;
6-
use pgml_components::component;
6+
use pgml_components::{component, Component};
77
use sailfish::TemplateOnce;
88
use std::fmt;
99

@@ -72,6 +72,15 @@ impl Base {
7272
rsp
7373
}
7474

75+
/// Add a component to the `<head>`.
76+
///
77+
/// See [`Head::add_component`](crate::components::layouts::Head::add_component) for more information.
78+
///
79+
pub fn add_head_component(mut self, component: Component) -> Self {
80+
self.head = self.head.add_component(component);
81+
self
82+
}
83+
7584
pub fn footer(mut self, footer: String) -> Self {
7685
self.footer = Some(footer);
7786
self

pgml-dashboard/src/templates/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,17 @@ impl<'a> WebAppBase<'a> {
163163
self
164164
}
165165

166+
/// Add a component to head (`<head>`).
167+
///
168+
/// # Arguments
169+
///
170+
/// * `component` - The component to add to the head.
171+
///
172+
pub fn add_head_component(&mut self, component: Component) -> &mut Self {
173+
self.head = self.head.clone().add_component(component);
174+
self
175+
}
176+
166177
pub fn render<T>(&mut self, template: T) -> String
167178
where
168179
T: sailfish::TemplateOnce,

0 commit comments

Comments
 (0)