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)) {