diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].[Theme].Client.csproj b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].Theme.[Theme].Client.csproj similarity index 91% rename from Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].[Theme].Client.csproj rename to Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].Theme.[Theme].Client.csproj index 2384950b..8655320d 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].[Theme].Client.csproj +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/[Owner].Theme.[Theme].Client.csproj @@ -7,9 +7,9 @@ [Owner] [Owner] [Description] - [Owner].[Theme] + [Owner].Theme.[Theme] [Owner] - [Owner].[Theme].Client.Oqtane + [Owner].Theme.[Theme].Client.Oqtane diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].[Theme]/Theme.css b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css similarity index 100% rename from Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].[Theme]/Theme.css rename to Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].Package.csproj b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].Package.csproj similarity index 82% rename from Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].Package.csproj rename to Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].Package.csproj index 146de14b..9a177618 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].Package.csproj +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].Package.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -13,7 +13,7 @@ - + diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].nuspec b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec similarity index 74% rename from Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].nuspec rename to Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec index 01bed2e2..ea341aee 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].[Theme].nuspec +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec @@ -1,7 +1,7 @@ - + - [Owner].[Theme] + [Owner].Theme.[Theme] 1.0.0 [Owner] [Owner] @@ -20,8 +20,8 @@ - - + + diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd index bc59c5d5..1cda25a6 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd @@ -1,3 +1,3 @@ -XCOPY "..\Client\bin\Debug\net7.0\[Owner].[Theme].Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Client\bin\Debug\net7.0\[Owner].[Theme].Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Client\bin\Debug\net7.0\[Owner].Theme.[Theme].Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Client\bin\Debug\net7.0\[Owner].Theme.[Theme].Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y XCOPY "..\Client\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd index 3d4edfe1..adb7ee28 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd @@ -1,2 +1,2 @@ -"..\..\[RootFolder]\oqtane.package\nuget.exe" pack [Owner].[Theme].nuspec +"..\..\[RootFolder]\oqtane.package\nuget.exe" pack [Owner].Theme.[Theme].nuspec XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\wwwroot\Themes\" /Y diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/[Owner].[Theme].sln b/Oqtane.Server/wwwroot/Themes/Templates/External/[Owner].[Theme].sln deleted file mode 100644 index 7eb89f5a..00000000 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/[Owner].[Theme].sln +++ /dev/null @@ -1,37 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28621.142 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Server", "..\[RootFolder]\Oqtane.Server\Oqtane.Server.csproj", "{3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Theme].Client", "Client\[Owner].[Theme].Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Theme].Package", "Package\[Owner].[Theme].Package.csproj", "{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}.Release|Any CPU.Build.0 = Release|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.Build.0 = Release|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1D016F15-46FE-4726-8DFD-2E4FD4DC7668} - EndGlobalSection -EndGlobal From 08daca848b64e16e36e64fbf71cd279e1e7a902c Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 19 Jun 2023 09:01:40 -0400 Subject: [PATCH 088/111] optimize head component rendering --- Oqtane.Client/Head.razor | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Oqtane.Client/Head.razor b/Oqtane.Client/Head.razor index 28e2455d..0a80f6e2 100644 --- a/Oqtane.Client/Head.razor +++ b/Oqtane.Client/Head.razor @@ -2,12 +2,12 @@ @using Oqtane.Shared @inject SiteState SiteState -@((MarkupString)title) -@((MarkupString)content) +@((MarkupString)_title) +@((MarkupString)_content) @code { - private string title = ""; - private string content = ""; + private string _title = ""; + private string _content = ""; protected override void OnInitialized() { @@ -19,12 +19,20 @@ switch (e.PropertyName) { case "PageTitle": - title = "\n" + SiteState.Properties.PageTitle + ""; - StateHasChanged(); + var title = "\n" + SiteState.Properties.PageTitle + ""; + if (title != _title) + { + _title = title; + StateHasChanged(); + } break; case "HeadContent": - content = RemoveScripts(SiteState.Properties.HeadContent) + "\n"; - StateHasChanged(); + var content = RemoveScripts(SiteState.Properties.HeadContent) + "\n"; + if (content != _content) + { + _content = content; + StateHasChanged(); + } break; } } From e3233fd19f72cbe2eeb108d4fac5016b2413b262 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 19 Jun 2023 10:11:24 -0400 Subject: [PATCH 089/111] add defensive logic --- .../Extensions/OqtaneServiceCollectionExtensions.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 443d7c33..a7239af2 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -201,9 +201,12 @@ namespace Microsoft.Extensions.DependencyInjection // set the cookies to allow HttpClient API calls to be authenticated var httpContextAccessor = s.GetRequiredService(); - foreach (var cookie in httpContextAccessor.HttpContext.Request.Cookies) + if (httpContextAccessor.HttpContext != null) { - client.DefaultRequestHeaders.Add("Cookie", cookie.Key + "=" + cookie.Value); + foreach (var cookie in httpContextAccessor.HttpContext.Request.Cookies) + { + client.DefaultRequestHeaders.Add("Cookie", cookie.Key + "=" + cookie.Value); + } } return client; From 3849f59126d695ad091a190cd01e8e01a42bc168 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 19 Jun 2023 12:29:43 -0400 Subject: [PATCH 090/111] fix #2900 - theme deletion and fallback --- Oqtane.Client/UI/SiteRouter.razor | 26 +++++++++---------- .../Controllers/ModuleDefinitionController.cs | 1 + Oqtane.Server/Controllers/ThemeController.cs | 4 ++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 38b5d993..b724da31 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -318,31 +318,29 @@ { try { + page.Panes = new List(); + page.Resources = new List(); + + // validate theme if (string.IsNullOrEmpty(page.ThemeType)) { page.ThemeType = site.DefaultThemeType; } - - page.Panes = new List(); - page.Resources = new List(); - - // get theme resources var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType)); - if (theme != null) - { - page.Resources = ManagePageResources(page.Resources, theme.Resources, ResourceLevel.Page, alias, "Themes", Utilities.GetTypeName(theme.ThemeName)); - } - - string panes = ""; Type themetype = Type.GetType(page.ThemeType); - if (themetype == null) + if (themetype == null || theme == null) { - // fallback + // fallback to default Oqtane theme page.ThemeType = Constants.DefaultTheme; themetype = Type.GetType(Constants.DefaultTheme); } + + string panes = ""; if (themetype != null) { + // get resources for theme (ITheme) + page.Resources = ManagePageResources(page.Resources, theme.Resources, ResourceLevel.Page, alias, "Themes", Utilities.GetTypeName(theme.ThemeName)); + var themeobject = Activator.CreateInstance(themetype) as IThemeControl; if (themeobject != null) { @@ -350,9 +348,11 @@ { panes = themeobject.Panes; } + // get resources for theme control page.Resources = ManagePageResources(page.Resources, themeobject.Resources, ResourceLevel.Page, alias, "Themes", themetype.Namespace); } } + if (!string.IsNullOrEmpty(panes)) { page.Panes = panes.Replace(";", ",").Split(',', StringSplitOptions.RemoveEmptyEntries).ToList(); diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs index 224985a7..b672c72f 100644 --- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs +++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs @@ -258,6 +258,7 @@ namespace Oqtane.Controllers // remove module definition _moduleDefinitions.DeleteModuleDefinition(id); _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.ModuleDefinition, moduledefinition.ModuleDefinitionId, SyncEventActions.Delete); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, moduledefinition.SiteId, SyncEventActions.Refresh); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Module Definition {ModuleDefinitionName} Deleted", moduledefinition.Name); } else diff --git a/Oqtane.Server/Controllers/ThemeController.cs b/Oqtane.Server/Controllers/ThemeController.cs index ab54e542..c15679ad 100644 --- a/Oqtane.Server/Controllers/ThemeController.cs +++ b/Oqtane.Server/Controllers/ThemeController.cs @@ -117,7 +117,9 @@ namespace Oqtane.Controllers } // remove theme - //_themes.DeleteTheme(theme.ThemeName); + _themes.DeleteTheme(theme.ThemeId); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Theme, theme.ThemeId, SyncEventActions.Delete); + _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, theme.SiteId, SyncEventActions.Refresh); _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Theme Removed For {ThemeName}", theme.ThemeName); } else From 6bea9a087ca3e02e849b4a2a95fa82c257319c9b Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 19 Jun 2023 15:10:58 -0400 Subject: [PATCH 091/111] more optimizations of Head component --- Oqtane.Client/Head.razor | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Head.razor b/Oqtane.Client/Head.razor index 0a80f6e2..18207178 100644 --- a/Oqtane.Client/Head.razor +++ b/Oqtane.Client/Head.razor @@ -2,8 +2,14 @@ @using Oqtane.Shared @inject SiteState SiteState -@((MarkupString)_title) -@((MarkupString)_content) +@if (!string.IsNullOrEmpty(_title)) +{ + @((MarkupString)_title) +} +@if (!string.IsNullOrEmpty(_content)) +{ + @((MarkupString)_content) +} @code { private string _title = ""; From 02e22df4d5c57179c86077243ea9ed48a0070406 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 19 Jun 2023 16:22:49 -0400 Subject: [PATCH 092/111] fix parent page selection in add page and fix navigation on save/cancel --- Oqtane.Client/Modules/Admin/Pages/Add.razor | 6 +++--- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 6d82ca6d..23253039 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -25,7 +25,7 @@
- @foreach (Page page in PageState.Pages) { @@ -454,11 +454,11 @@ await logger.LogInformation("Page Added {Page}", page); if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(PageState.ReturnUrl); + NavigationManager.NavigateTo(page.Path); // redirect to new page } else { - NavigationManager.NavigateTo(NavigateUrl(page.Path)); + NavigationManager.NavigateTo(NavigateUrl()); // redirect to page management } } else diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 1933bfe6..1eda0dfa 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -654,7 +654,7 @@ } else { - NavigationManager.NavigateTo(NavigateUrl(_page.Path)); + NavigationManager.NavigateTo(NavigateUrl()); } } else From 3abe47ae9e6c54aad405ed280566e7881b53e034 Mon Sep 17 00:00:00 2001 From: vnetonline Date: Tue, 20 Jun 2023 16:52:50 +1000 Subject: [PATCH 093/111] [ENHANCE] - Added Module to NameSpace [Owner].Module.[Module] [ENHANCE] - Added Module to NameSpace [Owner].Module.[Module] --- .../Modules/Admin/ModuleCreator/Index.razor | 2 +- .../Controllers/ModuleDefinitionController.cs | 10 +++++----- Oqtane.Server/Oqtane.Server.csproj | 15 ++------------- .../Templates/External/Client/AssemblyInfo.cs | 4 ++-- .../Modules/Templates/External/Client/Interop.cs | 4 ++-- .../Edit.razor | 6 +++--- .../Index.razor | 6 +++--- .../ModuleInfo.cs | 6 +++--- .../Settings.razor | 2 +- .../Edit.resx | 0 .../Index.resx | 0 .../Settings.resx | 0 .../External/Client/Services/I[Module]Service.cs | 4 ++-- .../External/Client/Services/[Module]Service.cs | 4 ++-- ...roj => [Owner].Module.[Module].Client.csproj} | 6 +++--- ...oj => [Owner].Module.[Module].Package.csproj} | 8 ++++---- ...le].nuspec => [Owner].Module.[Module].nuspec} | 16 ++++++++-------- .../Modules/Templates/External/Package/debug.cmd | 12 ++++++------ .../Templates/External/Package/release.cmd | 2 +- .../Server/Controllers/[Module]Controller.cs | 4 ++-- .../External/Server/Manager/[Module]Manager.cs | 8 ++++---- .../Migrations/01000000_InitializeModule.cs | 8 ++++---- .../EntityBuilders/[Module]EntityBuilder.cs | 2 +- .../Server/Repository/I[Module]Repository.cs | 4 ++-- .../Server/Repository/[Module]Context.cs | 2 +- .../Server/Repository/[Module]Repository.cs | 4 ++-- ...roj => [Owner].Module.[Module].Server.csproj} | 6 +++--- .../Module.css | 0 .../Module.js | 2 +- .../Templates/External/Shared/Models/[Module].cs | 2 +- ...roj => [Owner].Module.[Module].Shared.csproj} | 4 ++-- ....[Module].sln => [Owner].Module.[Module].sln} | 10 +++++----- 32 files changed, 76 insertions(+), 87 deletions(-) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/Edit.razor (97%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/Index.razor (95%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/ModuleInfo.cs (71%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/Settings.razor (97%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/{[Owner].[Module] => [Owner].Module.[Module]}/Edit.resx (100%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/{[Owner].[Module] => [Owner].Module.[Module]}/Index.resx (100%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/{[Owner].[Module] => [Owner].Module.[Module]}/Settings.resx (100%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Client/{[Owner].[Module].Client.csproj => [Owner].Module.[Module].Client.csproj} (86%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Package/{[Owner].[Module].Package.csproj => [Owner].Module.[Module].Package.csproj} (65%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Package/{[Owner].[Module].nuspec => [Owner].Module.[Module].nuspec} (53%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Server/{[Owner].[Module].Server.csproj => [Owner].Module.[Module].Server.csproj} (84%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/Module.css (100%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/{[Owner].[Module] => [Owner].Module.[Module]}/Module.js (65%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Shared/{[Owner].[Module].Shared.csproj => [Owner].Module.[Module].Shared.csproj} (80%) rename Oqtane.Server/wwwroot/Modules/Templates/External/{[Owner].[Module].sln => [Owner].Module.[Module].sln} (77%) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index bd5689f6..6785292a 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -195,7 +195,7 @@ else if (_owner != "" && _module != "" && _template != "-") { var template = _templates.FirstOrDefault(item => item.Name == _template); - _location = template.Location + _owner + "." + _module; + _location = template.Location + _owner + ".Module." + _module; } StateHasChanged(); diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs index b672c72f..c8114821 100644 --- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs +++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs @@ -123,14 +123,14 @@ namespace Oqtane.Controllers if (moduleDefinition.Template.ToLower().Contains("internal")) { rootPath = Utilities.PathCombine(rootFolder.FullName, Path.DirectorySeparatorChar.ToString()); - moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + ", Oqtane.Client"; - moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + ".Manager." + moduleDefinition.Name + "Manager, Oqtane.Server"; + moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ", Oqtane.Client"; + moduleDefinition.ServerManagerType = moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ".Manager." + moduleDefinition.Name + "Manager, Oqtane.Server"; } else { - rootPath = Utilities.PathCombine(rootFolder.Parent.FullName, moduleDefinition.Owner + "." + moduleDefinition.Name, Path.DirectorySeparatorChar.ToString()); - moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + ", " + moduleDefinition.Owner + "." + moduleDefinition.Name + ".Client.Oqtane"; - moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + ".Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + ".Server.Oqtane"; + rootPath = Utilities.PathCombine(rootFolder.Parent.FullName, moduleDefinition.Owner + ".Module." + moduleDefinition.Name, Path.DirectorySeparatorChar.ToString()); + moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ", " + moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ".Client.Oqtane"; + moduleDefinition.ServerManagerType = moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ".Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + ".Module." + moduleDefinition.Name + ".Server.Oqtane"; } ProcessTemplatesRecursively(new DirectoryInfo(templatePath), rootPath, rootFolder.Name, templatePath, moduleDefinition); diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 737c5160..780e0400 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -21,10 +21,10 @@ - - + + @@ -63,15 +63,4 @@ - - - - - - - - - - - diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/AssemblyInfo.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/AssemblyInfo.cs index 247d7bc8..4def57e3 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/AssemblyInfo.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Resources; +using System.Resources; using Microsoft.Extensions.Localization; -[assembly: RootNamespace("[Owner].[Module].Client")] \ No newline at end of file +[assembly: RootNamespace("[Owner].Module.[Module].Client")] diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Interop.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Interop.cs index 9d6f0a4e..bcb7d729 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Interop.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Interop.cs @@ -1,7 +1,7 @@ -using Microsoft.JSInterop; +using Microsoft.JSInterop; using System.Threading.Tasks; -namespace [Owner].[Module] +namespace [Owner].Module.[Module] { public class Interop { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Edit.razor b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor similarity index 97% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Edit.razor rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor index 20cf950a..23ca8f4f 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Edit.razor +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor @@ -1,8 +1,8 @@ @using Oqtane.Modules.Controls -@using [Owner].[Module].Services -@using [Owner].[Module].Models +@using [Owner].Module.[Module].Services +@using [Owner].Module.[Module].Models -@namespace [Owner].[Module] +@namespace [Owner].Module.[Module] @inherits ModuleBase @inject I[Module]Service [Module]Service @inject NavigationManager NavigationManager diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Index.razor b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor similarity index 95% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Index.razor rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor index df7b157a..91eef0a1 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Index.razor +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor @@ -1,7 +1,7 @@ -@using [Owner].[Module].Services -@using [Owner].[Module].Models +@using [Owner].Module.[Module].Services +@using [Owner].Module.[Module].Models -@namespace [Owner].[Module] +@namespace [Owner].Module.[Module] @inherits ModuleBase @inject I[Module]Service [Module]Service @inject NavigationManager NavigationManager diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/ModuleInfo.cs similarity index 71% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/ModuleInfo.cs index 0585c65c..8ba827d6 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/ModuleInfo.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/ModuleInfo.cs @@ -1,7 +1,7 @@ using Oqtane.Models; using Oqtane.Modules; -namespace [Owner].[Module] +namespace [Owner].Module.[Module] { public class ModuleInfo : IModule { @@ -12,8 +12,8 @@ namespace [Owner].[Module] Version = "1.0.0", ServerManagerType = "[ServerManagerType]", ReleaseVersions = "1.0.0", - Dependencies = "[Owner].[Module].Shared.Oqtane", - PackageName = "[Owner].[Module]" + Dependencies = "[Owner].Module.[Module].Shared.Oqtane", + PackageName = "[Owner].Module.[Module]" }; } } diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Settings.razor b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Settings.razor similarity index 97% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Settings.razor rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Settings.razor index 51ff22e6..d8f9bfaf 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].[Module]/Settings.razor +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Settings.razor @@ -1,4 +1,4 @@ -@namespace [Owner].[Module] +@namespace [Owner].Module.[Module] @inherits ModuleBase @inject ISettingService SettingService @inject IStringLocalizer Localizer diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Edit.resx b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Edit.resx similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Edit.resx rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Edit.resx diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Index.resx b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Index.resx similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Index.resx rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Index.resx diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Settings.resx b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Settings.resx similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].[Module]/Settings.resx rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/Resources/[Owner].Module.[Module]/Settings.resx diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/I[Module]Service.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/I[Module]Service.cs index 601eba6a..30ea62c9 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/I[Module]Service.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/I[Module]Service.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; using System.Threading.Tasks; -using [Owner].[Module].Models; +using [Owner].Module.[Module].Models; -namespace [Owner].[Module].Services +namespace [Owner].Module.[Module].Services { public interface I[Module]Service { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/[Module]Service.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/[Module]Service.cs index cd154052..b6503356 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/[Module]Service.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Services/[Module]Service.cs @@ -5,9 +5,9 @@ using System.Threading.Tasks; using Oqtane.Modules; using Oqtane.Services; using Oqtane.Shared; -using [Owner].[Module].Models; +using [Owner].Module.[Module].Models; -namespace [Owner].[Module].Services +namespace [Owner].Module.[Module].Services { public class [Module]Service : ServiceBase, I[Module]Service, IService { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].[Module].Client.csproj b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].Module.[Module].Client.csproj similarity index 86% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].[Module].Client.csproj rename to Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].Module.[Module].Client.csproj index 423c3e27..98abe0e7 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].[Module].Client.csproj +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/[Owner].Module.[Module].Client.csproj @@ -7,9 +7,9 @@ [Owner] [Owner] [Description] - [Owner].[Module] + [Owner].Module.[Module] [Owner] - [Owner].[Module].Client.Oqtane + [Owner].Module.[Module].Client.Oqtane @@ -22,7 +22,7 @@ - + diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].Package.csproj b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].Package.csproj similarity index 65% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].Package.csproj rename to Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].Package.csproj index 50fa0fbf..fa3cfe16 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].Package.csproj +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].Package.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -13,9 +13,9 @@ - - - + + + diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].nuspec b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec similarity index 53% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].nuspec rename to Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec index 70658e74..f148f2d3 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].[Module].nuspec +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec @@ -1,7 +1,7 @@ - + - [Owner].[Module] + [Owner].Module.[Module] 1.0.0 [Owner] [Owner] @@ -20,12 +20,12 @@ - - - - - - + + + + + + diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd index 4f0cf6d4..6f8b554a 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd @@ -1,7 +1,7 @@ -XCOPY "..\Client\bin\Debug\net7.0\[Owner].[Module].Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Client\bin\Debug\net7.0\[Owner].[Module].Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Server\bin\Debug\net7.0\[Owner].[Module].Server.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Server\bin\Debug\net7.0\[Owner].[Module].Server.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Shared\bin\Debug\net7.0\[Owner].[Module].Shared.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y -XCOPY "..\Shared\bin\Debug\net7.0\[Owner].[Module].Shared.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Client\bin\Debug\net7.0\[Owner].Module.[Module].Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Client\bin\Debug\net7.0\[Owner].Module.[Module].Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Server\bin\Debug\net7.0\[Owner].Module.[Module].Server.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Server\bin\Debug\net7.0\[Owner].Module.[Module].Server.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Shared\bin\Debug\net7.0\[Owner].Module.[Module].Shared.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y +XCOPY "..\Shared\bin\Debug\net7.0\[Owner].Module.[Module].Shared.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\net7.0\" /Y XCOPY "..\Server\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd index dd5c95db..14ce91dc 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd @@ -1,3 +1,3 @@ -"..\..\[RootFolder]\oqtane.package\nuget.exe" pack [Owner].[Module].nuspec +"..\..\[RootFolder]\oqtane.package\nuget.exe" pack [Owner].Module.[Module].nuspec XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" /Y diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Controllers/[Module]Controller.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Controllers/[Module]Controller.cs index f5bf1443..90384aff 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Controllers/[Module]Controller.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Controllers/[Module]Controller.cs @@ -5,11 +5,11 @@ using Microsoft.AspNetCore.Http; using Oqtane.Shared; using Oqtane.Enums; using Oqtane.Infrastructure; -using [Owner].[Module].Repository; +using [Owner].Module.[Module].Repository; using Oqtane.Controllers; using System.Net; -namespace [Owner].[Module].Controllers +namespace [Owner].Module.[Module].Controllers { [Route(ControllerRoutes.ApiRoute)] public class [Module]Controller : ModuleControllerBase diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Manager/[Module]Manager.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Manager/[Module]Manager.cs index 18e08faf..17553cc8 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Manager/[Module]Manager.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Manager/[Module]Manager.cs @@ -7,9 +7,9 @@ using Oqtane.Models; using Oqtane.Infrastructure; using Oqtane.Enums; using Oqtane.Repository; -using [Owner].[Module].Repository; +using [Owner].Module.[Module].Repository; -namespace [Owner].[Module].Manager +namespace [Owner].Module.[Module].Manager { public class [Module]Manager : MigratableModuleBase, IInstallable, IPortable { @@ -32,7 +32,7 @@ namespace [Owner].[Module].Manager return Migrate(new [Module]Context(_DBContextDependencies), tenant, MigrationType.Down); } - public string ExportModule(Module module) + public string ExportModule(Oqtane.Models.Module module) { string content = ""; List [Module]s = _[Module]Repository.Get[Module]s(module.ModuleId).ToList(); @@ -43,7 +43,7 @@ namespace [Owner].[Module].Manager return content; } - public void ImportModule(Module module, string content, string version) + public void ImportModule(Oqtane.Models.Module module, string content, string version) { List [Module]s = null; if (!string.IsNullOrEmpty(content)) diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/01000000_InitializeModule.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/01000000_InitializeModule.cs index 542d6087..d40eb50c 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/01000000_InitializeModule.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/01000000_InitializeModule.cs @@ -2,13 +2,13 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Oqtane.Databases.Interfaces; using Oqtane.Migrations; -using [Owner].[Module].Migrations.EntityBuilders; -using [Owner].[Module].Repository; +using [Owner].Module.[Module].Migrations.EntityBuilders; +using [Owner].Module.[Module].Repository; -namespace [Owner].[Module].Migrations +namespace [Owner].Module.[Module].Migrations { [DbContext(typeof([Module]Context))] - [Migration("[Owner].[Module].01.00.00.00")] + [Migration("[Owner].Module.[Module].01.00.00.00")] public class InitializeModule : MultiDatabaseMigration { public InitializeModule(IDatabase database) : base(database) diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/EntityBuilders/[Module]EntityBuilder.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/EntityBuilders/[Module]EntityBuilder.cs index c249b1d4..32ec9adb 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/EntityBuilders/[Module]EntityBuilder.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Migrations/EntityBuilders/[Module]EntityBuilder.cs @@ -5,7 +5,7 @@ using Oqtane.Databases.Interfaces; using Oqtane.Migrations; using Oqtane.Migrations.EntityBuilders; -namespace [Owner].[Module].Migrations.EntityBuilders +namespace [Owner].Module.[Module].Migrations.EntityBuilders { public class [Module]EntityBuilder : AuditableBaseEntityBuilder<[Module]EntityBuilder> { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/I[Module]Repository.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/I[Module]Repository.cs index da2db55f..959cac4a 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/I[Module]Repository.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/I[Module]Repository.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using [Owner].[Module].Models; +using [Owner].Module.[Module].Models; -namespace [Owner].[Module].Repository +namespace [Owner].Module.[Module].Repository { public interface I[Module]Repository { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Context.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Context.cs index e5541f80..a921ca0f 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Context.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Context.cs @@ -5,7 +5,7 @@ using Oqtane.Repository; using Oqtane.Infrastructure; using Oqtane.Repository.Databases.Interfaces; -namespace [Owner].[Module].Repository +namespace [Owner].Module.[Module].Repository { public class [Module]Context : DBContextBase, ITransientService, IMultiDatabase { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs index 899dca19..522c26f8 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/Repository/[Module]Repository.cs @@ -2,9 +2,9 @@ using Microsoft.EntityFrameworkCore; using System.Linq; using System.Collections.Generic; using Oqtane.Modules; -using [Owner].[Module].Models; +using [Owner].Module.[Module].Models; -namespace [Owner].[Module].Repository +namespace [Owner].Module.[Module].Repository { public class [Module]Repository : I[Module]Repository, ITransientService { diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].[Module].Server.csproj b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].Module.[Module].Server.csproj similarity index 84% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].[Module].Server.csproj rename to Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].Module.[Module].Server.csproj index db68d2ef..d77b6676 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].[Module].Server.csproj +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/[Owner].Module.[Module].Server.csproj @@ -4,12 +4,12 @@ net7.0 true 1.0.0 - [Owner].[Module] + [Owner].Module.[Module] [Owner] [Owner] [Description] [Owner] - [Owner].[Module].Server.Oqtane + [Owner].Module.[Module].Server.Oqtane true @@ -26,7 +26,7 @@ - + diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].[Module]/Module.css b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.css similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].[Module]/Module.css rename to Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.css diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].[Module]/Module.js b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js similarity index 65% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].[Module]/Module.js rename to Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js index 8f072470..11d3ded6 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].[Module]/Module.js +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js @@ -1,5 +1,5 @@ /* Module Script */ var [Owner] = [Owner] || {}; -[Owner].[Module] = { +[Owner].Module.[Module] = { }; \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Models/[Module].cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Models/[Module].cs index 45b0f2f2..ddba10ad 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Models/[Module].cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/Models/[Module].cs @@ -3,7 +3,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Oqtane.Models; -namespace [Owner].[Module].Models +namespace [Owner].Module.[Module].Models { [Table("[Owner][Module]")] public class [Module] : IAuditable diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].[Module].Shared.csproj b/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].Module.[Module].Shared.csproj similarity index 80% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].[Module].Shared.csproj rename to Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].Module.[Module].Shared.csproj index c638241d..e59810e0 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].[Module].Shared.csproj +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Shared/[Owner].Module.[Module].Shared.csproj @@ -3,12 +3,12 @@ net7.0 1.0.0 - [Owner].[Module] + [Owner].Module.[Module] [Owner] [Owner] [Description] [Owner] - [Owner].[Module].Shared.Oqtane + [Owner].Module.[Module].Shared.Oqtane diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].[Module].sln b/Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].Module.[Module].sln similarity index 77% rename from Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].[Module].sln rename to Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].Module.[Module].sln index 39259437..a9cbde70 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].[Module].sln +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/[Owner].Module.[Module].sln @@ -1,17 +1,17 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28621.142 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Server", "..\[RootFolder]\Oqtane.Server\Oqtane.Server.csproj", "{3AB6FCC9-EFEB-4C0E-A2CF-8103914C5196}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Module].Client", "Client\[Owner].[Module].Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].Module.[Module].Client", "Client\[Owner].Module.[Module].Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Module].Server", "Server\[Owner].[Module].Server.csproj", "{04B05448-788F-433D-92C0-FED35122D45A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].Module.[Module].Server", "Server\[Owner].Module.[Module].Server.csproj", "{04B05448-788F-433D-92C0-FED35122D45A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Module].Shared", "Shared\[Owner].[Module].Shared.csproj", "{18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].Module.[Module].Shared", "Shared\[Owner].Module.[Module].Shared.csproj", "{18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].[Module].Package", "Package\[Owner].[Module].Package.csproj", "{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "[Owner].Module.[Module].Package", "Package\[Owner].Module.[Module].Package.csproj", "{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From c8a679ecce0636c894058b4860976daf650b535a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 20 Jun 2023 08:52:02 -0400 Subject: [PATCH 094/111] integrate old logic for managing stylesheets using JS Interop --- Oqtane.Client/UI/Interop.cs | 30 ++++++++++++ Oqtane.Client/UI/SiteRouter.razor | 2 +- Oqtane.Client/UI/ThemeBuilder.razor | 57 ++++++++++++++++------ Oqtane.Server/Pages/_Host.cshtml | 2 + Oqtane.Server/Pages/_Host.cshtml.cs | 52 +++++++++++++++++++- Oqtane.Server/Repository/SiteRepository.cs | 3 +- Oqtane.Server/wwwroot/js/interop.js | 14 ++++++ 7 files changed, 141 insertions(+), 19 deletions(-) diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 827a56bf..9ed3f91e 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -90,6 +90,21 @@ namespace Oqtane.UI } } + public Task IncludeLinks(object[] links) + { + try + { + _jsRuntime.InvokeVoidAsync( + "Oqtane.Interop.includeLinks", + (object)links); + return Task.CompletedTask; + } + catch + { + return Task.CompletedTask; + } + } + // external scripts need to specify src, inline scripts need to specify id and content public Task IncludeScript(string id, string src, string integrity, string crossorigin, string content, string location) { @@ -125,6 +140,21 @@ namespace Oqtane.UI } } + public Task RemoveElementsById(string prefix, string first, string last) + { + try + { + _jsRuntime.InvokeVoidAsync( + "Oqtane.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 b724da31..03cda77f 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -522,7 +522,7 @@ } // ensure resource does not exist already - if (pageresources.Find(item => item.Url == resource.Url) == null) + if (!pageresources.Any(item => item.Url.ToLower() == resource.Url.ToLower())) { resource.Level = level; pageresources.Add(resource); diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index a26f3e26..fefc0025 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -31,6 +31,7 @@ // set page head content var headcontent = ""; + // favicon var favicon = "favicon.ico"; var favicontype = "x-icon"; @@ -40,12 +41,14 @@ favicontype = favicon.Substring(favicon.LastIndexOf(".") + 1); } headcontent += $"\n"; + // stylesheets - foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) - { - var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; - headcontent += "" + "\n"; - } + //foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) + //{ + // var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; + // headcontent += "" + "\n"; + //} + // head content AddHeadContent(headcontent, PageState.Site.HeadContent); if (!string.IsNullOrEmpty(PageState.Site.HeadContent)) @@ -100,27 +103,49 @@ } } - if (PageState.Page.Resources != null && PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) + if (PageState.Page.Resources != null) { var interop = new Interop(JSRuntime); - 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 (PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Stylesheet)) { - if (!string.IsNullOrEmpty(resource.Url)) + string batch = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff"); + var links = new List(); + foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) { + var prefix = "app-stylesheet-" + resource.Level.ToString().ToLower(); 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() }); + links.Add(new { id = prefix + "-" + batch + "-" + (links.Count + 1).ToString("00"), rel = "stylesheet", href = url, type = "text/css", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", insertbefore = prefix }); } - else + if (links.Any()) { - inline += 1; - await interop.IncludeScript(GetType().Namespace.ToLower() + inline.ToString(), "", "", "", resource.Content, resource.Location.ToString().ToLower()); + await interop.IncludeLinks(links.ToArray()); } + await interop.RemoveElementsById("app-stylesheet-page-", "", "app-stylesheet-page-" + batch + "-00"); + await interop.RemoveElementsById("app-stylesheet-module-", "", "app-stylesheet-module-" + batch + "-00"); } - if (scripts.Any()) + + if (PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Script)) { - await interop.IncludeScripts(scripts.ToArray()); + 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.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 6d42d8da..22bc6a90 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -15,6 +15,8 @@ { } + + @Html.Raw(Model.HeadResources) diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index ba352e25..29e1e105 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -19,6 +19,8 @@ using Microsoft.Extensions.Primitives; using Oqtane.Enums; using Oqtane.Security; using Oqtane.Extensions; +using Oqtane.Themes; +using System.Collections.Generic; namespace Oqtane.Pages { @@ -163,7 +165,29 @@ namespace Oqtane.Pages } } - // inject scripts + // stylesheets + var resources = new List(); + if (string.IsNullOrEmpty(page.ThemeType)) + { + page.ThemeType = site.DefaultThemeType; + } + var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType)); + if (theme != null) + { + resources.AddRange(theme.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); + } + var type = Type.GetType(page.ThemeType); + if (type != null) + { + var obj = Activator.CreateInstance(type) as IThemeControl; + if (obj.Resources != null) + { + resources.AddRange(obj.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); + } + } + ManageResources(resources, alias, theme.ThemeName); + + // scripts if (Runtime == "Server") { ReconnectScript = CreateReconnectScript(); @@ -468,5 +492,31 @@ namespace Oqtane.Pages CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture))); } + + private void ManageResources(List resources, Alias alias, string name) + { + if (resources != null) + { + int count = 0; + foreach (var resource in resources) + { + if (resource.Url.StartsWith("~")) + { + resource.Url = resource.Url.Replace("~", "/Themes/" + name + "/").Replace("//", "/"); + } + if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl)) + { + resource.Url = alias.BaseUrl + resource.Url; + } + + if (!HeadResources.Contains(resource.Url, StringComparison.OrdinalIgnoreCase)) + { + count++; + string id = "id=\"app-stylesheet-" + ResourceLevel.Page.ToString().ToLower() + "-" + DateTime.UtcNow.ToString("yyyyMMddHHmmssfff") + "-" + count.ToString("00") + "\" "; + HeadResources += "" + Environment.NewLine; + } + } + } + } } } diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 138e0a16..72b34405 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -99,7 +99,8 @@ namespace Oqtane.Repository { var site = GetSite(alias.SiteId); - _themeRepository.GetThemes(); + // load themes and module definitions + site.Themes = _themeRepository.GetThemes().ToList(); var moduleDefinitions = _moduleDefinitionRepository.GetModuleDefinitions(alias.SiteId); // site migrations diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index fbbd012a..8b98c530 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -108,6 +108,11 @@ Oqtane.Interop = { } } }, + includeLinks: function (links) { + for (let i = 0; i < links.length; i++) { + this.includeLink(links[i].id, links[i].rel, links[i].href, links[i].type, links[i].integrity, links[i].crossorigin, links[i].insertbefore); + } + }, includeScript: function (id, src, integrity, crossorigin, type, content, location) { var script; if (src !== "") { @@ -234,6 +239,15 @@ Oqtane.Interop = { } return getAbsoluteUrl(url); }, + 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) { From 8067b2e63474ead2c4abbb4556bb9e97ffee5ff2 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 21 Jun 2023 08:31:51 -0400 Subject: [PATCH 095/111] 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; } From 05b5d9da9b000cbc0b27be6402145966919e5ed7 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 21 Jun 2023 08:47:25 -0400 Subject: [PATCH 096/111] fix null handling in stylesheet logic --- Oqtane.Server/Pages/_Host.cshtml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index 29e1e105..be518155 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -172,7 +172,7 @@ namespace Oqtane.Pages page.ThemeType = site.DefaultThemeType; } var theme = site.Themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType)); - if (theme != null) + if (theme?.Resources != null) { resources.AddRange(theme.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); } @@ -180,7 +180,7 @@ namespace Oqtane.Pages if (type != null) { var obj = Activator.CreateInstance(type) as IThemeControl; - if (obj.Resources != null) + if (obj?.Resources != null) { resources.AddRange(obj.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); } From c3bccbade88fc7ad060b7df0771ea8432c606a78 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 21 Jun 2023 09:20:05 -0400 Subject: [PATCH 097/111] fix #2387 - improve container selection in Edit Page --- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 1eda0dfa..4d9c791c 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -367,11 +367,11 @@ // appearance _title = _page.Title; - _themetype = _page.ThemeType; - if (string.IsNullOrEmpty(_themetype)) + if (string.IsNullOrEmpty(_page.ThemeType)) { - _themetype = PageState.Site.DefaultThemeType; + _page.ThemeType = PageState.Site.DefaultThemeType; } + _themetype = _page.ThemeType; _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); _containertype = _page.DefaultContainerType; if (string.IsNullOrEmpty(_containertype)) @@ -480,10 +480,15 @@ try { _themetype = (string)e.Value; - _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); - _containertype = "-"; - ThemeSettings(); - StateHasChanged(); + var oldTheme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_page.ThemeType))); + var newTheme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_themetype))); + if (oldTheme.ThemeName != newTheme.ThemeName) + { + _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); + _containertype = _containers.First().TypeName; + ThemeSettings(); + StateHasChanged(); + } } catch (Exception ex) { From 86fbdced1b99b3721a0bdf92840d82d1af1c5454 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 21 Jun 2023 15:49:00 -0400 Subject: [PATCH 098/111] cleanup and ensure site level scripts work properly --- Oqtane.Client/Modules/ModuleBase.cs | 2 +- Oqtane.Client/Themes/ThemeBase.cs | 2 +- Oqtane.Client/UI/SiteRouter.razor | 31 ++++++++------- Oqtane.Client/UI/ThemeBuilder.razor | 62 +++++++---------------------- Oqtane.Maui/wwwroot/index.html | 4 +- Oqtane.Server/Pages/_Host.cshtml | 4 +- Oqtane.Server/Pages/_Host.cshtml.cs | 2 +- 7 files changed, 39 insertions(+), 68 deletions(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 0f56752d..8023da67 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -77,7 +77,7 @@ namespace Oqtane.Modules { if (PageState.Page.Resources != null) { - resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Namespace == type.Namespace).ToList(); + resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site && item.Namespace == type.Namespace).ToList(); } } else // modulecontrolbase diff --git a/Oqtane.Client/Themes/ThemeBase.cs b/Oqtane.Client/Themes/ThemeBase.cs index 8dcbe65c..8fcb1a30 100644 --- a/Oqtane.Client/Themes/ThemeBase.cs +++ b/Oqtane.Client/Themes/ThemeBase.cs @@ -40,7 +40,7 @@ namespace Oqtane.Themes { if (PageState.Page.Resources != null) { - resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Namespace == type.Namespace).ToList(); + resources = PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Script && item.Level != ResourceLevel.Site && item.Namespace == type.Namespace).ToList(); } } else // themecontrolbase, containerbase diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index df98874c..cd3a1764 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -513,22 +513,25 @@ { foreach (var resource in resources) { - if (resource.Url.StartsWith("~")) + if (resource.Level != ResourceLevel.Site) { - resource.Url = resource.Url.Replace("~", "/" + type + "/" + name + "/").Replace("//", "/"); - } - if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl)) - { - resource.Url = alias.BaseUrl + resource.Url; - } + if (resource.Url.StartsWith("~")) + { + resource.Url = resource.Url.Replace("~", "/" + type + "/" + name + "/").Replace("//", "/"); + } + if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl)) + { + resource.Url = alias.BaseUrl + resource.Url; + } - // ensure resource does not exist already - if (!pageresources.Exists(item => item.Url.ToLower() == resource.Url.ToLower())) - { - resource.Level = level; - resource.Namespace = name; - pageresources.Add(resource); - } + // ensure resource does not exist already + if (!pageresources.Exists(item => item.Url.ToLower() == resource.Url.ToLower())) + { + resource.Level = level; + resource.Namespace = name; + pageresources.Add(resource); + } + } } } return pageresources; diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index 1bf1ac23..0719a546 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -42,13 +42,6 @@ } headcontent += $"\n"; - // stylesheets - //foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) - //{ - // var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; - // headcontent += "" + "\n"; - //} - // head content AddHeadContent(headcontent, PageState.Site.HeadContent); if (!string.IsNullOrEmpty(PageState.Site.HeadContent)) @@ -103,49 +96,24 @@ } } - if (PageState.Page.Resources != null) + // style sheets + if (PageState.Page.Resources != null && PageState.Page.Resources.Exists(item => item.ResourceType == ResourceType.Stylesheet)) { - 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)) { - 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)) - { - var prefix = "app-stylesheet-" + resource.Level.ToString().ToLower(); - var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; - links.Add(new { id = prefix + "-" + batch + "-" + (links.Count + 1).ToString("00"), rel = "stylesheet", href = url, type = "text/css", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", insertbefore = prefix }); - } - if (links.Any()) - { - await interop.IncludeLinks(links.ToArray()); - } - await interop.RemoveElementsById("app-stylesheet-page-", "", "app-stylesheet-page-" + batch + "-00"); - await interop.RemoveElementsById("app-stylesheet-module-", "", "app-stylesheet-module-" + batch + "-00"); + var prefix = "app-stylesheet-" + resource.Level.ToString().ToLower(); + var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; + links.Add(new { id = prefix + "-" + batch + "-" + (links.Count + 1).ToString("00"), rel = "stylesheet", href = url, type = "text/css", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", insertbefore = prefix }); } - - //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 (links.Any()) + { + await interop.IncludeLinks(links.ToArray()); + } + await interop.RemoveElementsById("app-stylesheet-page-", "", "app-stylesheet-page-" + batch + "-00"); + await interop.RemoveElementsById("app-stylesheet-module-", "", "app-stylesheet-module-" + batch + "-00"); } } diff --git a/Oqtane.Maui/wwwroot/index.html b/Oqtane.Maui/wwwroot/index.html index a1469a6b..1dac89ee 100644 --- a/Oqtane.Maui/wwwroot/index.html +++ b/Oqtane.Maui/wwwroot/index.html @@ -9,8 +9,8 @@ - - + + diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 22bc6a90..4aee45f2 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -15,8 +15,8 @@ { } - - + + @Html.Raw(Model.HeadResources) diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index be518155..4b3d9929 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -475,8 +475,8 @@ namespace Oqtane.Pages { var url = (resource.Url.Contains("://")) ? resource.Url : alias.BaseUrl + resource.Url; return ""; } else From 2a5713ed677ae64b08c915160031d2cb443bc335 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 22 Jun 2023 11:32:03 -0400 Subject: [PATCH 099/111] restrict to a single theme per site --- Oqtane.Client/Modules/Admin/Pages/Add.razor | 315 +++++++------- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 394 ++++++++---------- Oqtane.Client/Modules/Admin/Site/Index.razor | 20 +- .../Services/Interfaces/IThemeService.cs | 18 +- Oqtane.Client/Services/ThemeService.cs | 18 +- 5 files changed, 357 insertions(+), 408 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 23253039..5832f45d 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -11,173 +11,169 @@
- @if (PageState.Site.Themes != null) - { +
+
+ +
+ +
+
+ @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + { +
+ +
+ +
+
+
+ +
+ + @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) + { + + } +
+
+ } + else + { +
+ +
+ +
+
+
+ +
+ +
+
+ } +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
- +
- +
- @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) - { -
- -
- -
-
-
- -
- - @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) +
+ +
+ - - @foreach (Page page in _children) - { - - } - + } -
-
- } - else - { -
- -
- -
-
-
- -
- -
-
- } -
- -
-
- +
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- + @foreach (var container in _containers) + { + + }
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
+
+
+
+
+ +
+
-
-
-
-
- -
- -
-
-
- -
- -
+
+ +
+
-
- } +
+
@@ -249,8 +245,8 @@ // if admin or user has edit access to parent page if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin) || (_parent != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, _parent.PermissionList))) { - _themes = ThemeService.GetThemeControls(PageState.Site.Themes); _themetype = PageState.Site.DefaultThemeType; + _themes = ThemeService.GetThemeControls(PageState.Site.Themes, _themetype); _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); _containertype = PageState.Site.DefaultContainerType; _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); @@ -305,23 +301,6 @@ } } - private async void ThemeChanged(ChangeEventArgs e) - { - try - { - _themetype = (string)e.Value; - _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); - _containertype = "-"; - ThemeSettings(); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage(Localizer["Error.Pane.Load"], MessageType.Error); - } - } - private void ThemeSettings() { _themeSettingsType = null; @@ -351,7 +330,7 @@ Page page = null; try { - if (!string.IsNullOrEmpty(_themetype) && _containertype != "-") + if (!string.IsNullOrEmpty(_themetype) && !string.IsNullOrEmpty(_containertype)) { page = new Page(); page.SiteId = PageState.Page.SiteId; @@ -430,12 +409,12 @@ // appearance page.Title = _title; page.Icon = (_icon == null ? string.Empty : _icon); - page.ThemeType = (_themetype != "-") ? _themetype : string.Empty; + page.ThemeType = _themetype; if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) { page.ThemeType = string.Empty; } - page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty; + page.DefaultContainerType = _containertype; if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) { page.DefaultContainerType = string.Empty; diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 4d9c791c..7ff54a15 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -15,212 +15,202 @@ { - @if (PageState.Site.Themes != null) - { +
+
+ +
+ +
+
+ @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + { +
+ +
+ +
+
+
+ +
+ + @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) + { + + } +
+
+ } + else + { +
+ +
+ +
+
+
+ +
+ +
+
+ } +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
- +
- +
- @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) - { -
- -
- -
-
-
- -
- - @if (_children != null && _children.Count > 0 && (_insert == "<" || _insert == ">")) +
+ +
+ - - @foreach (Page page in _children) - { - - } - + } -
-
- } - else - { -
- -
- -
-
-
- -
- -
-
- } -
- -
-
- +
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- + @foreach (var container in _containers) + { + + }
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
+
+
+
+
+ +
+
-
-
-
-
- -
- -
-
-
- -
- -
+
+ +
+
-
-
-
- - } +
+
+
+
+
- @if (_permissions != null) - { -
-
- -
+
+
+
- } +
- @if (_pageModules != null) - { - -
-   -   - @Localizer["ModuleTitle"] - @Localizer["ModuleDefinition"] -
- - - - @context.Title - @context.ModuleDefinition?.Name - -
- } + +
+   +   + @Localizer["ModuleTitle"] + @Localizer["ModuleDefinition"] +
+ + + + @context.Title + @context.ModuleDefinition?.Name + +
@if (_themeSettingsType != null) { @@ -245,7 +235,7 @@
- @foreach (var theme in _themes) { @@ -257,7 +247,6 @@
- @foreach (var theme in _themes) { @@ -90,7 +89,6 @@
- @foreach (var container in _containers) { @@ -356,9 +353,9 @@ private FileManager _logofilemanager; private int _faviconfileid = -1; private FileManager _faviconfilemanager; - private string _themetype = "-"; - private string _containertype = "-"; - private string _admincontainertype = "-"; + private string _themetype = ""; + private string _containertype = ""; + private string _admincontainertype = ""; private string _headcontent = string.Empty; private string _bodycontent = string.Empty; private string _smtphost = string.Empty; @@ -499,15 +496,8 @@ try { _themetype = (string)e.Value; - if (_themetype != "-") - { - _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); - } - else - { - _containers = new List(); - } - _containertype = "-"; + _containers = ThemeService.GetContainerControls(PageState.Site.Themes, _themetype); + _containertype = _containers.First().TypeName; _admincontainertype = Constants.DefaultAdminContainer; StateHasChanged(); } diff --git a/Oqtane.Client/Services/Interfaces/IThemeService.cs b/Oqtane.Client/Services/Interfaces/IThemeService.cs index 8c5ac457..aafff7b2 100644 --- a/Oqtane.Client/Services/Interfaces/IThemeService.cs +++ b/Oqtane.Client/Services/Interfaces/IThemeService.cs @@ -32,20 +32,19 @@ namespace Oqtane.Services List GetThemeControls(List themes); /// - /// Returns a list of layouts () from the given themes with a matching theme name + /// Returns a list of s from the given themes with a matching theme type /// /// - /// /// - List GetLayoutControls(List themes, string themeName); + List GetThemeControls(List themes, string themeType); /// - /// Returns a list of containers () from the given themes with a matching theme name + /// Returns a list of containers () from the given themes with a matching theme type /// /// /// /// - List GetContainerControls(List themes, string themeName); + List GetContainerControls(List themes, string themeType); /// /// Updates a existing theem @@ -73,5 +72,14 @@ namespace Oqtane.Services /// /// Task> GetThemeTemplatesAsync(); + + + /// + /// Returns a list of layouts () from the given themes with a matching theme name + /// + /// + /// + /// + List GetLayoutControls(List themes, string themeName); } } diff --git a/Oqtane.Client/Services/ThemeService.cs b/Oqtane.Client/Services/ThemeService.cs index 6bf99a34..b86b63e1 100644 --- a/Oqtane.Client/Services/ThemeService.cs +++ b/Oqtane.Client/Services/ThemeService.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Oqtane.Documentation; using Oqtane.Models; using Oqtane.Shared; +using Oqtane.UI; namespace Oqtane.Services { @@ -30,16 +31,15 @@ namespace Oqtane.Services return themes.SelectMany(item => item.Themes).OrderBy(item => item.Name).ToList(); } - //[Obsolete("This method is deprecated.", false)] - public List GetLayoutControls(List themes, string themeName) + public List GetThemeControls(List themes, string themeType) { - return null; + return themes.First(item => item.Themes.Any(item => item.TypeName == themeType)).Themes.OrderBy(item => item.Name).ToList(); } - public List GetContainerControls(List themes, string themeName) + + public List GetContainerControls(List themes, string themeType) { - return themes.Where(item => Utilities.GetTypeName(themeName).StartsWith(Utilities.GetTypeName(item.ThemeName))) - .SelectMany(item => item.Containers).OrderBy(item => item.Name).ToList(); + return themes.First(item => item.Themes.Any(item => item.TypeName == themeType)).Containers.OrderBy(item => item.Name).ToList(); } public async Task UpdateThemeAsync(Theme theme) @@ -62,5 +62,11 @@ namespace Oqtane.Services List