From 8067b2e63474ead2c4abbb4556bb9e97ffee5ff2 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 21 Jun 2023 08:31:51 -0400 Subject: [PATCH] fix #2912 - move JavaScript handling from ThemeBuilder to component OnAfterRenderAsync --- Oqtane.Client/Modules/ModuleBase.cs | 22 ++++++++++++-- Oqtane.Client/Themes/ThemeBase.cs | 21 +++++++++++-- Oqtane.Client/UI/SiteRouter.razor | 8 +++-- Oqtane.Client/UI/ThemeBuilder.razor | 47 ++++++++++++++--------------- Oqtane.Shared/Models/Resource.cs | 4 +++ 5 files changed, 71 insertions(+), 31 deletions(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index fadfaf1a..0f56752d 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -9,6 +9,7 @@ using Oqtane.UI; using System.Collections.Generic; using Microsoft.JSInterop; using System.Linq; +using Oqtane.Themes; namespace Oqtane.Modules { @@ -70,12 +71,28 @@ namespace Oqtane.Modules { if (firstRender) { - if (Resources != null && Resources.Exists(item => item.ResourceType == ResourceType.Script)) + List resources = null; + var type = GetType(); + if (type.BaseType == typeof(ModuleBase)) + { + if (PageState.Page.Resources != null) + { + resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Namespace == type.Namespace).ToList(); + } + } + else // modulecontrolbase + { + if (Resources != null) + { + resources = Resources.Where(item => item.ResourceType == ResourceType.Script).ToList(); + } + } + if (resources != null &&resources.Any()) { var interop = new Interop(JSRuntime); var scripts = new List(); var inline = 0; - foreach (Resource resource in Resources.Where(item => item.ResourceType == ResourceType.Script)) + foreach (Resource resource in resources) { if (!string.IsNullOrEmpty(resource.Url)) { @@ -104,6 +121,7 @@ namespace Oqtane.Modules } // url methods + public string NavigateUrl() { return NavigateUrl(PageState.Page.Path); diff --git a/Oqtane.Client/Themes/ThemeBase.cs b/Oqtane.Client/Themes/ThemeBase.cs index dc52aa75..8dcbe65c 100644 --- a/Oqtane.Client/Themes/ThemeBase.cs +++ b/Oqtane.Client/Themes/ThemeBase.cs @@ -6,6 +6,7 @@ using Oqtane.UI; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading.Tasks; namespace Oqtane.Themes @@ -33,12 +34,28 @@ namespace Oqtane.Themes { if (firstRender) { - if (Resources != null && Resources.Exists(item => item.ResourceType == ResourceType.Script)) + List resources = null; + var type = GetType(); + if (type.BaseType == typeof(ThemeBase)) + { + if (PageState.Page.Resources != null) + { + resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Namespace == type.Namespace).ToList(); + } + } + else // themecontrolbase, containerbase + { + if (Resources != null) + { + resources = Resources.Where(item => item.ResourceType == ResourceType.Script).ToList(); + } + } + if (resources != null && resources.Any()) { var interop = new Interop(JSRuntime); var scripts = new List(); var inline = 0; - foreach (Resource resource in Resources.Where(item => item.ResourceType == ResourceType.Script)) + foreach (Resource resource in resources) { if (!string.IsNullOrEmpty(resource.Url)) { diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 03cda77f..df98874c 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -333,10 +333,11 @@ // fallback to default Oqtane theme page.ThemeType = Constants.DefaultTheme; themetype = Type.GetType(Constants.DefaultTheme); + theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType)); } string panes = ""; - if (themetype != null) + if (themetype != null && theme != null) { // get resources for theme (ITheme) page.Resources = ManagePageResources(page.Resources, theme.Resources, ResourceLevel.Page, alias, "Themes", Utilities.GetTypeName(theme.ThemeName)); @@ -522,10 +523,11 @@ } // ensure resource does not exist already - if (!pageresources.Any(item => item.Url.ToLower() == resource.Url.ToLower())) + if (!pageresources.Exists(item => item.Url.ToLower() == resource.Url.ToLower())) { resource.Level = level; - pageresources.Add(resource); + resource.Namespace = name; + pageresources.Add(resource); } } } diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index fefc0025..1bf1ac23 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -105,10 +105,9 @@ if (PageState.Page.Resources != null) { - var interop = new Interop(JSRuntime); - if (PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Stylesheet)) { + var interop = new Interop(JSRuntime); string batch = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff"); var links = new List(); foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) @@ -125,28 +124,28 @@ await interop.RemoveElementsById("app-stylesheet-module-", "", "app-stylesheet-module-" + batch + "-00"); } - if (PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) - { - var scripts = new List(); - var inline = 0; - foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site)) - { - if (!string.IsNullOrEmpty(resource.Url)) - { - var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; - scripts.Add(new { href = url, bundle = resource.Bundle ?? "", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", es6module = resource.ES6Module, location = resource.Location.ToString().ToLower() }); - } - else - { - inline += 1; - await interop.IncludeScript(GetType().Namespace.ToLower() + inline.ToString(), "", "", "", resource.Content, resource.Location.ToString().ToLower()); - } - } - if (scripts.Any()) - { - await interop.IncludeScripts(scripts.ToArray()); - } - } + //if (PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) + //{ + // var scripts = new List(); + // var inline = 0; + // foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site)) + // { + // if (!string.IsNullOrEmpty(resource.Url)) + // { + // var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; + // scripts.Add(new { href = url, bundle = resource.Bundle ?? "", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", es6module = resource.ES6Module, location = resource.Location.ToString().ToLower() }); + // } + // else + // { + // inline += 1; + // await interop.IncludeScript(GetType().Namespace.ToLower() + inline.ToString(), "", "", "", resource.Content, resource.Location.ToString().ToLower()); + // } + // } + // if (scripts.Any()) + // { + // await interop.IncludeScripts(scripts.ToArray()); + // } + //} } } diff --git a/Oqtane.Shared/Models/Resource.cs b/Oqtane.Shared/Models/Resource.cs index 254af250..b1785834 100644 --- a/Oqtane.Shared/Models/Resource.cs +++ b/Oqtane.Shared/Models/Resource.cs @@ -62,6 +62,10 @@ namespace Oqtane.Models /// public string Content { get; set; } + /// + /// The namespace of the component that declared the resource - only used in SiteRouter + /// + public string Namespace { get; set; } [Obsolete("ResourceDeclaration is deprecated", false)] public ResourceDeclaration Declaration { get; set; }