From 0ff4beaee7370a58956082616b19c12aa99ddb26 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 3 Sep 2022 03:31:48 -0400 Subject: [PATCH] Fixed an issue that prevent using resource-manager with CDF Closes #5262 It was a bit of a rabbit hole to go down to figure this one out. Initially I thought the CDF had an error serving javascript with a css mime type. But the underlying issue is that with Stencil.js there is a main script that registers individual components scripts in a different way depending on browser support and loads or not some polyfills accordingly (very efficient). This means that that "entry" file was served by the CDF but the file attempts to load it's "component details" files relative to that path. Unfortunatelly thanks to CDF, that relative path was the CDF handler itselft instead of the path to the other js files. And the CDF defaults to css mime type if it can't figure out the right one. The Client Dependency Framework does not support javascript modules (because of script relative paths) and there are no plans to add such support according to their repository. Also with this modern way of lazy-loading and with modern http2 having compression and multiplexing, bundling those files is actually a performance hit and not recommended. Which left us with a couple options: 1. Not take advantage of Js modules by bundling all js files (but this compile target was deprecated by Stencil for the reasons above), so it would have taken quite some time and incur a performance hit instead of a boost. 2. Not use CDF for this project, but this was broken if hosting in a virtual directory (IIS Application under an IIS site folder). This PR implementes #2 but adds support for ApplicationPath to the existing Request SPA token. This new token support can also be very useful for other SPA modules. So under normal hosting, this returns `/` but if the site is hosted in a dnn subdirectory it will return '/dnn' (or whataver the web path is for that web application. I think this will cover all scenarios here. --- .../UI/Modules/Html5/RequestPropertyAccess.cs | 63 ++++++++++--------- .../Modules/ResourceManager/View.html | 4 +- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/DNN Platform/Library/UI/Modules/Html5/RequestPropertyAccess.cs b/DNN Platform/Library/UI/Modules/Html5/RequestPropertyAccess.cs index e48b5f22987..1ffd5f786a6 100644 --- a/DNN Platform/Library/UI/Modules/Html5/RequestPropertyAccess.cs +++ b/DNN Platform/Library/UI/Modules/Html5/RequestPropertyAccess.cs @@ -2,44 +2,49 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.UI.Modules.Html5 -{ - using System.Globalization; - using System.Web; +namespace DotNetNuke.UI.Modules.Html5 +{ + using System.Globalization; + using System.Web; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Tokens; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Tokens; - public class RequestPropertyAccess : IPropertyAccess - { - private readonly HttpRequest _request; + /// + /// Replaces tokens related to the current http request. + /// + public class RequestPropertyAccess : IPropertyAccess + { + private readonly HttpRequest request; /// /// Initializes a new instance of the class. /// - /// - public RequestPropertyAccess(HttpRequest request) - { - this._request = request; + /// The current http request. + public RequestPropertyAccess(HttpRequest request) + { + this.request = request; } /// - public virtual CacheLevel Cacheability - { - get { return CacheLevel.notCacheable; } + public virtual CacheLevel Cacheability + { + get { return CacheLevel.notCacheable; } } /// - public string GetProperty(string propertyName, string format, CultureInfo formatProvider, UserInfo accessingUser, Scope accessLevel, ref bool propertyNotFound) - { - switch (propertyName.ToLowerInvariant()) - { - case "querystring": - return this._request.QueryString.ToString(); - } - - propertyNotFound = true; - return string.Empty; - } - } -} + public string GetProperty(string propertyName, string format, CultureInfo formatProvider, UserInfo accessingUser, Scope accessLevel, ref bool propertyNotFound) + { + switch (propertyName.ToLowerInvariant()) + { + case "querystring": + return this.request.QueryString.ToString(); + case "applicationpath": + return this.request.ApplicationPath; + } + + propertyNotFound = true; + return string.Empty; + } + } +} diff --git a/DNN Platform/Modules/ResourceManager/View.html b/DNN Platform/Modules/ResourceManager/View.html index 77cfdcb4a80..cd85196b1b8 100644 --- a/DNN Platform/Modules/ResourceManager/View.html +++ b/DNN Platform/Modules/ResourceManager/View.html @@ -1,6 +1,6 @@ [AntiForgeryToken:True] -[JavaScript:{ path: "~/DesktopModules/ResourceManager/Scripts/dnn-resource-manager/dnn-resource-manager.esm.js", htmlAttributes: { "type":"module" } }] -[JavaScript:{ path: "~/DesktopModules/ResourceManager/Scripts/dnn-resource-manager/dnn-resource-manager.js", htmlAttributes: { "nomodule":"nomodule" } }] + +