From 3a19ced2d1728aecf0c238531a81b3db68b0c66a Mon Sep 17 00:00:00 2001 From: Jim Spillane Date: Sat, 16 May 2020 10:36:16 -0400 Subject: [PATCH 1/7] Fix module pluralization Added 's' to the module creator sql script in the csproj to fix compilation error. --- .../Templates/External/Server/[Owner].[Module]s.Server.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/[Owner].[Module]s.Server.csproj b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/[Owner].[Module]s.Server.csproj index 0c93403b..f8cc9a95 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/[Owner].[Module]s.Server.csproj +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/[Owner].[Module]s.Server.csproj @@ -14,8 +14,8 @@ - - + + From 54d4447d23f59597ffe63067c6f1332be730af5d Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sat, 16 May 2020 12:00:15 -0400 Subject: [PATCH 2/7] Central management of resources ( ie. stylesheets and scripts ) --- .../Themes/BlazorTheme/Default.razor | 12 +++++++- .../Themes/OqtaneTheme/Default.razor | 19 +++++++++--- Oqtane.Client/Themes/ThemeBase.cs | 3 ++ Oqtane.Client/UI/Interop.cs | 16 ++++++++++ Oqtane.Client/UI/SiteRouter.razor | 29 +++++++++++++------ Oqtane.Client/UI/ThemeBuilder.razor | 22 ++++++++++++++ Oqtane.Server/wwwroot/js/interop.js | 9 ++++++ Oqtane.Shared/Enums/ResourceType.cs | 8 +++++ Oqtane.Shared/Interfaces/IThemeControl.cs | 6 +++- Oqtane.Shared/Models/Page.cs | 3 ++ Oqtane.Shared/Models/Resource.cs | 12 ++++++++ Oqtane.Shared/Models/Theme.cs | 4 ++- 12 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 Oqtane.Shared/Enums/ResourceType.cs create mode 100644 Oqtane.Shared/Models/Resource.cs diff --git a/Oqtane.Client/Themes/BlazorTheme/Default.razor b/Oqtane.Client/Themes/BlazorTheme/Default.razor index ecd3596e..4fa2a01d 100644 --- a/Oqtane.Client/Themes/BlazorTheme/Default.razor +++ b/Oqtane.Client/Themes/BlazorTheme/Default.razor @@ -28,9 +28,19 @@ @code { public override string Panes => "Content"; + public override List Resources + { + get + { + List resources = new List(); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "Themes/" + GetType().Namespace + "/Theme.css", Integrity = "", CrossOrigin = "" }); + return resources; + } + } + protected override async Task OnParametersSetAsync() { - await IncludeCSS("Theme.css"); + //await IncludeCSS("Theme.css"); } } \ No newline at end of file diff --git a/Oqtane.Client/Themes/OqtaneTheme/Default.razor b/Oqtane.Client/Themes/OqtaneTheme/Default.razor index f92823e7..f6238a17 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Default.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Default.razor @@ -19,11 +19,22 @@ @code { public override string Panes => string.Empty; + public override List Resources + { + get + { + List resources = new List(); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/cyborg/bootstrap.min.css", Integrity = "sha384-l7xaoY0cJM4h9xh1RfazbgJVUZvdtyLWPueWNtLAphf/UbBgOVzqbOTogxPwYLHM", CrossOrigin = "anonymous" }); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "Themes/" + GetType().Namespace + "/Theme.css" }); + return resources; + } + } + protected override async Task OnParametersSetAsync() { - // go to https://www.bootstrapcdn.com/bootswatch/ and take your favorite theme - // - await LoadBootstrapTheme("https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/cyborg/bootstrap.min.css","sha384-l7xaoY0cJM4h9xh1RfazbgJVUZvdtyLWPueWNtLAphf/UbBgOVzqbOTogxPwYLHM"); - await IncludeCSS("Theme.css"); + // go to https://www.bootstrapcdn.com/bootswatch/ and take your favorite theme + // + //await LoadBootstrapTheme("https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/cyborg/bootstrap.min.css","sha384-l7xaoY0cJM4h9xh1RfazbgJVUZvdtyLWPueWNtLAphf/UbBgOVzqbOTogxPwYLHM"); + //await IncludeCSS("Theme.css"); } } diff --git a/Oqtane.Client/Themes/ThemeBase.cs b/Oqtane.Client/Themes/ThemeBase.cs index 83694766..3e3136f5 100644 --- a/Oqtane.Client/Themes/ThemeBase.cs +++ b/Oqtane.Client/Themes/ThemeBase.cs @@ -1,7 +1,9 @@ using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; +using Oqtane.Models; using Oqtane.Shared; using Oqtane.UI; +using System.Collections.Generic; using System.Threading.Tasks; namespace Oqtane.Themes @@ -14,6 +16,7 @@ namespace Oqtane.Themes [CascadingParameter] protected PageState PageState { get; set; } public virtual string Panes { get; set; } + public virtual List Resources { get; set; } public string ThemePath() { diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 73aaf029..0ae86ac5 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -118,6 +118,22 @@ namespace Oqtane.UI } } + public Task RemoveElementsById(string prefix, string first, string last) + { + try + { + _jsRuntime.InvokeAsync( + "interop.removeElementsById", + prefix, first, last); + return Task.CompletedTask; + } + catch + { + return Task.CompletedTask; + } + } + + public ValueTask GetElementByName(string name) { try diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 488c43bf..37676dff 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -355,19 +355,30 @@ page.ThemeType = site.DefaultThemeType; page.LayoutType = site.DefaultLayoutType; } - Type type; + + page.Resources = new List(); + + Type themetype = Type.GetType(page.ThemeType); + var themeobject = Activator.CreateInstance(themetype); + if (themeobject != null) + { + page.Panes = (string)themetype.GetProperty("Panes").GetValue(themeobject, null); + var resources = (List)themetype.GetProperty("Resources").GetValue(themeobject, null); + if (resources != null) + { + page.Resources.AddRange(resources); + } + } if (!string.IsNullOrEmpty(page.LayoutType)) { - type = Type.GetType(page.LayoutType); + themetype = Type.GetType(page.LayoutType); + themeobject = Activator.CreateInstance(themetype); + if (themeobject != null) + { + page.Panes = (string)themetype.GetProperty("Panes").GetValue(themeobject, null); + } } - else - { - type = Type.GetType(page.ThemeType); - } - - var property = type.GetProperty("Panes"); - page.Panes = (string)property.GetValue(Activator.CreateInstance(type), null); } catch { diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index e2cf9e4a..9289fbfd 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -12,6 +12,8 @@ protected override async Task OnParametersSetAsync() { var interop = new Interop(JsRuntime); + + // set page title if (!string.IsNullOrEmpty(PageState.Page.Title)) { await interop.UpdateTitle(PageState.Page.Title); @@ -20,10 +22,30 @@ { await interop.UpdateTitle(PageState.Site.Name + " - " + PageState.Page.Name); } + + // manage page resources- they cannot be removed first and then added because the browser will "flash" and result in a poor user experience - they need to be updated + int index = 0; + foreach (Resource resource in PageState.Page.Resources) + { + index += 1; + switch (resource.ResourceType) + { + case ResourceType.Stylesheet: + await interop.IncludeLink("app-resource" + index.ToString("00"), "stylesheet", resource.Url, "text/css", resource.Integrity, resource.CrossOrigin); + break; + case ResourceType.Script: + break; + } + } + // remove any page resources references which are no longer required for this page + await interop.RemoveElementsById("app-resource", "app-resource" + (index + 1).ToString("00"), ""); + + // add favicon if (PageState.Site.FaviconFileId != null) { await interop.IncludeLink("fav-icon", "shortcut icon", Utilities.ContentUrl(PageState.Alias, PageState.Site.FaviconFileId.Value), "image/x-icon", "", ""); } + // add PWA support if (PageState.Site.PwaIsEnabled) { await InitializePwa(interop); diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index 5f41709c..36b6c4f3 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -160,6 +160,15 @@ window.interop = { } } }, + removeElementsById: function (prefix, first, last) { + var elements = document.querySelectorAll('[id^=' + prefix + ']'); + for (var i = elements.length - 1; i >= 0; i--) { + var element = elements[i]; + if (element.id.startsWith(prefix) && (first === '' || element.id >= first) && (last === '' || element.id <= last)) { + element.parentNode.removeChild(element); + } + } + }, getElementByName: function (name) { var elements = document.getElementsByName(name); if (elements.length) { diff --git a/Oqtane.Shared/Enums/ResourceType.cs b/Oqtane.Shared/Enums/ResourceType.cs new file mode 100644 index 00000000..b2196652 --- /dev/null +++ b/Oqtane.Shared/Enums/ResourceType.cs @@ -0,0 +1,8 @@ +namespace Oqtane.Shared +{ + public enum ResourceType + { + Stylesheet, + Script + } +} diff --git a/Oqtane.Shared/Interfaces/IThemeControl.cs b/Oqtane.Shared/Interfaces/IThemeControl.cs index e9e19e7c..0f6ad00a 100644 --- a/Oqtane.Shared/Interfaces/IThemeControl.cs +++ b/Oqtane.Shared/Interfaces/IThemeControl.cs @@ -1,7 +1,11 @@ -namespace Oqtane.Themes +using Oqtane.Models; +using System.Collections.Generic; + +namespace Oqtane.Themes { public interface IThemeControl { string Panes { get; } // identifies all panes in a theme ( delimited by ";" ) - assumed to be a layout if no panes specified + List Resources { get; } // identifies all resources in a theme } } diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs index 2d3f3624..6512580f 100644 --- a/Oqtane.Shared/Models/Page.cs +++ b/Oqtane.Shared/Models/Page.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; namespace Oqtane.Models @@ -33,6 +34,8 @@ namespace Oqtane.Models [NotMapped] public string Panes { get; set; } [NotMapped] + public List Resources { get; set; } + [NotMapped] public string Permissions { get; set; } [NotMapped] public int Level { get; set; } diff --git a/Oqtane.Shared/Models/Resource.cs b/Oqtane.Shared/Models/Resource.cs new file mode 100644 index 00000000..81dc50fd --- /dev/null +++ b/Oqtane.Shared/Models/Resource.cs @@ -0,0 +1,12 @@ +using Oqtane.Shared; + +namespace Oqtane.Models +{ + public class Resource + { + public ResourceType ResourceType { get; set; } + public string Url { get; set; } + public string Integrity { get; set; } + public string CrossOrigin { get; set; } + } +} diff --git a/Oqtane.Shared/Models/Theme.cs b/Oqtane.Shared/Models/Theme.cs index a2dd83df..d5a29552 100644 --- a/Oqtane.Shared/Models/Theme.cs +++ b/Oqtane.Shared/Models/Theme.cs @@ -1,4 +1,6 @@ -namespace Oqtane.Models +using System.Collections.Generic; + +namespace Oqtane.Models { public class Theme { From c426302242f39a21f7f102422ea01fdbcb21e839 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sat, 16 May 2020 13:40:59 -0400 Subject: [PATCH 3/7] enhanced module creator to display location where module will be created --- .../Modules/Admin/ModuleCreator/Index.razor | 116 ++++++++++++------ .../{[Module] => [Owner].[Module]}/Edit.razor | 0 .../Index.razor | 0 .../ModuleInfo.cs | 0 .../Services/I[Module]Service.cs | 0 .../Services/[Module]Service.cs | 0 .../Settings.razor | 0 .../Controllers/[Module]Controller.cs | 0 .../Manager/[Module]Manager.cs | 0 .../Repository/I[Module]Repository.cs | 0 .../Repository/[Module]Context.cs | 0 .../Repository/[Module]Repository.cs | 0 .../Scripts/[Owner].[Module]s.1.0.0.sql | 0 .../Scripts/[Owner].[Module]s.Uninstall.sql | 0 .../Models/[Module].cs | 0 .../Controllers/ModuleDefinitionController.cs | 4 +- 16 files changed, 82 insertions(+), 38 deletions(-) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/Edit.razor (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/Index.razor (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/ModuleInfo.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/Services/I[Module]Service.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/Services/[Module]Service.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/{[Module] => [Owner].[Module]}/Settings.razor (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Controllers/[Module]Controller.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Manager/[Module]Manager.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Repository/I[Module]Repository.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Repository/[Module]Context.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Repository/[Module]Repository.cs (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Scripts/[Owner].[Module]s.1.0.0.sql (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/{[Module] => [Owner].[Module]}/Scripts/[Owner].[Module]s.Uninstall.sql (100%) rename Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Shared/Modules/{[Module] => [Owner].[Module]}/Models/[Module].cs (100%) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index 8b4cb758..198ecb9b 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -3,53 +3,66 @@ @inject NavigationManager NavigationManager @inject IModuleDefinitionService ModuleDefinitionService @inject IModuleService ModuleService +@inject ISystemService SystemService - +
+ + + + + + + + + + + + + + + + + @if (!string.IsNullOrEmpty(_location)) + { - - - - - - - - - - - - -
+ + + +
+ + + +
+ + + +
+ + + +
- + - +
- - - -
- - - -
- - - -
+ } + -@code { +@code { private string _owner = string.Empty; private string _module = string.Empty; private string _description = string.Empty; - private string _template = string.Empty; + private string _template = "-"; + private string _location = string.Empty; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -62,9 +75,9 @@ { try { - if (!string.IsNullOrEmpty(_owner) && !string.IsNullOrEmpty(_module) && !string.IsNullOrEmpty(_template)) + if (!string.IsNullOrEmpty(_owner) && !string.IsNullOrEmpty(_module) && _template != "-") { - var moduleDefinition = new ModuleDefinition { Owner = _owner.Replace(" ",""), Name = _module.Replace(" ", ""), Description = _description, Template = _template }; + var moduleDefinition = new ModuleDefinition { Owner = _owner.Replace(" ", ""), Name = _module.Replace(" ", ""), Description = _description, Template = _template }; await ModuleDefinitionService.CreateModuleDefinitionAsync(moduleDefinition, ModuleState.ModuleId); } else @@ -77,4 +90,35 @@ await logger.LogError(ex, "Error Creating Module"); } } + + private async void TemplateChanged(ChangeEventArgs e) + { + try + { + _location = string.Empty; + _template = (string)e.Value; + if (_template != "-") + { + Dictionary systeminfo = await SystemService.GetSystemInfoAsync(); + if (systeminfo != null) + { + string[] path = systeminfo["serverpath"].Split('\\'); + if (_template == "internal") + { + _location = string.Join("\\", path, 0, path.Length - 1) + "\\Oqtane.Client\\Modules\\" + _owner + "." + _module; + } + else + { + _location = string.Join("\\", path, 0, path.Length - 2) + "\\" + _owner + "." + _module; + } + } + } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Getting System Info {Error}", ex.Message); + AddModuleMessage("Error Getting System Info", MessageType.Error); + } + } } diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Edit.razor similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Edit.razor rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Edit.razor diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Index.razor similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Index.razor diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/ModuleInfo.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/ModuleInfo.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/ModuleInfo.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Services/I[Module]Service.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Services/I[Module]Service.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Services/I[Module]Service.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Services/I[Module]Service.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Services/[Module]Service.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Services/[Module]Service.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Services/[Module]Service.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Services/[Module]Service.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Settings.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Settings.razor similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Settings.razor rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Owner].[Module]/Settings.razor diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Controllers/[Module]Controller.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Controllers/[Module]Controller.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Controllers/[Module]Controller.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Controllers/[Module]Controller.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Manager/[Module]Manager.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Manager/[Module]Manager.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/I[Module]Repository.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/I[Module]Repository.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/I[Module]Repository.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/I[Module]Repository.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/[Module]Context.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/[Module]Context.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/[Module]Context.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/[Module]Context.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/[Module]Repository.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/[Module]Repository.cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Repository/[Module]Repository.cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Repository/[Module]Repository.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Scripts/[Owner].[Module]s.1.0.0.sql b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Scripts/[Owner].[Module]s.1.0.0.sql similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Scripts/[Owner].[Module]s.1.0.0.sql rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Scripts/[Owner].[Module]s.1.0.0.sql diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Scripts/[Owner].[Module]s.Uninstall.sql b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Scripts/[Owner].[Module]s.Uninstall.sql similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Scripts/[Owner].[Module]s.Uninstall.sql rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Owner].[Module]/Scripts/[Owner].[Module]s.Uninstall.sql diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Shared/Modules/[Module]/Models/[Module].cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Shared/Modules/[Owner].[Module]/Models/[Module].cs similarity index 100% rename from Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Shared/Modules/[Module]/Models/[Module].cs rename to Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Shared/Modules/[Owner].[Module]/Models/[Module].cs diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs index 039d6782..29dd91d2 100644 --- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs +++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs @@ -231,8 +231,8 @@ namespace Oqtane.Controllers { // add embedded resources to project List resources = new List(); - resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.1.0.0.sql")); - resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Uninstall.sql")); + resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Owner + "." + moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.1.0.0.sql")); + resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Owner + "." + moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Uninstall.sql")); EmbedResourceFiles(Utilities.PathCombine(rootPath, "Oqtane.Server", "Oqtane.Server.csproj"), resources); } From f8ab8867504c5f7eef077c2ee3f8f17dd6c56204 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sat, 16 May 2020 22:11:58 -0400 Subject: [PATCH 4/7] Fixed issue with loading resources --- Oqtane.Client/Themes/BlazorTheme/Default.razor | 6 ------ Oqtane.Client/Themes/OqtaneTheme/Default.razor | 10 +--------- Oqtane.Server/wwwroot/js/interop.js | 12 ++++++++---- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/Oqtane.Client/Themes/BlazorTheme/Default.razor b/Oqtane.Client/Themes/BlazorTheme/Default.razor index 4fa2a01d..2ed0d1fb 100644 --- a/Oqtane.Client/Themes/BlazorTheme/Default.razor +++ b/Oqtane.Client/Themes/BlazorTheme/Default.razor @@ -37,10 +37,4 @@ return resources; } } - - protected override async Task OnParametersSetAsync() - { - //await IncludeCSS("Theme.css"); - } - } \ No newline at end of file diff --git a/Oqtane.Client/Themes/OqtaneTheme/Default.razor b/Oqtane.Client/Themes/OqtaneTheme/Default.razor index f6238a17..67d53081 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Default.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Default.razor @@ -25,16 +25,8 @@ { List resources = new List(); resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/cyborg/bootstrap.min.css", Integrity = "sha384-l7xaoY0cJM4h9xh1RfazbgJVUZvdtyLWPueWNtLAphf/UbBgOVzqbOTogxPwYLHM", CrossOrigin = "anonymous" }); - resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "Themes/" + GetType().Namespace + "/Theme.css" }); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "Themes/" + GetType().Namespace + "/Theme.css", Integrity = "", CrossOrigin = "" }); return resources; } } - - protected override async Task OnParametersSetAsync() - { - // go to https://www.bootstrapcdn.com/bootswatch/ and take your favorite theme - // - //await LoadBootstrapTheme("https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/cyborg/bootstrap.min.css","sha384-l7xaoY0cJM4h9xh1RfazbgJVUZvdtyLWPueWNtLAphf/UbBgOVzqbOTogxPwYLHM"); - //await IncludeCSS("Theme.css"); - } } diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index 36b6c4f3..3f42cd11 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -62,10 +62,10 @@ window.interop = { link.id = id; } link.rel = rel; - link.href = url; if (type !== "") { link.type = type; } + link.href = url; if (integrity !== "") { link.integrity = integrity; } @@ -78,9 +78,6 @@ window.interop = { if (link.rel !== rel) { link.setAttribute('rel', rel); } - if (link.href !== url) { - link.setAttribute('href', url); - } if (type !== "") { if (link.type !== type) { link.setAttribute('type', type); @@ -88,6 +85,11 @@ window.interop = { } else { link.removeAttribute('type'); } + if (link.href !== url) { + link.removeAttribute('integrity'); + link.removeAttribute('crossorigin'); + link.setAttribute('href', url); + } if (integrity !== "") { if (link.integrity !== integrity) { link.setAttribute('integrity', integrity); @@ -136,6 +138,8 @@ window.interop = { else { if (src !== "") { if (script.src !== src) { + script.removeAttribute('integrity'); + script.removeAttribute('crossorigin'); script.src = src; } if (integrity !== "") { From 9b74262c763a2b274ae6eb99954102575c0b264a Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Mon, 18 May 2020 09:47:37 -0400 Subject: [PATCH 5/7] Added support for module resource management --- Oqtane.Client/Modules/HtmlText/Edit.razor | 24 ++- Oqtane.Client/Modules/HtmlText/Index.razor | 10 ++ Oqtane.Client/Modules/ModuleBase.cs | 4 + .../Themes/BlazorTheme/Default.razor | 2 +- .../Themes/Controls/ControlPanel.razor | 4 +- .../Themes/Controls/ModuleActionsBase.cs | 2 +- .../Themes/OqtaneTheme/Default.razor | 2 +- Oqtane.Client/UI/SiteRouter.razor | 137 ++++++++++-------- Oqtane.Client/UI/ThemeBuilder.razor | 14 +- Oqtane.Server/Pages/_Host.cshtml | 5 - .../Oqtane.Modules.HtmlText/Module.css | 1 + Oqtane.Server/wwwroot/js/interop.js | 48 ------ Oqtane.Server/wwwroot/js/quill-interop.js | 50 +++++++ Oqtane.Server/wwwroot/js/site.js | 1 - Oqtane.Shared/Interfaces/IModuleControl.cs | 5 +- Oqtane.Shared/Models/Page.cs | 2 +- 16 files changed, 183 insertions(+), 128 deletions(-) create mode 100644 Oqtane.Server/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css create mode 100644 Oqtane.Server/wwwroot/js/quill-interop.js delete mode 100644 Oqtane.Server/wwwroot/js/site.js diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index c9c94bc7..442aee36 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -20,6 +20,26 @@ } @code { + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; + + public override string Title => "Edit Html/Text"; + + public override List Resources + { + get + { + List resources = new List(); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css", Integrity = "", CrossOrigin = "" }); + // the following resources should be declared in the RichTextEditor component however the framework currently only supports resource management for modules and themes + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.6.bubble.css", Integrity = "", CrossOrigin = "" }); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.6.snow.css", Integrity = "", CrossOrigin = "" }); + resources.Add(new Resource { ResourceType = ResourceType.Script, Url = "js/quill1.3.6.min.js", Integrity = "", CrossOrigin = "" }); + resources.Add(new Resource { ResourceType = ResourceType.Script, Url = "js/quill-blot-formatter.min.js", Integrity = "", CrossOrigin = "" }); + resources.Add(new Resource { ResourceType = ResourceType.Script, Url = "js/quill-interop.js", Integrity = "", CrossOrigin = "" }); + return resources; + } + } + private RichTextEditor RichTextEditorHtml; private string _content = null; private string _createdby; @@ -27,10 +47,6 @@ private string _modifiedby; private DateTime _modifiedon; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; - - public override string Title => "Edit Html/Text"; - protected override async Task OnInitializedAsync() { try diff --git a/Oqtane.Client/Modules/HtmlText/Index.razor b/Oqtane.Client/Modules/HtmlText/Index.razor index 6821c425..5d18e498 100644 --- a/Oqtane.Client/Modules/HtmlText/Index.razor +++ b/Oqtane.Client/Modules/HtmlText/Index.razor @@ -11,6 +11,16 @@ } @code { + public override List Resources + { + get + { + List resources = new List(); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css", Integrity = "", CrossOrigin = "" }); + return resources; + } + } + private string content = ""; protected override async Task OnParametersSetAsync() diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 188da769..9da4a090 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -6,6 +6,7 @@ using Oqtane.Services; using System; using Oqtane.Enums; using Oqtane.UI; +using System.Collections.Generic; namespace Oqtane.Modules { @@ -37,6 +38,9 @@ namespace Oqtane.Modules public virtual bool UseAdminContainer { get { return true; } } + public virtual List Resources { get; set; } + + // path method public string ModulePath() diff --git a/Oqtane.Client/Themes/BlazorTheme/Default.razor b/Oqtane.Client/Themes/BlazorTheme/Default.razor index 2ed0d1fb..a51a130c 100644 --- a/Oqtane.Client/Themes/BlazorTheme/Default.razor +++ b/Oqtane.Client/Themes/BlazorTheme/Default.razor @@ -33,7 +33,7 @@ get { List resources = new List(); - resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = "Themes/" + GetType().Namespace + "/Theme.css", Integrity = "", CrossOrigin = "" }); + resources.Add(new Resource { ResourceType = ResourceType.Stylesheet, Url = ThemePath() + "Theme.css", Integrity = "", CrossOrigin = "" }); return resources; } } diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index ec463657..e80ca085 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -149,7 +149,7 @@