diff --git a/Oqtane.Client/Body.razor b/Oqtane.Client/Body.razor
new file mode 100644
index 00000000..8f28ce95
--- /dev/null
+++ b/Oqtane.Client/Body.razor
@@ -0,0 +1,33 @@
+@using System.ComponentModel
+@using Oqtane.Shared
+@inject SiteState SiteState
+
+@((MarkupString)content)
+
+@code {
+ private string content = "";
+
+ protected override void OnInitialized()
+ {
+ ((INotifyPropertyChanged)SiteState.Properties).PropertyChanged += PropertyChanged;
+ }
+
+ private void PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ switch (e.PropertyName)
+ {
+ case "BodyContent":
+ if (content != SiteState.Properties.BodyContent)
+ {
+ content = SiteState.Properties.BodyContent;
+ StateHasChanged();
+ }
+ break;
+ }
+ }
+
+ public void Dispose()
+ {
+ ((INotifyPropertyChanged)SiteState.Properties).PropertyChanged -= PropertyChanged;
+ }
+}
\ No newline at end of file
diff --git a/Oqtane.Client/Head.razor b/Oqtane.Client/Head.razor
new file mode 100644
index 00000000..69d78f31
--- /dev/null
+++ b/Oqtane.Client/Head.razor
@@ -0,0 +1,42 @@
+@using System.ComponentModel
+@using Oqtane.Shared
+@inject SiteState SiteState
+
+
@title
+@((MarkupString)content)
+
+@code {
+ private string title = "";
+ private string content = "";
+
+ protected override void OnInitialized()
+ {
+ ((INotifyPropertyChanged)SiteState.Properties).PropertyChanged += PropertyChanged;
+ }
+
+ private void PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ switch (e.PropertyName)
+ {
+ case "PageTitle":
+ if (title != SiteState.Properties.PageTitle)
+ {
+ title = SiteState.Properties.PageTitle;
+ StateHasChanged();
+ }
+ break;
+ case "HeadContent":
+ if (content != SiteState.Properties.HeadContent)
+ {
+ content = SiteState.Properties.HeadContent;
+ StateHasChanged();
+ }
+ break;
+ }
+ }
+
+ public void Dispose()
+ {
+ ((INotifyPropertyChanged)SiteState.Properties).PropertyChanged -= PropertyChanged;
+ }
+}
\ No newline at end of file
diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs
index 9ba0d264..31689a16 100644
--- a/Oqtane.Client/Modules/ModuleBase.cs
+++ b/Oqtane.Client/Modules/ModuleBase.cs
@@ -273,6 +273,35 @@ namespace Oqtane.Modules
SiteState.Properties.ModuleVisibility = obj;
}
+ public void SetPageTitle(string title)
+ {
+ SiteState.Properties.PageTitle = title;
+ }
+
+ public void AddHeadContent(string content)
+ {
+ if (string.IsNullOrEmpty(SiteState.Properties.HeadContent))
+ {
+ SiteState.Properties.HeadContent = content;
+ }
+ else if (!SiteState.Properties.HeadContent.Contains(content))
+ {
+ SiteState.Properties.HeadContent += content;
+ }
+ }
+
+ public void AddBodyContent(string content)
+ {
+ if (string.IsNullOrEmpty(SiteState.Properties.BodyContent))
+ {
+ SiteState.Properties.BodyContent = content;
+ }
+ else if (!SiteState.Properties.BodyContent.Contains(content))
+ {
+ SiteState.Properties.BodyContent += content;
+ }
+ }
+
// logging methods
public async Task Log(Alias alias, LogLevel level, string function, Exception exception, string message, params object[] args)
{
diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor
index 1766374e..1c179314 100644
--- a/Oqtane.Client/UI/ThemeBuilder.razor
+++ b/Oqtane.Client/UI/ThemeBuilder.razor
@@ -1,22 +1,36 @@
@namespace Oqtane.UI
@inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager
+@inject SiteState SiteState
@DynamicComponent
@code {
- [CascadingParameter] PageState PageState { get; set; }
+ [CascadingParameter] PageState PageState { get; set; }
- RenderFragment DynamicComponent { get; set; }
+ RenderFragment DynamicComponent { get; set; }
- protected override void OnParametersSet()
- {
- // handle page redirection
- if (!string.IsNullOrEmpty(PageState.Page.Url))
- {
- NavigationManager.NavigateTo(PageState.Page.Url);
- return;
- }
+ protected override void OnParametersSet()
+ {
+ // handle page redirection
+ if (!string.IsNullOrEmpty(PageState.Page.Url))
+ {
+ NavigationManager.NavigateTo(PageState.Page.Url);
+ return;
+ }
+
+ // set page title
+ if (!string.IsNullOrEmpty(PageState.Page.Title))
+ {
+ SiteState.Properties.PageTitle = PageState.Page.Title;
+ }
+ else
+ {
+ SiteState.Properties.PageTitle = PageState.Site.Name + " - " + PageState.Page.Name;
+ }
+
+ // set page meta
+ SiteState.Properties.HeadContent = PageState.Page.Meta ?? "";
DynamicComponent = builder =>
{
@@ -45,15 +59,5 @@
}
await interop.RemoveElementsById("app-stylesheet-page-", "", "app-stylesheet-page-" + batch + "-00");
await interop.RemoveElementsById("app-stylesheet-module-", "", "app-stylesheet-module-" + batch + "-00");
-
- // set page title
- if (!string.IsNullOrEmpty(PageState.Page.Title))
- {
- await interop.UpdateTitle(PageState.Page.Title);
- }
- else
- {
- await interop.UpdateTitle(PageState.Site.Name + " - " + PageState.Page.Name);
- }
}
}
diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml
index 488bcff9..8bfdcbf8 100644
--- a/Oqtane.Server/Pages/_Host.cshtml
+++ b/Oqtane.Server/Pages/_Host.cshtml
@@ -7,8 +7,7 @@
- @Model.Title
- @Html.Raw(@Model.Meta)
+
@if (!string.IsNullOrEmpty(Model.PWAScript))
@@ -59,7 +58,8 @@
@Html.Raw(Model.PWAScript)
}
@Html.Raw(Model.BodyResources)
- }
+
+ }
else
{
@Model.Message
diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs
index bf49849b..d37bca0d 100644
--- a/Oqtane.Server/Pages/_Host.cshtml.cs
+++ b/Oqtane.Server/Pages/_Host.cshtml.cs
@@ -65,8 +65,6 @@ namespace Oqtane.Pages
public string RemoteIPAddress = "";
public string HeadResources = "";
public string BodyResources = "";
- public string Title = "";
- public string Meta = "";
public string FavIcon = "favicon.ico";
public string PWAScript = "";
public string ReconnectScript = "";
@@ -137,7 +135,6 @@ namespace Oqtane.Pages
{
PWAScript = CreatePWAScript(alias, site, route);
}
- Title = site.Name;
var ThemeType = site.DefaultThemeType;
// get jwt token for downstream APIs
@@ -163,17 +160,6 @@ namespace Oqtane.Pages
}
if (page != null && !page.IsDeleted)
{
- // set page title
- if (!string.IsNullOrEmpty(page.Title))
- {
- Title = page.Title;
- }
- else
- {
- Title = Title + " - " + page.Name;
- }
- Meta = page.Meta;
-
// include theme resources
if (!string.IsNullOrEmpty(page.ThemeType))
{