From 7e4f0923d74f3777bbd5f49b6ee3856fae03bc2d Mon Sep 17 00:00:00 2001 From: Cody Date: Thu, 13 Apr 2023 07:42:04 -0700 Subject: [PATCH 01/31] Add support for new language translation values. --- Oqtane.Client/Resources/SharedResources.resx | 53 +++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 4ec3d693..d6492824 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -342,4 +342,55 @@ Please note that the third party extensions displayed above have been registered in the <a href="https://www.oqtane.net" target="_new">Oqtane Marketplace</a> which enables them to be seamlessly downloaded and installed into the framework. - \ No newline at end of file + + Home + + + Close + + + OK + + + Apply + + + Select + + + Next + + + Previous + + + Submit + + + Refresh + + + Back + + + Return + + + New + + + View + + + Confirm + + + Error + + + Success + + + Warning + + From b20157450bbb468ec7640f2628d353147f6c7727 Mon Sep 17 00:00:00 2001 From: Cody Date: Fri, 14 Apr 2023 18:08:39 -0700 Subject: [PATCH 02/31] Add caching and content-type --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 106 ++++++++++++++------------ 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 16fb3299..7a7684c1 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -6,6 +6,7 @@ using System.Xml; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Oqtane.Enums; using Oqtane.Infrastructure; @@ -28,8 +29,9 @@ namespace Oqtane.Pages private readonly IUserPermissions _userPermissions; private readonly ILogManager _logger; private readonly Alias _alias; + private readonly IMemoryCache _memoryCache; - public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) + public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager, IMemoryCache memoryCache) { _serviceProvider = serviceProvider; _pages = pages; @@ -39,77 +41,83 @@ namespace Oqtane.Pages _userPermissions = userPermissions; _logger = logger; _alias = tenantManager.GetAlias(); + _memoryCache = memoryCache; } public IActionResult OnGet() { - var sitemap = new List(); - - // build site map - var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); - var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) + if (!_memoryCache.TryGetValue("Sitemap", out string sitemapXml)) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + var sitemap = new List(); - foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + // build site map + var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); + var pageModules = _pageModules.GetPageModules(_alias.SiteId); + foreach (var page in _pages.GetPages(_alias.SiteId)) + { + if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + + foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) { - var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); - if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") + if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) { - Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("ISitemap") != null) + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") { - try + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("ISitemap") != null) { - pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); - foreach (var url in urls) + try { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); + foreach (var url in urls) + { + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + } + } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } - } - catch (Exception ex) - { - _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } } } } } } - } - // write XML - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = (" "); - settings.CloseOutput = true; - settings.OmitXmlDeclaration = true; - settings.WriteEndDocumentOnClose = true; + // write XML + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = (" "); + settings.CloseOutput = true; + settings.OmitXmlDeclaration = true; + settings.WriteEndDocumentOnClose = true; - StringBuilder builder = new StringBuilder(); - using (XmlWriter writer = XmlWriter.Create(builder, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - - foreach (var url in sitemap) + StringBuilder builder = new StringBuilder(); + using (XmlWriter writer = XmlWriter.Create(builder, settings)) { - writer.WriteStartElement("url"); - writer.WriteElementString("loc", url.Url); - writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); - writer.WriteEndElement(); - } - writer.Close(); - } + writer.WriteStartDocument(); + writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - return Content(builder.ToString()); + foreach (var url in sitemap) + { + writer.WriteStartElement("url"); + writer.WriteElementString("loc", url.Url); + writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); + writer.WriteEndElement(); + } + writer.Close(); + } + // Cache the sitemap XML + sitemapXml = builder.ToString(); + _memoryCache.Set("Sitemap", sitemapXml, TimeSpan.FromHours(1)); + } + return Content(sitemapXml, "application/xml"); } } } From c93d2576af2b4cb5a2c0752097fd3de0c2602306 Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:00:33 -0700 Subject: [PATCH 03/31] Updates content-type to "application/xml" removes sitemap cache from previous commits. --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 115 ++++++++++++-------------- 1 file changed, 54 insertions(+), 61 deletions(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 7a7684c1..64e7faa5 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -25,98 +25,91 @@ namespace Oqtane.Pages private readonly IPageRepository _pages; private readonly IPageModuleRepository _pageModules; private readonly IModuleDefinitionRepository _moduleDefinitions; - private readonly ISettingRepository _settings; private readonly IUserPermissions _userPermissions; private readonly ILogManager _logger; private readonly Alias _alias; - private readonly IMemoryCache _memoryCache; + private string sitemapXml; - public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager, IMemoryCache memoryCache) + public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) { _serviceProvider = serviceProvider; _pages = pages; _pageModules = pageModules; _moduleDefinitions = moduleDefinitions; - _settings = settings; _userPermissions = userPermissions; _logger = logger; _alias = tenantManager.GetAlias(); - _memoryCache = memoryCache; } - public IActionResult OnGet() + public IActionResult OnGetAsync() { - if (!_memoryCache.TryGetValue("Sitemap", out string sitemapXml)) + var sitemap = new List(); + + // build site map + var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); + var pageModules = _pageModules.GetPageModules(_alias.SiteId); + foreach (var page in _pages.GetPages(_alias.SiteId)) { - var sitemap = new List(); - - // build site map - var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); - var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) + if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); - foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + { + if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") { - var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); - if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("ISitemap") != null) { - Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("ISitemap") != null) + try { - try + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); + foreach (var url in urls) { - pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); - foreach (var url in urls) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); - } - } - catch (Exception ex) - { - _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); } } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); + } } } } } } - - // write XML - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = (" "); - settings.CloseOutput = true; - settings.OmitXmlDeclaration = true; - settings.WriteEndDocumentOnClose = true; - - StringBuilder builder = new StringBuilder(); - using (XmlWriter writer = XmlWriter.Create(builder, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - - foreach (var url in sitemap) - { - writer.WriteStartElement("url"); - writer.WriteElementString("loc", url.Url); - writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); - writer.WriteEndElement(); - } - writer.Close(); - } - // Cache the sitemap XML - sitemapXml = builder.ToString(); - _memoryCache.Set("Sitemap", sitemapXml, TimeSpan.FromHours(1)); } + + // write XML + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = (" "); + settings.CloseOutput = true; + settings.OmitXmlDeclaration = true; + settings.WriteEndDocumentOnClose = true; + + StringBuilder builder = new StringBuilder(); + using (XmlWriter writer = XmlWriter.Create(builder, settings)) + { + writer.WriteStartDocument(); + writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in sitemap) + { + writer.WriteStartElement("url"); + writer.WriteElementString("loc", url.Url); + writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); + writer.WriteEndElement(); + } + writer.Close(); + } + // Cache the sitemap XML + sitemapXml = builder.ToString(); + return Content(sitemapXml, "application/xml"); } } From ba27e70fe34793e6cd8f4ef2137663191fedb97b Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:05:43 -0700 Subject: [PATCH 04/31] Removed unnecessary cache comments. --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 64e7faa5..5cd06a2d 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -107,7 +107,6 @@ namespace Oqtane.Pages } writer.Close(); } - // Cache the sitemap XML sitemapXml = builder.ToString(); return Content(sitemapXml, "application/xml"); From 948c186cb58d48f1ed5490e563f8e569c67f7e7f Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:09:00 -0700 Subject: [PATCH 05/31] fixed formatting --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 93 ++++++++++++++------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 5cd06a2d..dc8f0935 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -43,71 +43,72 @@ namespace Oqtane.Pages public IActionResult OnGetAsync() { - var sitemap = new List(); + var sitemap = new List(); - // build site map - var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); - var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) - { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) + // build site map + var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); + var pageModules = _pageModules.GetPageModules(_alias.SiteId); + foreach (var page in _pages.GetPages(_alias.SiteId)) { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); - - foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + + foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) { - var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); - if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") + if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) { - Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("ISitemap") != null) + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") { - try + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("ISitemap") != null) { - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); - foreach (var url in urls) + try { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); + foreach (var url in urls) + { + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + } + } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } - } - catch (Exception ex) - { - _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } } } } } } - } - // write XML - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = (" "); - settings.CloseOutput = true; - settings.OmitXmlDeclaration = true; - settings.WriteEndDocumentOnClose = true; + // write XML + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = (" "); + settings.CloseOutput = true; + settings.OmitXmlDeclaration = true; + settings.WriteEndDocumentOnClose = true; - StringBuilder builder = new StringBuilder(); - using (XmlWriter writer = XmlWriter.Create(builder, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - - foreach (var url in sitemap) + StringBuilder builder = new StringBuilder(); + using (XmlWriter writer = XmlWriter.Create(builder, settings)) { - writer.WriteStartElement("url"); - writer.WriteElementString("loc", url.Url); - writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); - writer.WriteEndElement(); + writer.WriteStartDocument(); + writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in sitemap) + { + writer.WriteStartElement("url"); + writer.WriteElementString("loc", url.Url); + writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); + writer.WriteEndElement(); + } + writer.Close(); } - writer.Close(); - } - sitemapXml = builder.ToString(); + // Cache the sitemap XML + sitemapXml = builder.ToString(); return Content(sitemapXml, "application/xml"); } From d25debcea3ab702087d54fa66a860f7a73ab994f Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:11:16 -0700 Subject: [PATCH 06/31] cleanup using --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index dc8f0935..5fa12c72 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -6,7 +6,6 @@ using System.Xml; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; -using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Oqtane.Enums; using Oqtane.Infrastructure; From abf4ff71d72f285c3aa244aea1ab1209deedf595 Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:13:31 -0700 Subject: [PATCH 07/31] re-add missing settings --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 5fa12c72..dd72c071 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -24,6 +24,7 @@ namespace Oqtane.Pages private readonly IPageRepository _pages; private readonly IPageModuleRepository _pageModules; private readonly IModuleDefinitionRepository _moduleDefinitions; + private readonly ISettingRepository _settings; private readonly IUserPermissions _userPermissions; private readonly ILogManager _logger; private readonly Alias _alias; From 376531195ebe206e6a6ea516ba238b9b217370e1 Mon Sep 17 00:00:00 2001 From: Petar Dimitrov Date: Wed, 19 Apr 2023 19:17:33 +0200 Subject: [PATCH 08/31] Add environment settings needed for Azure deployment --- Oqtane.Server/Startup.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index bc8a0aac..9e008722 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -34,7 +34,8 @@ namespace Oqtane var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", false, true) - .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true); + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true) + .AddEnvironmentVariables(); Configuration = builder.Build(); _installedCultures = localizationManager.GetInstalledCultures(); From 536c0441394041728460f32bfa4c2f9193fe6044 Mon Sep 17 00:00:00 2001 From: Petar Dimitrov Date: Wed, 19 Apr 2023 19:18:19 +0200 Subject: [PATCH 09/31] Add environment settings needed for Azure deployment --- Oqtane.Server/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Oqtane.Server/Program.cs b/Oqtane.Server/Program.cs index 49a5542a..2d762efd 100644 --- a/Oqtane.Server/Program.cs +++ b/Oqtane.Server/Program.cs @@ -34,6 +34,7 @@ namespace Oqtane.Server WebHost.CreateDefaultBuilder(args) .UseConfiguration(new ConfigurationBuilder() .AddCommandLine(args) + .AddEnvironmentVariables() .Build()) .UseStartup() .ConfigureLocalizationSettings() From d81fbe4585211b53b265dfc7ec7d579bbc6b7a1b Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 19 Apr 2023 10:18:27 -0700 Subject: [PATCH 10/31] Fixed missing logic from PR --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 101 +++++++++++++------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index dd72c071..d4d6d636 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -30,87 +30,90 @@ namespace Oqtane.Pages private readonly Alias _alias; private string sitemapXml; - public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) + public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) { _serviceProvider = serviceProvider; _pages = pages; _pageModules = pageModules; _moduleDefinitions = moduleDefinitions; + _settings = settings; _userPermissions = userPermissions; _logger = logger; _alias = tenantManager.GetAlias(); } - public IActionResult OnGetAsync() + public IActionResult OnGet() { - var sitemap = new List(); + var sitemap = new List(); - // build site map - var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); - var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) + // build site map + var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); + var pageModules = _pageModules.GetPageModules(_alias.SiteId); + foreach (var page in _pages.GetPages(_alias.SiteId)) + { + if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); - foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + { + if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") { - var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); - if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("ISitemap") != null) { - Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("ISitemap") != null) + try { - try + pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); + foreach (var url in urls) { - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); - foreach (var url in urls) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); - } - } - catch (Exception ex) - { - _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); } } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); + } } } } } } + } - // write XML - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = (" "); - settings.CloseOutput = true; - settings.OmitXmlDeclaration = true; - settings.WriteEndDocumentOnClose = true; + // write XML + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = (" "); + settings.CloseOutput = true; + settings.OmitXmlDeclaration = true; + settings.WriteEndDocumentOnClose = true; - StringBuilder builder = new StringBuilder(); - using (XmlWriter writer = XmlWriter.Create(builder, settings)) + StringBuilder builder = new StringBuilder(); + using (XmlWriter writer = XmlWriter.Create(builder, settings)) + { + writer.WriteStartDocument(); + writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in sitemap) { - writer.WriteStartDocument(); - writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - - foreach (var url in sitemap) - { - writer.WriteStartElement("url"); - writer.WriteElementString("loc", url.Url); - writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); - writer.WriteEndElement(); - } - writer.Close(); + writer.WriteStartElement("url"); + writer.WriteElementString("loc", url.Url); + writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); + writer.WriteEndElement(); } - // Cache the sitemap XML - sitemapXml = builder.ToString(); + writer.Close(); + } + + sitemapXml = builder.ToString(); return Content(sitemapXml, "application/xml"); } } } + From fa9b4b6112cc6261e896051e36c54b2ab9aa2b14 Mon Sep 17 00:00:00 2001 From: Leigh Pointer Date: Wed, 26 Apr 2023 09:43:11 +0200 Subject: [PATCH 11/31] Fix for MenuHorizontal #2757 Add the css class to MenuHorizontal to handle scrolling when hamburger Menu is in use. --- Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor b/Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor index ad063ae6..fa6dd129 100644 --- a/Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor +++ b/Oqtane.Client/Themes/Controls/Theme/MenuHorizontal.razor @@ -10,7 +10,7 @@ - @SharedLocalizer["Cancel"] @@ -125,18 +124,6 @@ else } } - private async Task InstallTranslations() - { - try - { - AddModuleMessage(string.Format(Localizer["Success.Language.Install"], NavigateUrl("admin/system")), MessageType.Success); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Installing Translations"); - } - } - private async Task SetCultureAsync(string culture) { if (culture != CultureInfo.CurrentUICulture.Name) @@ -148,4 +135,9 @@ else NavigationManager.NavigateTo(NavigationManager.Uri, true); } } + + private void OnUpload() + { + AddModuleMessage(string.Format(Localizer["Success.Language.Download"], NavigateUrl("admin/system")), MessageType.Success); + } } diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 0ac63c11..548a45f5 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -65,13 +65,15 @@ } } +
+
- +
@@ -112,137 +114,139 @@ } @SharedLocalizer["Cancel"] -
-
- @code { - private List _packages; - private string _price = "free"; - private string _search = ""; - private string _productname = ""; - private string _packageid = ""; - private string _packagelicense = ""; - private string _packageversion = ""; + private List _packages; + private string _price = "free"; + private string _search = ""; + private string _productname = ""; + private string _packageid = ""; + private string _packagelicense = ""; + private string _packageversion = ""; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; - protected override async Task OnInitializedAsync() - { - try - { - await LoadModuleDefinitions(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message); - AddModuleMessage(Localizer["Error.Package.Load"], MessageType.Error); - } - } + protected override async Task OnInitializedAsync() + { + try + { + await LoadModuleDefinitions(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Package.Load"], MessageType.Error); + } + } - private async Task LoadModuleDefinitions() - { - var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); - _packages = await PackageService.GetPackagesAsync("module", _search, _price, ""); + private async Task LoadModuleDefinitions() + { + var moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + _packages = await PackageService.GetPackagesAsync("module", _search, _price, ""); - if (_packages != null) - { - foreach (Package package in _packages.ToArray()) - { - if (moduledefinitions.Exists(item => item.PackageName == package.PackageId)) - { - _packages.Remove(package); - } - } - } - } + if (_packages != null) + { + foreach (Package package in _packages.ToArray()) + { + if (moduledefinitions.Exists(item => item.PackageName == package.PackageId)) + { + _packages.Remove(package); + } + } + } + } - private async void PriceChanged(ChangeEventArgs e) - { - try - { - _price = (string)e.Value; - _search = ""; - await LoadModuleDefinitions(); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error On PriceChanged"); - } - } + private async void PriceChanged(ChangeEventArgs e) + { + try + { + _price = (string)e.Value; + _search = ""; + await LoadModuleDefinitions(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On PriceChanged"); + } + } - private async Task Search() - { - try - { - await LoadModuleDefinitions(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error On Search"); - } - } + private async Task Search() + { + try + { + await LoadModuleDefinitions(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Search"); + } + } - private async Task Reset() - { - try - { - _search = ""; - await LoadModuleDefinitions(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error On Reset"); - } - } + private async Task Reset() + { + try + { + _search = ""; + await LoadModuleDefinitions(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On Reset"); + } + } - private void HideModal() - { - _productname = ""; - _packagelicense = ""; - StateHasChanged(); - } + private void HideModal() + { + _productname = ""; + _packagelicense = ""; + StateHasChanged(); + } - private async Task GetPackage(string packageid, string version) - { - try - { - var package = await PackageService.GetPackageAsync(packageid, version); - if (package != null) - { - _productname = package.Name; - _packageid = package.PackageId; - if (!string.IsNullOrEmpty(package.License)) - { - _packagelicense = package.License.Replace("\n", "
"); - } - _packageversion = package.Version; - } - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version); - AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); - } - } + private async Task GetPackage(string packageid, string version) + { + try + { + var package = await PackageService.GetPackageAsync(packageid, version); + if (package != null) + { + _productname = package.Name; + _packageid = package.PackageId; + if (!string.IsNullOrEmpty(package.License)) + { + _packagelicense = package.License.Replace("\n", "
"); + } + _packageversion = package.Version; + } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version); + AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); + } + } - private async Task DownloadPackage() - { - try - { - await PackageService.DownloadPackageAsync(_packageid, _packageversion, Constants.PackagesFolder); - await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _packageversion); - AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); - _productname = ""; - _packagelicense = ""; - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _packageversion); - AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); - } - } + private async Task DownloadPackage() + { + try + { + await PackageService.DownloadPackageAsync(_packageid, _packageversion, Constants.PackagesFolder); + await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _packageversion); + AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); + _productname = ""; + _packagelicense = ""; + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _packageversion); + AddModuleMessage(Localizer["Error.Module.Download"], MessageType.Error); + } + } + + private void OnUpload() + { + AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); + } } diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index dca90274..76c95d83 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -65,13 +65,15 @@ } } +
+
- +
@@ -112,9 +114,6 @@ } @SharedLocalizer["Cancel"] -
-
- @code { private List _packages; @@ -245,4 +244,9 @@ AddModuleMessage(Localizer["Error.Theme.Download"], MessageType.Error); } } + + private void OnUpload() + { + AddModuleMessage(string.Format(Localizer["Success.Theme.Download"], NavigateUrl("admin/system")), MessageType.Success); + } } diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index fe0fa6cc..cd5ad6e3 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -87,299 +87,306 @@ } @code { - private bool _initialized = false; - private List _folders; - private List _files = new List(); - private string _fileinputid = string.Empty; - private string _progressinfoid = string.Empty; - private string _progressbarid = string.Empty; - private string _filter = "*"; - private bool _haseditpermission = false; - private string _image = string.Empty; - private File _file = null; - private string _guid; - private string _message = string.Empty; - private MessageType _messagetype; + private bool _initialized = false; + private List _folders; + private List _files = new List(); + private string _fileinputid = string.Empty; + private string _progressinfoid = string.Empty; + private string _progressbarid = string.Empty; + private string _filter = "*"; + private bool _haseditpermission = false; + private string _image = string.Empty; + private File _file = null; + private string _guid; + private string _message = string.Empty; + private MessageType _messagetype; - [Parameter] - public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility + [Parameter] + public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility - [Parameter] - public int FolderId { get; set; } = -1; // optional - for setting a specific default folder by folderid + [Parameter] + public int FolderId { get; set; } = -1; // optional - for setting a specific default folder by folderid - [Parameter] - public string Folder { get; set; } = ""; // optional - for setting a specific default folder by folder path + [Parameter] + public string Folder { get; set; } = ""; // optional - for setting a specific default folder by folder path - [Parameter] - public int FileId { get; set; } = -1; // optional - for selecting a specific file by default + [Parameter] + public int FileId { get; set; } = -1; // optional - for selecting a specific file by default - [Parameter] - public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" + [Parameter] + public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" - [Parameter] - public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true + [Parameter] + public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true - [Parameter] - public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true + [Parameter] + public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true - [Parameter] - public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true + [Parameter] + public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true - [Parameter] - public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true + [Parameter] + public bool ShowImage { get; set; } = true; // optional - for indicating whether an image thumbnail should be displayed - default is true - [Parameter] - public bool ShowSuccess { get; set; } = false; // optional - for indicating whether a success message should be displayed upon successful upload - default is false + [Parameter] + public bool ShowSuccess { get; set; } = false; // optional - for indicating whether a success message should be displayed upon successful upload - default is false - [Parameter] - public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false + [Parameter] + public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false - [Parameter] - public EventCallback OnUpload { get; set; } // optional - executes a method in the calling component when a file is uploaded + [Parameter] + public EventCallback OnUpload { get; set; } // optional - executes a method in the calling component when a file is uploaded - [Parameter] - public EventCallback OnSelect { get; set; } // optional - executes a method in the calling component when a file is selected + [Parameter] + public EventCallback OnSelect { get; set; } // optional - executes a method in the calling component when a file is selected - [Parameter] - public EventCallback OnDelete { get; set; } // optional - executes a method in the calling component when a file is deleted + [Parameter] + public EventCallback OnDelete { get; set; } // optional - executes a method in the calling component when a file is deleted - protected override async Task OnInitializedAsync() - { - // packages folder is a framework folder for uploading installable nuget packages - if (Folder == Constants.PackagesFolder) - { - ShowFiles = false; - ShowFolders = false; - Filter = "nupkg"; - ShowSuccess = true; - } + protected override async Task OnInitializedAsync() + { + // packages folder is a framework folder for uploading installable nuget packages + if (Folder == Constants.PackagesFolder) + { + ShowFiles = false; + ShowFolders = false; + Filter = "nupkg"; + ShowSuccess = true; + } - if (!ShowFiles) - { - ShowImage = false; - } + if (!ShowFiles) + { + ShowImage = false; + } - _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); + _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); - if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder) - { - Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); - if (folder != null) - { - FolderId = folder.FolderId; - } - else - { - FolderId = -1; - _message = "Folder Path " + Folder + "Does Not Exist"; - _messagetype = MessageType.Error; - } - } + if (!string.IsNullOrEmpty(Folder) && Folder != Constants.PackagesFolder) + { + Folder folder = await FolderService.GetFolderAsync(ModuleState.SiteId, Folder); + if (folder != null) + { + FolderId = folder.FolderId; + } + else + { + FolderId = -1; + _message = "Folder Path " + Folder + "Does Not Exist"; + _messagetype = MessageType.Error; + } + } - if (FileId != -1) - { - File file = await FileService.GetFileAsync(FileId); - if (file != null) - { - FolderId = file.FolderId; - await OnSelect.InvokeAsync(FileId); - } - else - { - FileId = -1; // file does not exist - _message = "FileId " + FileId.ToString() + "Does Not Exist"; - _messagetype = MessageType.Error; - } - } + if (FileId != -1) + { + File file = await FileService.GetFileAsync(FileId); + if (file != null) + { + FolderId = file.FolderId; + await OnSelect.InvokeAsync(FileId); + } + else + { + FileId = -1; // file does not exist + _message = "FileId " + FileId.ToString() + "Does Not Exist"; + _messagetype = MessageType.Error; + } + } - await SetImage(); + await SetImage(); - if (!string.IsNullOrEmpty(Filter)) - { - _filter = "." + Filter.Replace(",", ",."); - } + if (!string.IsNullOrEmpty(Filter)) + { + _filter = "." + Filter.Replace(",", ",."); + } - await GetFiles(); + await GetFiles(); - // create unique id for component - _guid = Guid.NewGuid().ToString("N"); - _fileinputid = "FileInput_" + _guid; - _progressinfoid = "ProgressInfo_" + _guid; - _progressbarid = "ProgressBar_" + _guid; + // create unique id for component + _guid = Guid.NewGuid().ToString("N"); + _fileinputid = "FileInput_" + _guid; + _progressinfoid = "ProgressInfo_" + _guid; + _progressbarid = "ProgressBar_" + _guid; - _initialized = true; - } + _initialized = true; + } - private async Task GetFiles() - { - _haseditpermission = false; - if (Folder == Constants.PackagesFolder) - { - _haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); - _files = new List(); - } - else - { - Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId); - if (folder != null) - { - _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList); - _files = await FileService.GetFilesAsync(FolderId); - } - else - { - _haseditpermission = false; - _files = new List(); - } - } - if (_filter != "*") - { - List filtered = new List(); - foreach (File file in _files) - { - if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1) - { - filtered.Add(file); - } - } - _files = filtered; - } - } + private async Task GetFiles() + { + _haseditpermission = false; + if (Folder == Constants.PackagesFolder) + { + _haseditpermission = UserSecurity.IsAuthorized(PageState.User, RoleNames.Host); + _files = new List(); + } + else + { + Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId); + if (folder != null) + { + _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.PermissionList); + _files = await FileService.GetFilesAsync(FolderId); + } + else + { + _haseditpermission = false; + _files = new List(); + } + if (_filter != "*") + { + List filtered = new List(); + foreach (File file in _files) + { + if (_filter.ToUpper().IndexOf("." + file.Extension.ToUpper()) != -1) + { + filtered.Add(file); + } + } + _files = filtered; + } + } + } - private async Task FolderChanged(ChangeEventArgs e) - { - _message = string.Empty; - try - { - FolderId = int.Parse((string)e.Value); - await GetFiles(); - FileId = -1; - _file = null; - _image = string.Empty; - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - _message = Localizer["Error.File.Load"]; - _messagetype = MessageType.Error; - } - } + private async Task FolderChanged(ChangeEventArgs e) + { + _message = string.Empty; + try + { + FolderId = int.Parse((string)e.Value); + await GetFiles(); + FileId = -1; + _file = null; + _image = string.Empty; + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); + _message = Localizer["Error.File.Load"]; + _messagetype = MessageType.Error; + } + } - private async Task FileChanged(ChangeEventArgs e) - { - _message = string.Empty; - FileId = int.Parse((string)e.Value); - if (FileId != -1) - { - await OnSelect.InvokeAsync(FileId); - } + private async Task FileChanged(ChangeEventArgs e) + { + _message = string.Empty; + FileId = int.Parse((string)e.Value); + if (FileId != -1) + { + await OnSelect.InvokeAsync(FileId); + } - await SetImage(); - StateHasChanged(); - } + await SetImage(); + StateHasChanged(); + } - private async Task SetImage() - { - _image = string.Empty; - _file = null; - if (FileId != -1) - { - _file = await FileService.GetFileAsync(FileId); - if (_file != null && ShowImage && _file.ImageHeight != 0 && _file.ImageWidth != 0) - { - var maxwidth = 200; - var maxheight = 200; + private async Task SetImage() + { + _image = string.Empty; + _file = null; + if (FileId != -1) + { + _file = await FileService.GetFileAsync(FileId); + if (_file != null && ShowImage && _file.ImageHeight != 0 && _file.ImageWidth != 0) + { + var maxwidth = 200; + var maxheight = 200; - var ratioX = (double)maxwidth / (double)_file.ImageWidth; - var ratioY = (double)maxheight / (double)_file.ImageHeight; - var ratio = ratioX < ratioY ? ratioX : ratioY; + var ratioX = (double)maxwidth / (double)_file.ImageWidth; + var ratioY = (double)maxheight / (double)_file.ImageHeight; + var ratio = ratioX < ratioY ? ratioX : ratioY; - _image = "\"""; - } - } - } + _image = "\"""; + } + } + } - private async Task UploadFiles() - { - _message = string.Empty; - var interop = new Interop(JSRuntime); - var uploads = await interop.GetFiles(_fileinputid); - if (uploads.Length > 0) - { - string restricted = ""; - foreach (var upload in uploads) - { - var extension = (upload.LastIndexOf(".") != -1) ? upload.Substring(upload.LastIndexOf(".") + 1) : ""; - if (!Constants.UploadableFiles.Split(',').Contains(extension.ToLower())) - { - restricted += (restricted == "" ? "" : ",") + extension; - } - } - if (restricted == "") - { - try - { - // upload the files - var posturl = Utilities.TenantUrl(PageState.Alias, "/api/file/upload"); - var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString(); - await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken); + private async Task UploadFiles() + { + _message = string.Empty; + var interop = new Interop(JSRuntime); + var uploads = await interop.GetFiles(_fileinputid); + if (uploads.Length > 0) + { + string restricted = ""; + foreach (var upload in uploads) + { + var extension = (upload.LastIndexOf(".") != -1) ? upload.Substring(upload.LastIndexOf(".") + 1) : ""; + if (!Constants.UploadableFiles.Split(',').Contains(extension.ToLower())) + { + restricted += (restricted == "" ? "" : ",") + extension; + } + } + if (restricted == "") + { + try + { + // upload the files + var posturl = Utilities.TenantUrl(PageState.Alias, "/api/file/upload"); + var folder = (Folder == Constants.PackagesFolder) ? Folder : FolderId.ToString(); + await interop.UploadFiles(posturl, folder, _guid, SiteState.AntiForgeryToken); - // uploading is asynchronous so we need to wait for the uploads to complete - // note that this will only wait a maximum of 15 seconds which may not be long enough for very large file uploads - bool success = false; - int attempts = 0; - while (attempts < 5 && !success) - { - attempts += 1; - Thread.Sleep(1000 * attempts); // progressive retry + // uploading is asynchronous so we need to wait for the uploads to complete + // note that this will only wait a maximum of 15 seconds which may not be long enough for very large file uploads + bool success = false; + int attempts = 0; + while (attempts < 5 && !success) + { + attempts += 1; + Thread.Sleep(1000 * attempts); // progressive retry - success = true; - List files = await FileService.GetFilesAsync(folder); - if (files.Count > 0) - { - foreach (string upload in uploads) - { - if (!files.Exists(item => item.Name == upload)) - { - success = false; - } - } - } - } + success = true; + List files = await FileService.GetFilesAsync(folder); + if (files.Count > 0) + { + foreach (string upload in uploads) + { + if (!files.Exists(item => item.Name == upload)) + { + success = false; + } + } + } + } - // reset progress indicators - await interop.SetElementAttribute(_guid + "ProgressInfo", "style", "display: none;"); - await interop.SetElementAttribute(_guid + "ProgressBar", "style", "display: none;"); + // reset progress indicators + await interop.SetElementAttribute(_guid + "ProgressInfo", "style", "display: none;"); + await interop.SetElementAttribute(_guid + "ProgressBar", "style", "display: none;"); - if (success) - { - await logger.LogInformation("File Upload Succeeded {Files}", uploads); - if (ShowSuccess) - { - _message = Localizer["Success.File.Upload"]; - _messagetype = MessageType.Success; - } - } - else - { - await logger.LogInformation("File Upload Failed Or Is Still In Progress {Files}", uploads); - _message = Localizer["Error.File.Upload"]; - _messagetype = MessageType.Error; - } + if (success) + { + await logger.LogInformation("File Upload Succeeded {Files}", uploads); + if (ShowSuccess) + { + _message = Localizer["Success.File.Upload"]; + _messagetype = MessageType.Success; + } + } + else + { + await logger.LogInformation("File Upload Failed Or Is Still In Progress {Files}", uploads); + _message = Localizer["Error.File.Upload"]; + _messagetype = MessageType.Error; + } - // set FileId to first file in upload collection - await GetFiles(); - var file = _files.Where(item => item.Name == uploads[0]).FirstOrDefault(); - if (file != null) - { - FileId = file.FileId; - await SetImage(); - await OnUpload.InvokeAsync(FileId); - } - StateHasChanged(); + if (Folder == Constants.PackagesFolder) + { + await OnUpload.InvokeAsync(-1); + } + else + { + // set FileId to first file in upload collection + await GetFiles(); + var file = _files.Where(item => item.Name == uploads[0]).FirstOrDefault(); + if (file != null) + { + FileId = file.FileId; + await SetImage(); + await OnUpload.InvokeAsync(FileId); + } + StateHasChanged(); + } } catch (Exception ex) { diff --git a/Oqtane.Client/Resources/Modules/Admin/Languages/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Languages/Add.resx index a200a84d..8132ccc7 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Languages/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Languages/Add.resx @@ -132,11 +132,11 @@ Default? - - You Must <a href={0}>Restart</a> To Complete The Installation. + + Translation Package Saved Successfully. You Must <a href={0}>Restart</a> To Complete The Installation. - Upload one or more translation packages. Once they are uploaded click Install. + Upload one or more translation packages. Translation diff --git a/Oqtane.Client/Resources/Modules/Admin/Languages/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Languages/Index.resx index 9b031c07..c755205f 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Languages/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Languages/Index.resx @@ -133,7 +133,7 @@ Delete Language - Translation Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Translation Package Saved Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. Error Downloading Translation diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx index 7527202c..9db1c83a 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx @@ -124,13 +124,13 @@ Error Loading Packages - Module Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Module Package Saved Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. Error Downloading Module - Upload one or more module packages. Once they are uploaded click Install to complete the installation. + Upload one or more module packages. No Modules Match The Criteria Provided Or Package Service Is Disabled diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx index 83a55354..2afd0baa 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx @@ -211,7 +211,7 @@ No Translations Exist For This Module Or Package Service Is Disabled - Translation Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Translation Package Saved Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. Translations diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx index 2a2c0d5a..b7a18332 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx @@ -124,13 +124,13 @@ Theme: - Theme Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Theme Package Saved Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. Error Downloading Theme - Upload one or more theme packages. Once they are uploaded click Install to complete the installation. + Upload one or more theme packages. No Themes Match The Criteria Provided Or Package Service Is Disabled diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 4ec3d693..e03b4454 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -340,6 +340,6 @@ Visitor Management - Please note that the third party extensions displayed above have been registered in the <a href="https://www.oqtane.net" target="_new">Oqtane Marketplace</a> which enables them to be seamlessly downloaded and installed into the framework. + Please note that third party extensions are registered in the <a href="https://www.oqtane.net" target="_new">Oqtane Marketplace</a> which enables them to be seamlessly downloaded and installed into the framework. \ No newline at end of file From e31f32e5aa726a3126ac01bf3833405e0cb88d78 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 May 2023 15:03:26 -0400 Subject: [PATCH 20/31] fixed compilation error and improved UTF8 support --- Oqtane.Server/Pages/Sitemap.cshtml.cs | 41 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index ad62bc49..95cc1dfc 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Xml; @@ -48,7 +49,7 @@ namespace Oqtane.Pages // build site map var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) + foreach (var page in _pages.GetPages(_alias.SiteId)) { if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { @@ -85,26 +86,21 @@ namespace Oqtane.Pages } // write XML - var encoding = new UTF8Encoding(false); - var xmlDeclaration = new XDeclaration("1.0", encoding.WebName, null); + var builder = new StringBuilder(); + var stringWriter = new StringWriterWithEncoding(builder, Encoding.UTF8); + var settings = new XmlWriterSettings { Indent = true, IndentChars = " ", + NewLineChars = Environment.NewLine, CloseOutput = true, - Encoding = encoding, - OmitXmlDeclaration = true, - WriteEndDocumentOnClose = true, - NewLineChars = Environment.NewLine + WriteEndDocumentOnClose = true }; - var builder = new StringBuilder(); - using (var writer = XmlWriter.Create(builder, settings)) + using (var writer = XmlWriter.Create(stringWriter, settings)) { - writer.WriteStartDocument(); - writer.WriteRaw(Environment.NewLine); writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - foreach (var url in sitemap) { writer.WriteStartElement("url"); @@ -113,11 +109,28 @@ namespace Oqtane.Pages writer.WriteEndElement(); } writer.WriteEndElement(); - writer.WriteEndDocument(); writer.Close(); } - return Content(xmlDeclaration + builder.ToString(), "application/xml"); + return Content(builder.ToString(), "application/xml"); + } + } + + public class StringWriterWithEncoding : StringWriter + { + private readonly Encoding _encoding; + + public StringWriterWithEncoding(StringBuilder builder, Encoding encoding) : base(builder) + { + this._encoding = encoding; + } + + public override Encoding Encoding + { + get + { + return this._encoding; + } } } } From 3aee52482dc4f8a31b24b9272b9a8c9c94f929f6 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 May 2023 15:14:17 -0400 Subject: [PATCH 21/31] remove message items as these are handled by MessageType enum and UX styles --- Oqtane.Client/Resources/SharedResources.resx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index e68109bd..b73cbdac 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -384,13 +384,4 @@ Confirm - - Error - - - Success - - - Warning - From e4a24df7b4a39bffb2b0ae39f6ca8e1157716c2d Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 May 2023 15:54:36 -0400 Subject: [PATCH 22/31] prepare for 3.4.3 release --- Oqtane.Client/Oqtane.Client.csproj | 4 ++-- .../Oqtane.Database.MySQL.csproj | 4 ++-- .../Oqtane.Database.MySQL.nuspec | 4 ++-- .../Oqtane.Database.PostgreSQL.csproj | 4 ++-- .../Oqtane.Database.PostgreSQL.nuspec | 4 ++-- .../Oqtane.Database.SqlServer.csproj | 4 ++-- .../Oqtane.Database.SqlServer.nuspec | 4 ++-- .../Oqtane.Database.Sqlite.csproj | 4 ++-- .../Oqtane.Database.Sqlite.nuspec | 4 ++-- Oqtane.Maui/Oqtane.Maui.csproj | 10 +++++----- Oqtane.Package/Oqtane.Client.nuspec | 4 ++-- Oqtane.Package/Oqtane.Framework.nuspec | 6 +++--- Oqtane.Package/Oqtane.Server.nuspec | 4 ++-- Oqtane.Package/Oqtane.Shared.nuspec | 4 ++-- Oqtane.Package/Oqtane.Updater.nuspec | 4 ++-- Oqtane.Package/install.ps1 | 2 +- Oqtane.Package/upgrade.ps1 | 2 +- Oqtane.Server/Oqtane.Server.csproj | 4 ++-- .../Packages/Oqtane.Database.MySQL.nupkg.bak | Bin 706772 -> 706738 bytes .../Oqtane.Database.PostgreSQL.nupkg.bak | Bin 616726 -> 616688 bytes .../Oqtane.Database.SqlServer.nupkg.bak | Bin 184206 -> 184174 bytes .../Packages/Oqtane.Database.Sqlite.nupkg.bak | Bin 106521 -> 106480 bytes Oqtane.Shared/Oqtane.Shared.csproj | 4 ++-- Oqtane.Shared/Shared/Constants.cs | 4 ++-- Oqtane.Test/Oqtane.Test.csproj | 4 ++-- Oqtane.Updater/Oqtane.Updater.csproj | 4 ++-- 26 files changed, 46 insertions(+), 46 deletions(-) diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index 218d8d40..d75a10e8 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -5,7 +5,7 @@ Exe 3.0 Debug;Release - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -13,7 +13,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Database.MySQL/Oqtane.Database.MySQL.csproj b/Oqtane.Database.MySQL/Oqtane.Database.MySQL.csproj index 034285d0..772cecd9 100644 --- a/Oqtane.Database.MySQL/Oqtane.Database.MySQL.csproj +++ b/Oqtane.Database.MySQL/Oqtane.Database.MySQL.csproj @@ -2,7 +2,7 @@ net6.0 - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -10,7 +10,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git true diff --git a/Oqtane.Database.MySQL/Oqtane.Database.MySQL.nuspec b/Oqtane.Database.MySQL/Oqtane.Database.MySQL.nuspec index 76f1c3a2..e30388a5 100644 --- a/Oqtane.Database.MySQL/Oqtane.Database.MySQL.nuspec +++ b/Oqtane.Database.MySQL/Oqtane.Database.MySQL.nuspec @@ -2,7 +2,7 @@ Oqtane.Database.MySQL - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane MySQL Provider @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.csproj b/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.csproj index 0b352b7c..6d6b8f19 100644 --- a/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.csproj +++ b/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.csproj @@ -2,7 +2,7 @@ net6.0 - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -10,7 +10,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git true diff --git a/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.nuspec b/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.nuspec index 45e4ccd3..23691ae5 100644 --- a/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.nuspec +++ b/Oqtane.Database.PostgreSQL/Oqtane.Database.PostgreSQL.nuspec @@ -2,7 +2,7 @@ Oqtane.Database.PostgreSQL - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane PostgreSQL Provider @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.csproj b/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.csproj index b7887756..ecd413cd 100644 --- a/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.csproj +++ b/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.csproj @@ -2,7 +2,7 @@ net6.0 - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -10,7 +10,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git true diff --git a/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.nuspec b/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.nuspec index 92891873..e61b079e 100644 --- a/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.nuspec +++ b/Oqtane.Database.SqlServer/Oqtane.Database.SqlServer.nuspec @@ -2,7 +2,7 @@ Oqtane.Database.SqlServer - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane SQL Server Provider @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.csproj b/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.csproj index 83182f3d..f3f2594e 100644 --- a/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.csproj +++ b/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.csproj @@ -2,7 +2,7 @@ net6.0 - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -10,7 +10,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git true diff --git a/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.nuspec b/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.nuspec index 10fd65b2..d748a047 100644 --- a/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.nuspec +++ b/Oqtane.Database.Sqlite/Oqtane.Database.Sqlite.nuspec @@ -2,7 +2,7 @@ Oqtane.Database.Sqlite - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane SQLite Provider @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Maui/Oqtane.Maui.csproj b/Oqtane.Maui/Oqtane.Maui.csproj index 4cb0adff..f47ea09a 100644 --- a/Oqtane.Maui/Oqtane.Maui.csproj +++ b/Oqtane.Maui/Oqtane.Maui.csproj @@ -6,7 +6,7 @@ Exe - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -14,7 +14,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane.Maui @@ -31,7 +31,7 @@ 0E29FC31-1B83-48ED-B6E0-9F3C67B775D4 - 3.4.2 + 3.4.3 1 14.2 @@ -71,8 +71,8 @@ - - + + diff --git a/Oqtane.Package/Oqtane.Client.nuspec b/Oqtane.Package/Oqtane.Client.nuspec index 2a8e5869..99de9771 100644 --- a/Oqtane.Package/Oqtane.Client.nuspec +++ b/Oqtane.Package/Oqtane.Client.nuspec @@ -2,7 +2,7 @@ Oqtane.Client - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Package/Oqtane.Framework.nuspec b/Oqtane.Package/Oqtane.Framework.nuspec index 60a80141..b2bbe94b 100644 --- a/Oqtane.Package/Oqtane.Framework.nuspec +++ b/Oqtane.Package/Oqtane.Framework.nuspec @@ -2,7 +2,7 @@ Oqtane.Framework - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane Framework @@ -11,8 +11,8 @@ .NET Foundation false MIT - https://github.com/oqtane/oqtane.framework/releases/download/v3.4.2/Oqtane.Framework.3.4.2.Upgrade.zip - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/download/v3.4.3/Oqtane.Framework.3.4.3.Upgrade.zip + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane framework diff --git a/Oqtane.Package/Oqtane.Server.nuspec b/Oqtane.Package/Oqtane.Server.nuspec index 21445f05..e4e993ad 100644 --- a/Oqtane.Package/Oqtane.Server.nuspec +++ b/Oqtane.Package/Oqtane.Server.nuspec @@ -2,7 +2,7 @@ Oqtane.Server - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Package/Oqtane.Shared.nuspec b/Oqtane.Package/Oqtane.Shared.nuspec index ad5d3f9f..965fdcaa 100644 --- a/Oqtane.Package/Oqtane.Shared.nuspec +++ b/Oqtane.Package/Oqtane.Shared.nuspec @@ -2,7 +2,7 @@ Oqtane.Shared - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Package/Oqtane.Updater.nuspec b/Oqtane.Package/Oqtane.Updater.nuspec index 98a4ab4a..12d8391b 100644 --- a/Oqtane.Package/Oqtane.Updater.nuspec +++ b/Oqtane.Package/Oqtane.Updater.nuspec @@ -2,7 +2,7 @@ Oqtane.Updater - 3.4.2 + 3.4.3 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 icon.png oqtane diff --git a/Oqtane.Package/install.ps1 b/Oqtane.Package/install.ps1 index 2823927f..ed7f214e 100644 --- a/Oqtane.Package/install.ps1 +++ b/Oqtane.Package/install.ps1 @@ -1 +1 @@ -Compress-Archive -Path "..\Oqtane.Server\bin\Release\net6.0\publish\*" -DestinationPath "Oqtane.Framework.3.4.2.Install.zip" -Force \ No newline at end of file +Compress-Archive -Path "..\Oqtane.Server\bin\Release\net6.0\publish\*" -DestinationPath "Oqtane.Framework.3.4.3.Install.zip" -Force \ No newline at end of file diff --git a/Oqtane.Package/upgrade.ps1 b/Oqtane.Package/upgrade.ps1 index 910259d8..d05ecaee 100644 --- a/Oqtane.Package/upgrade.ps1 +++ b/Oqtane.Package/upgrade.ps1 @@ -1 +1 @@ -Compress-Archive -Path "..\Oqtane.Server\bin\Release\net6.0\publish\*" -DestinationPath "Oqtane.Framework.3.4.2.Upgrade.zip" -Force \ No newline at end of file +Compress-Archive -Path "..\Oqtane.Server\bin\Release\net6.0\publish\*" -DestinationPath "Oqtane.Framework.3.4.3.Upgrade.zip" -Force \ No newline at end of file diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 158c27fa..2073c8a6 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -3,7 +3,7 @@ net6.0 Debug;Release - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.MySQL.nupkg.bak index 5384f1c72fed2dafb4f3b782789a3d18726b4820..6375fd66d42243dcc5aa889f14e94d00e2b5a511 100644 GIT binary patch delta 16478 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 delta 16481 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

ddEYGl!PF2}C-N%RI8Q_EIw+ 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 F)n9u{+GGF# delta 18573 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

QY8@7?K#;qRA^s4Rqaee(};HswdEZuQ> zal2r4T}=k8Upjk8dBlzr%2P&87YXKDT%>A=?3-L`lAcJ&0I{Sc z)`dFOe{cRHCx0EovS7Yw5UhlICe~c+=*?3Z|7t2d`YQc#(m`-t>33ID26|?CMyYKuexs+WG;e3>kL zWh5rL>=Guc{YtG!^imit+9Ub&{HEo=ipqcewK(eJS({2rQtI@U!^*u-Td=BAxHM1b zGX@q4AGdhtW;DJ}@oDUg#E3jX>fdhC-=(<3UVj{KAJ~o(5J2-34uGKiRKEfXyJo>I zQ>)cKEeq0h6<%M9J=}|QqzBL#V1reFXjm(`8zS(_m#o-zL5Ea!_-R8%mv=*71V>~? zD#uX@fP*oGn)0T-ffCBeL03SA1O#dZ*4<7rh!Q)3eNXs~Czj-N6#OaD6* zg4Z1MnO^$FHU;hbWYmbNdBQ0{G%9}*2ufFJdixgC)N>RLJno*gi=2qGhTA->Hy1`Z zQrHxrbPK9~>QBU3n9;&@cRlmI<`SZ}mw%Rcuxrl?LzV>6*r7rOfy^RoD#X;iyly|0 zTwoindOzH)y6Gz)(`SD_tL-Wp%~Hf=eWw*{Bpt3T=znjY)5WCaKAh4IAy1g790vUpnJ+LGyP1)I#2b@qek@ zVl+13hNa6XwlDeM`KpHdU&D6vgY;YYJ1yPNML1STtZYy9CVZy0i9)vyoh*d1qtFGd zNg!wafGu|K?; z#~;}VbNXZ4j9GbPoz*#yGuk>XB^tu1`%91I7ac%^Dj4)DeDpu)OOkWN7gC))e&h;a zoM`I;L138xG3Iq*A?$Uwn8zYHN`dXsjE~+ruD@)A5MX0G5U5*%ak6U-*neY!-<@DO zAycF5Fa@Cxq-vYxzVtz`gXmP6Ba7Z+22UGvH4UA-YEDZ-yu@v{C%&+@sMuE^jOr5} zg%Mj_0<*#UdlOf9{k1#jFP>vtmpVxZ0Q`@A96qwi%S+He_53B#;#tL3m1k<7jtXtF z?F->K9((Osfx`V~A}Y2wReunyv(nS8!d(xl?>ahXLtijZctZpYv5DrM4H1WLVIP%F zRv>Pzj9pF+%&_l^5Y(zqNq4_3euvtsIu#AIUFRJlwKL0X)L&SOhVpgAvFEE{?M{Er zRb8Aq-#%gUgi=jo9f6>+5A=uDydZTByD1;$5V`)X({E0IbzJ2gmw(UEnP>Z_b_0#j z8?TO0cwdWd2hTd*9pS#yX7BXw9UXUM-1sQo7L2d~9h>0$83GLMY+2{_R2>tUq^!!B zr718ZooHTyR>spg0dTnzZo&GZjL)!;%R@WDJ~TPlo&IuSmE(82)`4igqWZ}J-DAdH zxnmMBiAzjvGSM6xm482OV0r?W7krT7KDQJ&!e>||bjG_*!|iGKGEsW1)zU#gwq(>V zB0O&sHY%ThE$@6RkDiMm*@gw)i_+PnzHkr*GTqyU8%%>|fv5KN@yD>-F=uYxC0SVfuA*wDfAGhajBxW2b%PD4B)Rg1927f~Py?HTn$IA220%*oe zoXSW$Z-4Zz_>$P!7q<@t4v-=b7cYDV>swk|o5E6I6ADUd_vqnSg#)3`9WkKDNsL*a zV3Bu9IVGN7sZ7p!@_xJHbWU%t@;>0e0l(l(T4;Y zv3<(6t_2$u+q(oPzU6}Bf5?I_*Em3R;845-i|p>3c7GrVVv)7?RPpjwdrZ z|3$*vXu$DVN}ipMg)9$O2TbxNsYi2(tp>8Do$tv7Mlz**=Kh7IOnC- zr$(4P)vM#0_DejVYY4k)_rgrr8tZYm%bA4y^eL_P+kXA*hqD2@2fbQe{=J`d=w@%3 z+>^PNYcOfYo0!2J6I z*HHB($A3{7eR8^6=~7T|j#hM{eIwmR_(j-#Vvh zS+%ja_xFA{GD~Pk9%(B?eFD)@HI2(N+AMc&Vn?|i-mldU(@*mL@!9ke&K}YztEn;c zBz#h?cW|1!nqEH?s4D716|Nli!Y4E+a-NbC-ha&On9XUAr?bNK-hUqwD)hDuk0pN2 zIrOz3Y)#bL$U~|U#itt4x%%$LUz8&3gyF+` zbbk_2hJxv@POv$MAd^fc-Z?lf%i(zXi`-9|^>6xPaSRH*=i3HG`t5IFhUs=6Z~XEs zBOPgPn|!79h4%oE@ayClhBph`_32@mmaDu2YAxs5@);}DQ?R*g?SszW6WoSm!S(2T zO~DbRun><=J33Y9s@P<{n6Pq#^YG$UlN6R5O;O49|N6`LjqULXhT`%p{W!|AM z1D~io<>!T1BZna=1`MEyzU}C$E3ugMVAG!t>%0WSH2tnv*gsg%H{ofXLhfIg_ zusAg%lL9QlR^p2)|At4nOe!9dXqmCT84h^a>0a;?5j}+(Yd$&*4lPX0g}O{XHZeAM zBP%^=zwFRlJ)@datMM7aw>H-Aiz}UqNnWuqeMQR1fc|h^>LAC}wXoohkDrv@Pb$P` z&lV&9*J=>dKQ#!0^{4kSFCWJqzkdoN@8cBLXUZxmU<+&l3g`T)XdQqALXt`k=n1~K zU8NKQb7XjveqUW`L#$jQ<-l6!E-^R`Y+!q`f_vUc_<@UpeO8eDXMP~A%sNe`@GqiQ zPU(+Ff6#az;p0Q6#Mh&akAOKDiu3n~sJ?D$W<$sUh*?3p@Lc+d5`M3{X3(R>4cGV>=w9xf6gZHf z@H>DVDg~%*>NgwnXW7!Z*1LQ$v8s4-l}IoTvhPP}E`(T=UbS6xqmGp1Q#@Ao^s!oz zkO50}+|EPyVUzyKRl|-lQGcofe* zTjyg_gmFSb-&gO^9cZR6o}p6wPKIHZtKgQhtX_VOaB>i)5Xhjg2YNFe(A!T!v9(Fg z;weieinvpGQ?>dX!x{nD2Y6O^t?5Gnu`NAL_Y)r4Ur^2BNP_L-4S$Y=V>gqt-x}*z z4Z!h|=OW8r!fd_;G>x2lG}PN3z|F((3xgQtQKM;OyfV!UB_hs{ObjQ~A$iW2Ni;ef zmB)A{l*f2XBqAkF5}8IWgF$&VOey4sl1HXYO5!r-j&;|%XLbL&d#}%0d;jrWd$0BV z{o!hv%^BJ5MWmVv#i}Q{%wbmJ{o@8-)T@HSflbCE@3`BHKZ$?BPNTp+0s|$Nc*j zzJ2HP4(1LeKvF4C25Sv2KF=Rp9CGYH)+v~m4xmNhvzOxp?R(&fi?haK+~zrTB6DN4 z0$-b-LAH=yYmtBPO#0qtIIEYEL%{C8xtrSGm_y21|*b;1wg)R`*-g-~C z4l0a(y!V~k7nyMMrGbGkM=kf}i7HFIbh}%sRWZe0LRmujdIalVnH!*<0t<7&b1OoO z>B;e-bJ|T%*tZ`8*9Fe3p_$_)K55)NW1qH1eJ48__8py!`cz2yax?8-loyN6D+y!z z*}AmyQiopA^YrpmnyN1>h5^%;gy<-Ov14FwT^_QL;G_||@(=pJ!EJqXEAqM21 zZC5^?PMX&p6>(2>U2L6OX^cygyNV1L^?cbtU$~BMpRd_kw%xK_#7L{s&3$W@=3i5! z^oCljYEe;N^{Re-(75JY)c4YDPMB%tXS74V1Vn#*5Hl63pdX0h9DMN>QQBgVR}}ne zx$e=J+JkoPqUtCoq~bxSPU?Wyi<1q^*Su0YjN2OHOLgd6Z|u;o)%>xq=)2A1shr(a zaaUE&YL?i`u0>@9>xGr5YYp;FI4^iz`w+dZNrL1)Klyc-uflY&asB)f@yy?vnX*7y z*O#Sucl|kkN^Jc*w#n4dm0#lJfi&$;?LED`=3e)kWWI461Kgm$sZ>q&&&(^yDo$zi zJ?slNrRsPMG{LIUCG>{GJ)5v9cMYl~cBUvLWpHV-S$;b7csCL_h2SHD6<-@zXot!)$6(;~X zh66_NjB!z$t8q)&g!e+YwI5_&ar^7ajjV4Gk{hi$kET+X%iv4aFtapdvEH|Pat|;U zV9TW)R+@M`jJz1qze2Oqd-({8alyBPTaw5-G{@oSkmH-Ugrq6Ka zme$>W5{|fm3ylmc!Qln)6r`)i_S-gg50TI!Tl<%%%Vuu*8mYhRW;9-dA;Ki&vf4kC zv|qd+3D=(@sYtQqZ&ef9h!z@&8j%(t^6cci0~ylsIC2&0^1w?x4Upr+5i+5ahE?~5 zBW(hKi@S~<+$|SODu16 zPB^Q6OEU5BeI~F3<+M~`Z=|CCI;o>&1JPsPfR3w>&7NU%6mJIFfgC19i z&_p*J!B}Ck@`5vDVj&+~3clN;i`TP7G<3FenX{z6OxveN7m{iZBq?Ket7~?;;vy7L zJbJa24OuV6c@p1=#oJgAy>afcR_?Mj5J|?a_lTfqWPn~$Wqhidta3hLdMNe$mHn8C zAS}^E6>p`kUjtFT$l)JM%GyXzwZGhj;hXA)r08K1&uu03Iwi4EdUdO_nOar}1-25o z%~k@om4Nc$+CX%ZQWY z;&N>nU6UAi=GYH(^iFS%+vouidX+eL=ghPQyyD4Rd_@7e%fFs(lUdM3*EHgIVW3Ch z3&Sq3zPO&pAmc7(Ap>_tyv3Oup0X^wIEK0(XH^f0H93SuuD#t=H==NR$HT?ez}YtI z+af>42zt(98ft#*6Yp9b&moBBtsravj`7#xJ^ zeM&azXfpd~Br5fRJT_cfzT5bugyhp-d#h36p3Y3~`h~RkC62zVEtR(XM;8MEtIPb4 zVu#&B0kHC$$=>wGut8Kn1L`VG`KCRFZB7NY0{@l2u-&Kt0_+K4w^9KNJDUn9BY)~v z@s^P>kRJ8-;InyDz!NmWMg#-yU<`vD5)Al(eA)fM02;YjbS!73akSJagOnowcbs$; z%T}fV+cwLQZ9oIGLC@IsGysMCsVKoRGHyQwy<%Uc0Vaq3&oXr-$-*|nw@Bw6sWWGc I0!VlN1}R15GXMYp diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.SqlServer.nupkg.bak index 09bb866aa71c75fac04c250cbfa6f7c11ad586ca..0bbc834b53fc50e19ec90d6103e625f35260b7de 100644 GIT binary patch delta 17398 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 delta 17435 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 O&oha$y*>jpfdK$D(}^1Z diff --git a/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak b/Oqtane.Server/wwwroot/Packages/Oqtane.Database.Sqlite.nupkg.bak index 715d4cc06b8c0e7fc73fc56842aa495c0437c64e..44b9b0649d622d0f536c6b77aebc8b0dda448794 100644 GIT binary patch delta 17028 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�Q2{IubiB`Q`* zG*TFUwks8*T0#?M4eXE{c1*)-Q2Cj%)uc|CwX#t(^QLpoDw=RRYI;l^bnHsN zX*l7CQ8Ak?kQA3SY{`{|?Q*?RZOGlaBwMS0l`XRb$C)i9r;SC~Efr3gjthN@)M+na z+c37JdeLhyWSzGxC_yUg;doZ4qh!P^)TgF6W}3WE zdff6_+2e)->l+5N%OAALW-wswh47p0RAj^%&8*`Xvx|vWYDTrCAP6(b_pE{im$#JWs+MON zW$U4ZVVMcMfO9exTY`ZP&UDCd$BYYy&FYjlO=Uj|hPg3w-ArRJZWAZ$7vJ;mDWF=L z$W=Yl;fjj~S*BDjb0`-P!c{!r2Hm6~+b)|%m6!D@Wy?_G_syToG=il)K(nQPQnv2d zxoXidD`wRT*z6Q8^U22UKv}-@@X^qt=49D-Uoh80Z_0JPL4>P$gOPQn>f9jjP@@-$ zri`rCog>4`23R>JPM8Mvpq7~(Fh(z!MT~Sn1xwpGOBOBM=9;@h$nbmThGd|f&F1@y zqtc{CsXd=81bMi>VPldS5&I3G%)-uD##GgIJ*((03`>7LVYK{h z&JETGj2yOJkleu$6N6eZt3?ZpU_-<1XuB3;^GZvt#DXAl>6}rnH~HK^*=_phq-TMA zSC@=lK;ZE-a&HsbEiv5)rT1Rvc7nmenhC7>Um4S^>`y2#jK$LppuOEVJY+D0!JjCQ_14()v0NXmS)QuAgT zM>e9~EYuyo~F;@ z$1kXZTef6ZJ^P&_-&yziCuGfocl^7O{vj1smat>YBZI9)k&o0p6;A`hF`XT zEsd$k?oLA}4D_f(CDaE7#Io+xNs)T6ML-h`k#M)cHj0_zk5d2Qdx+g&v>m! z;t?IbMX3i|`--evs>i#tL=J-0Xua<`T?=j=(R zykpw)YVLu5UAv|%Z@ON{6z$3`TUHLT%w*$qL6Mfr>PKF${gTAkF?QD_JZW6=rui~1 zNGyt5X2OLiT}IjEma>K41~{F_kK{);I|F~xk-PWH<;tV0hWAMw!v`kvcHJqO6IfDs zA#^7e8aAfKm2y|06s1~-@KRs&Nt$xu)CcG9HkS$a`@7A1auDYp#Rm4eiV7* z9oFN2-|B?7J1TCP{1j>bEQYOhZ${Sq%S*cB(SQ*zoYYmLi27iVsi^WGlp z;4(cI>EfjvHhGZZ-F0daO>fHE(SgQqFBRnXme0~|@OcNXH1=cum@o!T2|G5o=V0Gb8!@iE-aplRvg0@y49mP4sllu9L;-8KT^dDDQ?WYzQ8+wc01*aw?+)l!O z@|IHi@Dy$^h4eLRaF83Q+3d-0(|!hhEXyxF92@MP!{AOyjqIr!e8fGRqG>)k-PT8c zpOUs64eD@ou%@tY)&H}N8Qi1_IwsGH94|#kw2on`Uf;J`oBTo#H~oumT5>G1C}le; zu&4|Vq~E2EKPK;|-@!ECe>YvrXNLFF?_ByHP)h>@6aWAK2mo`QqE`Er9PLUj007`v z001Qb003-hVlQrGbT%$9FHdoFVQyuUjS>`pom>exRNwo*_AQ}BtM;OW>`5Clh8c`) zEG@p(m>G=5%$ONlixkO{lC^~rLP^PzB$4(|O8Y|EOQlVVO8;~2ECxe%n<7IHo#Lz2Gm8U^;1VABG@* zufhNE@EM86p)-BB@VTrEIN)z?Bt#KhTfl1@H-Z)Tj|ca=+`v7C!GdJCX&n7L6@tY! zhJVx;tQoTLE&B!J@EDn;q@;+Tr7{KwfT4#vIL3g(2pmIUUI;&p@VW3_QE(0aKoR+s zLyif4iA0}4u3_L%0EZGk9pV9!t^!woiQxZU@V^WESCx`R+@z!sD)=vjgt|x}M@dr1 zd6G188yrVnrI9jloCQY%IBtRCAvm6b;|(}8-2fUKY;c6QNg;B8gI}BgG|%q)nP?rl z?mP!iqCgF~*@y}Z~xtdD}&y$0G2J<}_R-7f`)ve-R5tMs}bB6hDYxQDHO0J(I) zp$hJ01kdLS?qLmJS>U)B3hw0v&nJOH4csdV?qUC_i``Eb^o|^wH!MAZj6$#ZJv_YE zFYx~s&;#NW*`(6lZmpa zHO`DasWBY0H70YMrX&9c zD>9GlMds4RYC_PVg{>JbS8spz3zi)z!}9V|aG^1104UF-@l5sf_4FKYu2>d_X31vHai?*( zbQW__5PV?C<Y=O{x`?R zJzV|nPSm@n+Xy4WE++n}Jx~)eLvlli$O%kuR&Ux(dXrpNIX^W@3TfJ_{Os1=U4aF% zi~p`_UmH4$P*tKqer^1CvqliVsE8rxS${U2LF4EOe=^oH(KFP4HPSOQGMHzeH*Yr8 zV4n9pV*?XoQ*ScWaGsed#fxfcG~bx2Z)R#R-^AFMW@1D(GNmF6GSerJ>_bDaQxPuO z!@AypS(m~JWb%N3Vg>Tpfjr$cbS4$C3T2Z0=@c@95o%9ouAx!w>0TT%Clq0^d31mJ zS~3q7g~M-agv}s-^SoIcf5eg*ie(2P96(6-r-_O@545+*Y%_ghL#nBPm%%&}V||+O zd{8bE)A=-`d4^_GLvJ$KfMPP=)Wpn4R8SG#KpzNlD$SeDq#>>@mRQ^z7o0uLl7yQB zdKVt1tMuVNtfLFg(#Z*4nyk`a<><1?2K?ZPa}lKJ^@|{Xxk3LA3?x4=>5{xS0RPb6Fhk&V3Fylw7B+d{d~M3oUwQ;2j5hs9-i^T4QOJJ5J2za>C| z9`&JdgmB}32a4Iq69mc1)!gxL(jVJX3&`h`i#dBF!vlG~FmnnzPV_9jxI7M-0HgyOi>?iShJ&HuGaO!WA{mNr8S@pfGE}_H zj;T>wicPnY2E*V8?*%+>ipalVNt)uOIBpvgYZve0QmW3@FC7#Qo5mziv0ya-f?LSf zAl-;OkwPkme|bNoWwu@MmcX4Ae#ox`9$$+qL~5jv@jCZc=P3sgcWPX{W$;Zq?O$kX zAmoG`3&L7&!rH{zJ+paYGbo|(91~c0}hWT z{NmP~?S~6Wo*sibe~(lq90tX=voC%dnPz+Bk+%7EX5*KB@El>jlNW8OfjH%A^71n~ z^lhq0`AKz`qL)j?aYETVmJf%__6^m4BQSY14wK9f5Y>dVRKW_o@laK*KA~WppW|@g zYsbU`|0c4dg<8=#^dRwGuQ=>>3(hMl^72}>N0ZeyZhL;ikDp!=*`V43ltdoCc_p>( zFKO39kZv5=oqVHYsC8bcc8iwu<=ny0@fjRxW40sVQi!5UR(XB}7rP5dGj_m#ts62J z23!b_#^j0>r+mc1Yp^)1fR;4ssU(Lju_p976Qo2k8J+CIWO2c?kT`H|b)GDRT;*@> z#3}g$Mly`7{OW3hm$x=ihKi?QNz)?dq2=j=?A-Iz{N3HiQZ;Fu! z!Go-==?pOJfO#w+cK0yhU(fT{~y3ZW@lgdu&>$W`#7!WFd5F`>xqI2MH z6s(c;aJ8Rxdu6e^RjP8H-Oc+cnU3erkVI17D0dl>D4fmbtbO#r_84`jYql$KZa*YE zwj`45*peHFg%o0N3hV5xv&wGwnp?d1UkWw-lZXpBAVK{_)92lKrTefvRyRikTrM@X zFW{P;_8W%#J2)ynhfU*u`g&xN6!J!)d~NGh1aq|RX?a6Y0jYluKCVFjcO0xn-KBQ& zm#NJb5%Ea}$iV#QAJ=EX-Yj172xdLP?#G-QCw1#nkA6-rXv6dRr?94xfpIL-4p-b# zsDR_#O*J8P<@7AtI zD!@Bx`c90C&7Qx1Wq+1LehU~Fi$nie3ta_bB8P)3XogDHm6(cs(Mwm@o>|b80d4tlQ8$ThF%BDqr^cVb)VE<$kenHMe9k zSv<5Ogf#6k4!N-S7DkIFb>#oRM;v(m!#i`jSHCoT7>nYP2pj)*wfo%fyNBRTJ$|cv zZ0;6Dzc8rllX+mx|Q#?Zlzgizbq0)^m{e!Kak_iW72}BZ`5rw>veB2=9Mq&m&1j; zmL(hmi$`4E4MlTQf%rug=w2Yq**k_!jc zA|q$~GTDjtyJR&izw8cS4~maZ;q}gbADkJZS8s6Tm2m7zpOR>6?5}1FOabgI(4KJ7 z70`@|tf@nn9BIQDV;|qf7AgEzrFK@I?uRCr13jJsV|2!WXgD?+Lo-fP{i(#H((iwN z(Y?-;tP=|btAxh*@F24o79pu|Qt0*d4cHQM#r5>LSd9UB_|WUBTWjH##B+V~3qG&) za7oqUH%9*)He4c9pbWxwlN2ht-LdKL6PI7eki~#6TdB1n8gx zhR+~+&WE(RpK6DR;g>h-92(Z_`42RIH0pp^CN{s7cG;i~DVvmE<6QLs{(QdMhP{JfaOIGhV4QJydd`7#p(rj|8+aU!k_Y#kUnRO9$0fenj;Q;8EO+_e z2uUo;8k$H?Gi{7~1vy8xwRJ?_UWC~dLEUPw;N|pwIK{_%Rp8<()R7am$NmZLfMv<0 zkZ0#dtAt60(tUvG?b1`pzPWwFS;#PYqO1J<_kQ^8V~dL$O5JAtgF)0sZ=6^5#!TyoQH^8bhF<$MAYM>^_=s_Fuyfj^#?Rb)istRA)Z%R=?n-W(OZru{LoyRwlPSO^6iMP|&8c6Y@CjGB>(KIFxZ}yY z)CUVaPX3Vy2cDgt-8VJP_91M+_@ed=HmCk0CV#hzv3p>O^oMri(ZNQ4OSco)%HZ%- z*!@bmn2Vme3-Q^X^S;Zx3lLL_Fce^~aYLCD)P3Sjriie=E>3%egd<2rvqH8;-Z6(# zdu!(rc~N2#155HHbA(pS9p(IHG&$MYR{j>xe$#j-#z>cA>D|ep-U4@munam-iUqI} zDIXGGAJaZ-Cj7qcWwYOZXT#kioi0E6!n(z2#_e@y zd5AQBxRuFgxTjy61jm4GW{U0^_6fVa@l5v;CRI-|1B>ZR_X!jTcM0Xm_o*p?Y^?mX z>OcK_EfWI{Z#ukxK78mP*f3zTPNdj-an$ZW9@A9?!^fqm*_BTy+mn@OaB~nmP@IvO zV3!YUX7b5&KloKcGTF#+{`HNo><;Or1ZI04iXH@+z&qpfwGM5g!&$53zQ|jqJx>}Z zPuw<`Ho`H3=o}W)AIu(iGKWs~>J~FTDrfT`YnbcFod5fi|NFXw%PEPvN2oIR0i;+Qht`0!=*i|vD80iIkZ8V6QTz{O-8OMydtvZI03 zRO~&+%Ke3ZFATIyq6Wd`#-(vcGzy3@5VlcViBdQ$*tN2Iei4^caGMS0g-Ow0QwBlS zZSs(|be2JqJ#P)!RkNqrq|;}VY5NvkmPlen1N&IOqd);W=r9DKpNaF`Z%R6>CA0O< zjB6ic9b-RjRyJE`E;ndS!2*!=JOUO?#`C7)YlfXRq>b`M-6r$0?d=o(f-ER4A1{{HJ& z<{+4yd_%b~T0+3Ivq?Pzt=?+a+|UG5huA}ZzYmN|`&`;D6EHq_G=CcqPUh8Z$!y_0 zy9Ap&_+s+9mXd0V_?5(*uBEe`B(eW{Xu&4{axFLr*`<9Ve7ed4ag(d z^w)c}2|}ATeDsx{=|-sbaz8z4%f}?i&~DGKn#`qb5V!l8yt!joD?ZYQGKFdrtSk|K zCvqK%DIFU|7{^05SM{*P8(-QU!=01fq>ZBese|*aJtqX2p$}m!~IN z7I)^Xc>U4xxkQQ{{uN0B*5wGgafH=WH=FQkyhC*KJG+xIPbdAGjE}Fiw|NW47Vf^v z4!ZAJt0KHsqP+86$ts7?g)E^Qt(iW5V80kambHXZD|Uag$+$A?f^vk<&H;HOt7SOSHyxzKPC-6z)+o9Tx>9;o}m6nj=z+E(}Ov zMe_<2j;=Cio!5}y{bc5fB-$OTz0a%u9)A8ken0|&QmTi!2BE&Dua&%hZMHdoaG}UU z-zReEfKXfz7$@LHz`+hGdjvW3;!az=STr7!z57h=$D{>g{>{OUj}y@3?NveboK**` z)@ZAbay(gY-)K}lx_m$yV8&8tJ!oFa623#4mim{6&YYv;6LU{5ky3VhERn|13$9>J zES6B>Tt4t^I~*7HAJ-(-YmRn*JYKRf^mXTI$r^|wh~et9RQJ)0d|N-GBP37divcU> zmc>E$qK-4|GSUN5N_N@$-kI15sltbp0@q3@VTWcgJ1?u|!hlqQNR1l>324Qbq!NpV zn)vFS3o1RnX~#)~I&na38jl_%k^y=L3i2VEzPa?uiM-|3+c`Me%Cud7cO;^LS&3s( zz@jelP@2DzLgAxYb=yXc7)Hn&`S`AZ&FOdD@NU^9ZtJN`J_wdKMMTFcYj-Pilx1%D z_UA*7C{E}fCsqt1SG0~~Ef36wR;}@ZBh$vx-7u9uz3zTn#5C^9!`DTiG6`zo%31@+ zgmoa6o`qi4|Aww#y?R`Ki{;UIm{EJP^>6jZ(Q}?X8$SmPvx!kzn5w0*o0yt8#l@{) z(bWFX-JS(O2Yh~nI;p>w-G3W!`?h@&?&i*K`yPOCgGh*@5+ZNR>cP^~jt6#=~jhI`E-?1Nn_ z5?sRGw6C8lX7;&%)473U28IlD6!ArNM9R)za8GS`gz~A4K5wycn}1$aai}Yk4CG^~ zXA)4eaCM3;a@1S_8+ZNP{`W(UtnS8m(3wVteW&7V?af&bSZ7Z-Ftee{E^cDv z+j|3DXg(l*SY&By$NQ$iR(#$SZbtNSvDnKRS8QIfKg6GZOJQ*sbYT=!M|{{tSe5Mu zZ8|KlSFouORKHcJW;P%Sme7A4DDH{6&$$yAWGN6?e&4c$V- zLK+#{=De@#T%=85(X=1bl`>|+w7^9rQe}UXrT>BvSIaSbTi33fgH0M9y(;I?4FeKA z#GdR0x8w-^U@u49t@Zs|@g3yJIHY!!T0{CBC+nDhm8W$|N2c!~Iokte+X-v$LJrpR zLU*!&+ig{lp#V2zav{1BU*$|_|LRkRiF)%QB2`l@p$CrAJ?Ii^kDxpH^KVSNGusM- zKe4Ekn19kzu19*dK(p4Pt>U5{AR_@x%14jTo=<((`T#nQXD;QFHUs&dU z|HsLwXqp=+0qVeFg0=_4O(=V&D9Wb7a>}k|&g+~r3STtrW#-H~lj0>{No*R04wZ1x zlz95({A&m{yl7EZWU!04H_9ovTqd(v1QvuH@>h<&It=fM*#Wqc#TkF6e{N{7idp`A ze22}?3zG4Y^`IvgHlm&M>EdSBDeDw}@l~nWhn6?quawLoP%q!|5!bf#bZ z@y^Q!MGSonl#G$jQT6je#dys)?nIkCClY*0?4!qZL&QuG_3XGmu!NoSbX z1!D2VdCy6Cw$3}n0q{hk@%pHL&n;1WIjebp`75 zS+=*ieo2Jw8NUgk%heec5(t1s3ATEKja4*>cNl$HV8$jYSk6c}2izCupak|nqk)o4=ubU@ zy9G-hcX?R`@t&b=V&bYjH65K8NkqWJ6PDd|N$^z&`^Z)1q~*wAqn2hkPaXbLRuZg_ zdHHN!eHSczVbM1gUPL-E;b7FMMajRS`vG@b0BON_sN6iWW!tZR6zMF-6ieg0j{R*{ z1weixixhe}To6WhZAsep^R-3Vo#^_-Efo)i>>P41-+v%Bv7EkiBqEcfky_0Ur1XX_ z_8Hkn-un%Ic&`^mQ2f7XUtrx21!P^<$bICHmCk8tOp4aG zLaU6qCXMHJmt!P?`4HUdW>lGOw9i>#>a)+LFq7yT8c!L2B@xm`EHz5qLshn0Y2U}` zOrC|SG^u^_>enSCiRzF}wc7oK3gwOK^MJv#d*mO-gXo6AvlD z0E3Ppv{ZJpJuktGl{I;@{mY7RJD)s!c@T*Wl?>%$6kdElU64;+TyL6^brzRq>KAZh z$=B_YG2PC8RN=0++{D{3%awPYZnU3=wJxJd8EVa+X(SoGoX!^8M2ROBpGBA6@nw$= zIg)Mn#8_)cTi?FjjTJce-hhZSkgh8DeD!s`o7ntc3D@ub^?1>pPOMm#6ex~RAujUX z1VoUp!aA;7?xfw;u??HKvxc2EJ0e>m0Ut7LeByI|nCHylAAd}E7v>N?CS)bO=0&VT zh!qD+2{G}h5PKip@VLVYP^Txz+3rqI__1}^l|2%{edg587om^UPqrnv5mxl4a$`XHm<8A)2RnlnwY{9y4JCk8oy?nOQ*<|oy5x%9c~!dzxo-%6S{cAj|mB;UYozEMkoo&JumNd>?rhKnEwHp)c%7SK~ z@~cMzAuwd&2ndU8*bVbCvbhi)xx$nfQ=4voSngzv01dWs0|Y6fGiQ}RA^7LRzW5-- z0+WB^r%lKs^#bvfAVyR$352CP8m%k84IgvSJpmYm= ztAC{FCK?lWaRm7)bwj>GiGFd&y(dP?#39asG)}0PLGUQ}`$34&%3B`u{rY-L`8FHJ zbJJD{WkQc__nMua*P&-5ZKjd_sFCZe&&>Rh+sd?BFGvghDg1;pj$Jwq+otwrMXDRV z1y?m@|7_cv7ljgBp~2M{X(0{K`B5CJDD+r;D5=V96WyJG8q-^ryq z#9UgNJpCfESsX{>!4L~565v|ajaBh+Kwrz8&@l6!y1Kko#e3yY&3A7fiea6)SLKJ> znCL=s#osliBu|@=S#`$N$Y}R!@zlMghxyj37?{J<`>&2E9yyDtCQdUypTEja4C6uz z2n69?qCF4h-7eVcXLd;0NTs}gAZB_rH!o8%^A$sY{pvuVZVAUp{l4*?P#uxcnV?wr zN5LvqDn)Ks&^o0a2u={4LUUr#MP{&tVQC|*&9UfPA0DSnwn_*yI-6A4SS60?5wt{k zRa6YKc~Q^#Q9XH>UHZ9g0W(J)St(9u&=l!Nebxsn%i^wxqj|nay<{jKGjr^4R7@*Y@N#b$ zg<~sKmFDZ(SW5{pf&S2cnir;~WAE>RIXJMM+dWtxN!*dT=5@y9X%W3syMspPjv_B@ zlf4hePehP%XM;_b<#r$2i**eOLOYzlGa_z4U$jw0-_vxKUEWZ!6mPYy&PefZ(8EXp zz=h^5Y-KAtmkpOI@fO^;}JX zanv{VPM!pU-s_+GJo-l)tS>P^yP840V72$%pF5_Z1!{ev&>hjI$c*`>2hsJR zb;N9J$#Ta$jh_LZU(~yZ;Qa3+aKROvi2~Hf>r3L%ZT&-k1uD}#Gq6QtVy~RugZ(7| z#lIq=i? zueUy4A1*`*EElZcGZ6y0#s#Vam+UQEWK9_fs3YRpN+L$#(?LS~n7Nmx@B7X87YX10 zj}_Xj_D|7&3Q+WHqgG5_V7X_OHqUw8>7rgN0v}=5HJ~LbAgWczyiIp4AeKHJov>9d zZ)>l_eY(bA#-pP!lY66FzYS>_W)t;jqT|)vM@M?$@W83xt>xWHbWcM~sMj+rKWBPb zr-yf4cTzrft`|tKStF_*AKX%y`57uYto_@Tg|0JyA|5#Yrf_L9i~bL=;P<|3=)BwS zB4J?~<~B6W50tkpy`Cnk@h3~KFCT{vsxFd;SH6{jl~EeG6B0O7HT*p~(X2nT%v5Qqkt4%#8Js?!<9T+}KoqIAGl7jhf zeHS77yG0?@PuXd7+J*sH#MH0MTO(3nDGGLUtne^V8=?kU2idU$JJx~dSkH+GF|k=ffa!sXrOxDakj7Wmay#6mu8eGO_YuD5YsE?X}XQ>E|Io{mrcJRl2Jr1OnsocIcV z3xQS6HqmOw5l$_<@A+zBSnI%Wu29!5?D+W!_WUK~MZWLbnsE7LqoP%U3w#HJqucV` zYG)nmKrQ;_HT$FYjNKKug9lBehPWnM49EfZOi5f}`#(E zX?s-qM@1Q7tk7K|G(>v1sh7Q6eHmiBJlAMNe13&3+!r`;>~mtW00Z62-ID?fG8BI^ z&pc=h8jbuC&#wLZcQGO1iGj~T!>f7{!GiquwW5*ZA2Z4=c+ZmUPiE+UscO`1b(9F{ zvt+-$X^ZX;$)5gc@NmXSeAQe=kolN+D@kbaPnXEQ3fT;CAvM_zzp`IqGOW|SuWudM zB#sjk`UdB|oke$!H)=8*T1_0%hE#IuwRLU9lY{7iKn9u9*PBtm)BOp>mV-y}#rp9J zY_~oc8K-D)EW-R6vXe|5cYfLL6`_?w=!4@Y z$FeY2U^Z<5jm~FX4_Tb1G`C%Sw_$9b zbzaSVrL_`s=Fsn(CghFB`vLXocP-KsbSlOwUU5vCT5g@E^6I(qcHFpr@V%Txq=Xe{ zz#FZz@YDLbb&lz_DsR<-7ryU{My~{@A9}gy_Y5X@#nx^+zQ-=1a#N&6NLF({D6tT^ zrq1?y)a#uw<>%smrQ@1j3^Yd2dBl!TkKk2=gVVRKdHj&) zE(F21(RxN`UY@3fDizsd*VmnTqGEkCA^lj4!ZbNa2sBVsfa_2)M>pXcCbXvP4sv%W znDlU4V9dU|0v!6WKi5FE$ZxiW^8tNnq~x7Pt<$|I$DFx;Ec>i|x7k9!t7w+}`1-pF zCZuAo&wfvNVp+I+<)?<7EB1*cgsv+78&yKNzC+&}-D^^b3qCTrOUtp?de?#Rt6PL! z+f$@^%iENq?+2vJIyB`wkXCAc_fHSV|JW;WpYdZ`u?ZDacc0E4w4H({+uchYbT9tJ?43LzWUORs1?P76=Kcg3D zLf6BsFdxTC>9O>y(Y8rf+6q$d#5DH=2}>xdRi%mN1E}oDYvPllmu|$S>^8UiVwTk@ z4s#-lK0UTC42OCz43Ce*-u)a|eEvOyqpP1kxEW+)n2o>FI*^ak*xLdPl80z32-~;{>r; zVvj^nRpB$JE^t+QL~-dz)gUgZ@RR{hmGIPm22P|A@I-_sIy?oB1dXOOO;rKGNh2c= zBWXkx1h|F5@0P01R+T|?WffHrl6)xqoT#FjzKU==2(-dTiSHd64Yo<3IxVk4n{PSt)t& zn+p6UF8m-bybl-)zUyk}EQC*%1`og|C|5*4#^5WjQsGg{RVTtPy{=YOLWamH%7bEr zDj=ib)2Z+T$o~(62|>3BK>;g91bdvJR<}5Z0Y(!8bAFB zV{mLzTW{MS6n>wy|A73QfL%9MmD#S;-5%C=jN6CU6kCrWKWXn!^+9Ip81)Pn@<}j%E~0W zz65Sc$TF){i70+P|IwqxGixlioquRt@k?OJw35TI&tGWu<-6^hpTBew_pF%9i`Jw) zsl8yQV8YhqzAimQbX!!Xe!-m^d_KWqw__`}uh^lpI$A^g{fp1Xc_WVtOj@jBZnFNS z{nf`ummd9NyYrhl{5SwcCJ_eI;}xb)o6Bg(0g8Ii@c`4$&t-H*Z1A5hJ&(~#0kq#A zeIEqSL@00-np`EMK7GwRMlGgG4%2VUV{`;3uj#V$8Ko>gw=ptgCgdpBA4lr64;SfN)1>kEw8*)`N0Oro@J-#{%WrC=|IneXHO znc3n)AIKSfP}X!b&p0J$r0ta%J9>)4M9{_j@nN>X1H^O__J7I+k{}a0x{uL4F&5+= zHH6GMG-)$fuOX(F}3TE9q^pL(HVr7hy`5lsRX- zVH%7YFhokW;75!dWv|Bw2D24J*g?ST?RZcTGjj?KB_%I?M>nf{RX0W5ie=U0?OIU6 z?oITso=jteK42wb(t4aYpJ*QyhO4|kbU=Sr68~lx$U@X5*v&KNUjP6A|NjF3P)h>@6aWAK2mnb@d{ze& zod=U%0XG8e!jqQ)ZZa3E^;)eil^-yIl}D_KEG9(R1DVQ@nW7xKO26Ne@gQI4?7cyd z+kNKqTU!wQf{L=Z(X0x@5`?m2d6Day&Oz`Fo{l{8Fo*Ptmi9Yiphp2d}LenXtS}#dXGAqns%i zw(awzR05d-^lBKnM^YuCORB;cyV1xQ#wPm0NG2siALUs zPwFXCH(jPU=mSl(?wc2U8@FF3W2R` zv(&Y=MXqnInVsxc3T#s-N`H(x3p$9zuhQ41w4^selOe9S&{DYw5K-J^jPigfYR@8n zqNL(s7?K+lryZG-4)7(6cLaDR<6QyX&G=G@e};89%L1HLJMdicB4RkQ<-5?m0+bp` zp?K@+q_YyNjcO>3f~_03JgnZ)=3?k8-YOJ6peoL4w&^phrU!mcZdvZ$jpAC?_cBV9 zo;4`xfrpY?_A5P63`P%zMeA7?R2X7^N$G>dbT4wW*RFO%l44StNS(R?*38_lsX%@H4T4DdR6KThPwTsjo>D`+P1EWb!}gu zxi3JzXA|=@HTI1Fi*?`I7E>R$cD$l(S%Godi@H$Wu6jLE(AkWvO# zRq+boFD2B(L2-mblpbDsDYgQfYm$1AW@rP(`oAP~m4*{XutzO_!}KS5GJZ%oArRRi zbw*N~0&3}R#6AgX&zhP}4Q<{dsjKlfv^Ahc0*cmZpN8afA=Ry&6&gJsQc=wn3Hnh; z{X_I2v6$WtsYeoD5bZQ7*Y>M4qdg{;&?6!Buga66lfEXYOY~dxl)%b~Ufn7VEwj0n$?W6F1s6(#%+?YmgZBPiihK@>2KF~6I>K#$Q+D1uX# ziqgh`C9eiYlUmv*JXxrPYaXY5ahF7A*Ze%S%9+uBR^DZ$wQeESDz{0Zvu(K|$-VH- zUPMxkUZ79W>R`z|R4tW^e91hsow5bra%>=jwr}}UBU2T#uWFTwrVHNTis>3$-e4VZ z9Wec=2ItNpr&ukSAEj~AKRv=~hYJ&C*&uHYJv`<4W?3IFe1i^8`i5=l!xM&U7O7A! z(m=j{-zk?3yND*t3fMKW-!%=tP7P0%tOj+=tdxv`Ic&P;tb$2Z+bZC!P5q8NW{p=} zQ#MaS)_Bm31D5AI?o_}%U7nY1hrXfQfaO&jPvX9W$ExsA*<>FbKgm> zQ+L84qii-@ASo`Z+mb8xJEdybuFKuLBwML}lq|Cd$C*tfr;T~pO%+aee+y$mp)kB_jn&vNC&aRzXO{D&sUg!hijd0sIG*LJC>b#G)$wtTnFg;W zJ!1LI>=DC-^>qVU<@Z}9GaRtiLio*b%QE7O(oLmmQ%TCT77v(S!L=&03o)`4t0Ze2 zGfTz=iFvJ+!;qS<(aMx-jZZWc9Wl^<&8+JhQ}cZZT!FuyGebHQ!)*kmvx)6C8!Dd7EERuz|tO~*GKf%a0xbTJxwmRtnq~&h?r%> zjI8FJL+51!tQ-@^OapsR)65PTgBQ#KMmnUzrR|(0i{@@~joqQf2zuw$$WS|*&F>e7 zrAhTtXEvD+^VhOI@FTIboc$9GCP0_8UN%)jDSx7Mamce|&Xa(Dx z7p@T)Ic&Wkxq|~H2DNC~1q+ODL&NUqcot)`N{h|JoFMY(oKdPa_}oCrYxwB6Z-IPI zmkeG&;PEu_ZV}o|FL3CKMgcpGBaOWan&u4+o)Px%}}# zU>4oH!SSP4ZA6^&2%JWQ2&T84^(-?d?paq8UY`0EI{oq9~OB)|t+U^iW$b zW7Cg{Rg_YbBBe!ZBN<8$CP+=Chth-TY@9@YditsM>8JU!1#DqV zO?9>#LSYb(N>svlZ?9O?nLaMkrCd+RO>$rS_kTFGXY;GyJELmpEJV;}Tq{!e ziMGI^^r`fxQn8FG(q<~vmWjzct|;u{)Jk@DJeATiN_r{n3#Ly9T*EjIX;E^}Ok8xpQ zQM@t}9z^MRls(^6Huu{Ar(?qd!ykU|H=p>IjrR`z&YwKm^ZH5Wk61_lzEPZDU2hcE zwyLe4G)niI?x^Qf-GVuaOPk}3dinDKcdo^w^Sfbx)XAS64M$?sHhm1(O(gY7F;Bw> zvO7Msn?mEvUxdc713E^3?mqL6tFQg@&R?8Lgb)0j*3~|u%#&�)m7E+Z`yCh78N5 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%0AO zi7=hgY7^#0e=274%T7J~!u^>&=|qZ!p+a$l3UQ(L20MRo>o!=&`job`6&x*m-e+0s z4$H%FVhMPVL(yk5QK|3zc=@!q+T{E?w&U&bb{=9OI5wCPBI472vMcJcBFDr|#QYs; zwWIK-^FzYeQ)0pW=F|qMB2+K^xc&lJ_TmUkT;*9zPRGSYvFIf*hEpi{^aG~l!HOz= z{k16e=t+N@8cS08^lJxHd!V*pRi|)i-q4i`EEGO&(bn~7)Sc3kgc&K(1^D#8-K4)u zuqiz_-uA2=B`ApIEgF_U`KfUc7S?mYHdE`BKP`(g^@hK`oN%BA=|~TvF~Gj30MWEc zdOJkm+!rs~c3Ov2dEiM?R+n#6Zv;ndM=C2SqgsD>VP(9GLRg|r;i3%`o%AYPUo0>6 z8`V+QVXdzJ8n-*c;fj69RVm!2Pn&9cQoAz2t}JK*Fal1;-bjUcxfHt; zO-ty+CnV8o=S_`I=A*$@?rMI@@En8hPzYXjFkt!^7~2$e?2?;ER4))s31UR~lR!|q z8qLG_RQi9QK4TDba-cfr?ueB9=W zaxZpcgD7NiFpV89Vi3svXO#{y=U!g1pGq#WjZ(iC{i%~%4~)v zsmZ~$5%$Up71+8E74KEqx$;7XIg! zZs;PMpe#|jqi!88TiaxKw+@{wg0iE~1+9rE=lp;zbK}gc%~7Uf$;E{q8M8kIJrRFN zZ4Y84Kp-EB0V3dpW%K%3@D!G<%vkD6m5eI+c=OCrO3l`4qBt5ChFCz60N1h}tc>&= zH1KZe{P`|<2i!1)-&KkZ>5o1nf_3a!m3_w^+zNC0W88{aesHz*DX$aSIxgj!qN)2z z5BD<;AZ`>4`el9w9}J|)`H~B%&R%~%@pulbk?oMZ;cXDu+eQ$)IR=rBP{cYJh)K=B0 zZffjmaEQ^)uC&p3K@bn+>xzG)8|q-~j(^TqUz9%IK6(APiYdlA0zqRR90;v>LFznq zOCii5X3blt-<%*qV$Cg=&vDr&`=)jSjnETCjv4;G5#6Pob+|j)W2?>1>D^m8Z^^mw zQM{cIQ3E<5+5a;H7~a~j+UsvJ`3PDWN9P2=L&+u>(}byEtBX8Tw;2Q$&}Htg=6}s$Afvn2Py4x zOM@ePhIR7uB-d%!9Zg@x%dWCsG62YyjQT}H=WTL?>JixT&ZPzPd<@ApGWc$+&JK-* z12B;3zJA9UHEvsmBxc*gU8k?{QgSUyYn(}o1d@?d4q1g}MF$LLU%+vqo4w9yp>h zvj{3WKTYEPvl#VoAcRe!auD)_HMLDWu#>BcK17k6YHC zk4*AW~DaAy`Id9(trPbP^ic|Fg%u|Ij7KwMN{{GNEwtxMEz2) zySNXXiPiG+)h-;v6m_lgUQNzjGbp~F5V=I(o&5M#2E^vzn+6VI|P|vGXB=SF*y#0GhgI? znsWY4Uo4hEp$oq_FwdalEzB^}?&H;8-j$?-9qp4Yw!QG}2NHeB8^iErfnWWEEYtE; zw?Kcb1<5`jId3lGeDxZFT z4s)~|lmqUWI&%c=?-@IPGwgao_w9ACDL5Y?c8<=5% zm!0kdKinWJ)M#^+NI0}G^{3Be2e63=p%JXi)IIWpa|uT^r&04Wgl}vuK0g1qF+Vni$^bLyzj>Gp_7x&qmGZDIax~ccYPz| zN&BCP>DnsrUhr22p6=Q6fsPP~`)CvWIJnzfM^W3ZCRk^!v&;>X-l*PgYGzZ|UWi#n zI{i%cu`+I_$CQwVi<&O;G0?r-GbykjL(w<$I@O9$+caP{=Fie4x`b{1m;`@y9Jy93 zmquYYu zVsU8EPnR72jYVI$A0@j>anEbE!^Wq$CpQ`r(nN70Lf>Ei;Vo#UFPfoN_D+srmp|Ms zZRvT%Iikry^gu9!!tU?QxKDrYI10tqIt7a-EV)?XR@HTN8n=w<1zd&&9|eS* z2%YXnytKcdn#I9n+ed31@uk;y=e{*IsO^X2CC^9PU&3s@1+}(rl8+%K8pWmQG}(^n zmmI$5%|N|Xf_=WUaa+($fiu+>b?l=K`Hfy<)V()8?1yxra6m*a6dr#*3|1%~Jv`d^ zIn4KN*^jcC07pzh@fORo+k@)|K=VM>Ct}fn^PO|pR*x3`N8G)ovne_7c*6joe*NxT zqx~KY0Q`}#VExH#{06u;>f)t3L~wIS`~x+jbQh_8h-wbj8jS9~gpl8hsnBcZBBYTn$wF+vd8!B=(pL z>EMw`&MP#WQp6$9Kv6z!V(Mu$(EE6*$Cf=oyDjr!}kw&}bda6#>I9Q@k9?52iB1{@ctHfO?7464Sj`(G85)Zcj`n$!3q`3eNlg zevj#sxZn68R&IYpO`G=4Ipdt(D&xzn#+e-`Hx*>kvnDYJ>bbCO#>^v!)wDEPR_&jq z_3hT429bm!?oML#>>rSJm4hGGSvj{qnN5HKh}Si)bpc6U`ufn-2oPFNb6JWnuRDGCW>^a15hU3M7eQ@o};a6(9~b<#wg)4nJ6#q|aW zN+_&V-QnUwsO;6PNtc)vn2F7gm9m+(c^Y06=138KdMwQ2H2Tg?*$tI8vx8Z4jftn!u0E5_x|lgenQ1L3M$n)GLZhTcRFuIt5Rs z;pq`LIjg|a0(j!UQzATNjs}f3X}Xdef|o?p5F<%M36YQthhH~Uo}(m%=t|2EL!4#9 z;YUa1M;Z(hYzKi>7%ld_L!+TK2~?-~mm*)v8Zt)M2g-duqRG(}RNX}qo<;~70jkod!>U96|mEgVI2^(m(+# zMg%)+qEfd3hXFzyo&W?}i`tRqOHdKg5`@5Z6efQE^_8Tx5@0z0Ivx0$BUK_V}WXc>B~_j{3`wu}<E_{k$pq{yvp2{ukDj@_MN;4Ibh+?1#i%Zh-ewPtw=KGlZ%KV+<@4Xid_Cl8 zRq)+=XO^yec0J(kp7lrV6JH+qB=;{a;x`xUYyd_k5eC$=7N+OUWi;dfMKkEEfa%NT zGCCu6`%nKgm(fcBdG7;9Bm;vg@TdU^c51^^#eI=}z` diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index e4f3c016..00e174e9 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -3,7 +3,7 @@ net6.0 Debug;Release - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Shared/Shared/Constants.cs b/Oqtane.Shared/Shared/Constants.cs index 4cd3122b..8dc00e73 100644 --- a/Oqtane.Shared/Shared/Constants.cs +++ b/Oqtane.Shared/Shared/Constants.cs @@ -4,8 +4,8 @@ namespace Oqtane.Shared { public class Constants { - public static readonly string Version = "3.4.2"; - public const string ReleaseVersions = "1.0.0,1.0.1,1.0.2,1.0.3,1.0.4,2.0.0,2.0.1,2.0.2,2.1.0,2.2.0,2.3.0,2.3.1,3.0.0,3.0.1,3.0.2,3.0.3,3.1.0,3.1.1,3.1.2,3.1.3,3.1.4,3.2.0,3.2.1,3.3.0,3.3.1,3.4.0,3.4.1,3.4.2"; + public static readonly string Version = "3.4.3"; + public const string ReleaseVersions = "1.0.0,1.0.1,1.0.2,1.0.3,1.0.4,2.0.0,2.0.1,2.0.2,2.1.0,2.2.0,2.3.0,2.3.1,3.0.0,3.0.1,3.0.2,3.0.3,3.1.0,3.1.1,3.1.2,3.1.3,3.1.4,3.2.0,3.2.1,3.3.0,3.3.1,3.4.0,3.4.1,3.4.2,3.4.3"; public const string PackageId = "Oqtane.Framework"; public const string ClientId = "Oqtane.Client"; public const string UpdaterPackageId = "Oqtane.Updater"; diff --git a/Oqtane.Test/Oqtane.Test.csproj b/Oqtane.Test/Oqtane.Test.csproj index 5d21e440..8641026e 100644 --- a/Oqtane.Test/Oqtane.Test.csproj +++ b/Oqtane.Test/Oqtane.Test.csproj @@ -3,7 +3,7 @@ net6.0 Debug;Release - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Updater/Oqtane.Updater.csproj b/Oqtane.Updater/Oqtane.Updater.csproj index c3b96c4a..9cb41856 100644 --- a/Oqtane.Updater/Oqtane.Updater.csproj +++ b/Oqtane.Updater/Oqtane.Updater.csproj @@ -3,7 +3,7 @@ net6.0 Exe - 3.4.2 + 3.4.3 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2 + https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3 https://github.com/oqtane/oqtane.framework Git Oqtane From 143ad85fd59c00d75401439db80d2371f304cb5d Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Tue, 2 May 2023 16:00:23 -0400 Subject: [PATCH 23/31] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e4e3523c..09322cd9 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ [3.4.2](https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2) was released on Mar 29, 2023 and is primarily focused on performance, as the permissions system has been overhauled to avoid unnecessary encoding and parsing of custom access control strings. This release also includes enhancements to connection string management, numerous stabilization and user experience improvements, and the ability to dynamically generate an XML sitemap for seach engine indexing. This release includes 62 pull requests by 6 different contributors, pushing the total number of project commits all-time over 3300. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. -# Oqtane Framework - [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Foqtane%2Foqtane.framework%2Fmaster%2Fazuredeploy.json) +# Oqtane Framework + ![Oqtane](https://github.com/oqtane/framework/blob/master/oqtane.png?raw=true "Oqtane") Oqtane is a Modular Application Framework. It leverages Blazor, an open source and cross-platform web UI framework for building single-page apps using .NET and C# instead of JavaScript. Blazor apps are composed of reusable web UI components implemented using C#, HTML, and CSS. Both client and server code is written in C#, allowing you to share code and libraries. From e939dbe24eb4d469a978ab304b604839ccc5ddd9 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 2 May 2023 17:14:46 -0700 Subject: [PATCH 24/31] Updated SecurityAccessLevel.Admin --- Oqtane.Client/Modules/Admin/Dashboard/Index.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index eb46b301..79e2f1cc 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -22,7 +22,7 @@ @code { private List _pages; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; protected override void OnInitialized() { From 601582fc980fcbe589a1474076476441cd7e5de3 Mon Sep 17 00:00:00 2001 From: Cody Date: Wed, 3 May 2023 08:19:24 -0700 Subject: [PATCH 25/31] Update Index.razor --- Oqtane.Client/Modules/Admin/Dashboard/Index.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index 79e2f1cc..ce391cb7 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -22,7 +22,7 @@ @code { private List _pages; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; protected override void OnInitialized() { From e444c6bcf0c7e83d76ab2f6d5d8f3df9da4cf255 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 3 May 2023 12:25:52 -0400 Subject: [PATCH 26/31] fix #2777 - module rendering order within pane - moved default module ordering logic to server API for consistency and better performance --- Oqtane.Client/Services/ModuleService.cs | 6 +----- Oqtane.Client/UI/Pane.razor | 2 +- Oqtane.Server/Controllers/ModuleController.cs | 2 ++ Oqtane.Server/Controllers/SiteController.cs | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Oqtane.Client/Services/ModuleService.cs b/Oqtane.Client/Services/ModuleService.cs index a87229f7..e1914004 100644 --- a/Oqtane.Client/Services/ModuleService.cs +++ b/Oqtane.Client/Services/ModuleService.cs @@ -18,11 +18,7 @@ namespace Oqtane.Services public async Task> GetModulesAsync(int siteId) { - List modules = await GetJsonAsync>($"{Apiurl}?siteid={siteId}"); - modules = modules - .OrderBy(item => item.Order) - .ToList(); - return modules; + return await GetJsonAsync>($"{Apiurl}?siteid={siteId}"); } public async Task GetModuleAsync(int moduleId) diff --git a/Oqtane.Client/UI/Pane.razor b/Oqtane.Client/UI/Pane.razor index 30b4f0f6..f193aab0 100644 --- a/Oqtane.Client/UI/Pane.razor +++ b/Oqtane.Client/UI/Pane.razor @@ -127,7 +127,7 @@ else } else { - foreach (Module module in PageState.Modules.Where(item => item.PageId == PageState.Page.PageId && item.Pane.ToLower() == Name.ToLower()).OrderBy(x => x.Order).ToArray()) + foreach (Module module in PageState.Modules.Where(item => item.PageId == PageState.Page.PageId && item.Pane.ToLower() == Name.ToLower())) { // check if user is authorized to view module if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.PermissionList)) diff --git a/Oqtane.Server/Controllers/ModuleController.cs b/Oqtane.Server/Controllers/ModuleController.cs index f6578624..7176057f 100644 --- a/Oqtane.Server/Controllers/ModuleController.cs +++ b/Oqtane.Server/Controllers/ModuleController.cs @@ -9,6 +9,7 @@ using Oqtane.Infrastructure; using Oqtane.Repository; using Oqtane.Security; using System.Net; +using System.Security.Policy; namespace Oqtane.Controllers { @@ -83,6 +84,7 @@ namespace Oqtane.Controllers modules.Add(module); } + modules = modules.OrderBy(item => item.PageId).ThenBy(item => item.Pane).ThenBy(item => item.Order).ToList(); } } else diff --git a/Oqtane.Server/Controllers/SiteController.cs b/Oqtane.Server/Controllers/SiteController.cs index 2ce891b7..895744a1 100644 --- a/Oqtane.Server/Controllers/SiteController.cs +++ b/Oqtane.Server/Controllers/SiteController.cs @@ -137,6 +137,7 @@ namespace Oqtane.Controllers site.Modules.Add(module); } } + site.Modules = site.Modules.OrderBy(item => item.PageId).ThenBy(item => item.Pane).ThenBy(item => item.Order).ToList(); // languages site.Languages = _languages.GetLanguages(site.SiteId).ToList(); From 99ac0a3caba3864b6bb54e07d37653e81e5cd1d8 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 3 May 2023 12:32:28 -0400 Subject: [PATCH 27/31] add defensive logic in case list of pages is empty --- .../Modules/Admin/Dashboard/Index.razor | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index ce391cb7..6ba9014e 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -4,20 +4,23 @@ @inject IUserService UserService @inject IStringLocalizer SharedLocalizer -
- @foreach (var p in _pages) - { - if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) +@if (_pages != null) +{ +
+ @foreach (var p in _pages) { - string url = NavigateUrl(p.Path); -
- -

@SharedLocalizer[p.Name] -
-
+ if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) + { + string url = NavigateUrl(p.Path); +
+ +

@SharedLocalizer[p.Name] +
+
+ } } - } -
+
+} @code { private List _pages; @@ -29,7 +32,7 @@ var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin"); if (admin != null) { - _pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId).ToList(); + _pages = PageState.Pages.Where(item => item.ParentId == admin.PageId).ToList(); } } } From c6ba4f4beeab3b9f6a7b932b525c872edbde2424 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 3 May 2023 12:46:29 -0400 Subject: [PATCH 28/31] fix #2763 - prevent module definitions from having duplicate names --- .../Admin/ModuleDefinitions/Edit.razor | 204 +++++++++--------- .../Modules/Admin/ModuleDefinitions/Edit.resx | 3 + 2 files changed, 109 insertions(+), 98 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor index 44f2ede6..a209342e 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor @@ -192,113 +192,121 @@ } @code { - private bool _initialized = false; - private ElementReference form; - private bool validated = false; - private int _moduleDefinitionId; - private string _name; - private string _description = ""; - private string _categories; - private string _moduledefinitionname = ""; - private string _version; - private string _packagename = ""; - private string _owner = ""; - private string _url = ""; - private string _contact = ""; - private string _license = ""; - private string _runtimes = ""; - private List _permissions = null; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; + private bool _initialized = false; + private ElementReference form; + private bool validated = false; + private int _moduleDefinitionId; + private string _name; + private string _description = ""; + private string _categories; + private string _moduledefinitionname = ""; + private string _version; + private string _packagename = ""; + private string _owner = ""; + private string _url = ""; + private string _contact = ""; + private string _license = ""; + private string _runtimes = ""; + private List _permissions = null; + private string _createdby; + private DateTime _createdon; + private string _modifiedby; + private DateTime _modifiedon; #pragma warning disable 649 - private PermissionGrid _permissionGrid; + private PermissionGrid _permissionGrid; #pragma warning restore 649 - private List _packages; - private List _languages; - private Package _package; + private List _packages; + private List _languages; + private Package _package; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnInitializedAsync() - { - try - { - _moduleDefinitionId = Int32.Parse(PageState.QueryString["id"]); - var moduleDefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); - if (moduleDefinition != null) - { - _name = moduleDefinition.Name; - _description = moduleDefinition.Description; - _categories = moduleDefinition.Categories; - _moduledefinitionname = moduleDefinition.ModuleDefinitionName; - _version = moduleDefinition.Version; - _packagename = moduleDefinition.PackageName; - _owner = moduleDefinition.Owner; - _url = moduleDefinition.Url; - _contact = moduleDefinition.Contact; - _license = moduleDefinition.License; - _runtimes = moduleDefinition.Runtimes; - _permissions = moduleDefinition.PermissionList; - _createdby = moduleDefinition.CreatedBy; - _createdon = moduleDefinition.CreatedOn; - _modifiedby = moduleDefinition.ModifiedBy; - _modifiedon = moduleDefinition.ModifiedOn; + protected override async Task OnInitializedAsync() + { + try + { + _moduleDefinitionId = Int32.Parse(PageState.QueryString["id"]); + var moduleDefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); + if (moduleDefinition != null) + { + _name = moduleDefinition.Name; + _description = moduleDefinition.Description; + _categories = moduleDefinition.Categories; + _moduledefinitionname = moduleDefinition.ModuleDefinitionName; + _version = moduleDefinition.Version; + _packagename = moduleDefinition.PackageName; + _owner = moduleDefinition.Owner; + _url = moduleDefinition.Url; + _contact = moduleDefinition.Contact; + _license = moduleDefinition.License; + _runtimes = moduleDefinition.Runtimes; + _permissions = moduleDefinition.PermissionList; + _createdby = moduleDefinition.CreatedBy; + _createdon = moduleDefinition.CreatedOn; + _modifiedby = moduleDefinition.ModifiedBy; + _modifiedon = moduleDefinition.ModifiedOn; - if (!string.IsNullOrEmpty(_packagename)) - { - _packages = await PackageService.GetPackagesAsync("translation", "", "", _packagename); - _languages = await LanguageService.GetLanguagesAsync(-1, _packagename); - foreach (var package in _packages) - { - var code = package.PackageId.Split('.').Last(); - if (!_languages.Any(item => item.Code == code)) - { - _languages.Add(new Language { Code = code, Name = CultureInfo.GetCultureInfo(code).DisplayName, Version = package.Version, IsDefault = true }); - } - } - _languages = _languages.OrderBy(item => item.Name).ToList(); - } + if (!string.IsNullOrEmpty(_packagename)) + { + _packages = await PackageService.GetPackagesAsync("translation", "", "", _packagename); + _languages = await LanguageService.GetLanguagesAsync(-1, _packagename); + foreach (var package in _packages) + { + var code = package.PackageId.Split('.').Last(); + if (!_languages.Any(item => item.Code == code)) + { + _languages.Add(new Language { Code = code, Name = CultureInfo.GetCultureInfo(code).DisplayName, Version = package.Version, IsDefault = true }); + } + } + _languages = _languages.OrderBy(item => item.Name).ToList(); + } - _initialized = true; - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); - AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error); - } - } + _initialized = true; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); + AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error); + } + } - private async Task SaveModuleDefinition() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - try - { - var moduledefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); - if (moduledefinition.Name != _name) - { - moduledefinition.Name = _name; - } - if (moduledefinition.Description != _description) - { - moduledefinition.Description = _description; - } - if (moduledefinition.Categories != _categories) - { - moduledefinition.Categories = _categories; - } - moduledefinition.PermissionList = _permissionGrid.GetPermissionList(); - await ModuleDefinitionService.UpdateModuleDefinitionAsync(moduledefinition); - await logger.LogInformation("ModuleDefinition Saved {ModuleDefinition}", moduledefinition); - NavigationManager.NavigateTo(NavigateUrl()); - } + private async Task SaveModuleDefinition() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + try + { + var moduleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + if (!moduleDefinitions.Any(item => item.Name.ToLower() == _name.ToLower() && item.ModuleDefinitionId != _moduleDefinitionId)) + { + var moduledefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); + if (moduledefinition.Name != _name) + { + moduledefinition.Name = _name; + } + if (moduledefinition.Description != _description) + { + moduledefinition.Description = _description; + } + if (moduledefinition.Categories != _categories) + { + moduledefinition.Categories = _categories; + } + moduledefinition.PermissionList = _permissionGrid.GetPermissionList(); + await ModuleDefinitionService.UpdateModuleDefinitionAsync(moduledefinition); + await logger.LogInformation("ModuleDefinition Saved {ModuleDefinition}", moduledefinition); + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + AddModuleMessage(Localizer["Message.DuplicateName"], MessageType.Warning); + } + } catch (Exception ex) { await logger.LogError(ex, "Error Saving ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx index 2afd0baa..8e3bf1d4 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Edit.resx @@ -216,4 +216,7 @@ Translations + + A Module With The Name Specified Already Exists + \ No newline at end of file From 2aa8d3be0f729a026a1e47b76baa2ef89cfe631d Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 3 May 2023 15:20:55 -0400 Subject: [PATCH 29/31] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09322cd9..7a48dd3a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Latest Release -[3.4.2](https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2) was released on Mar 29, 2023 and is primarily focused on performance, as the permissions system has been overhauled to avoid unnecessary encoding and parsing of custom access control strings. This release also includes enhancements to connection string management, numerous stabilization and user experience improvements, and the ability to dynamically generate an XML sitemap for seach engine indexing. This release includes 62 pull requests by 6 different contributors, pushing the total number of project commits all-time over 3300. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. +[3.4.3](https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3) was released on May 3, 2023 and is primarily focused on stablization. This release includes 27 pull requests by 6 different contributors, pushing the total number of project commits all-time over 3400. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Foqtane%2Foqtane.framework%2Fmaster%2Fazuredeploy.json) @@ -47,8 +47,9 @@ This project is open source, and therefore is a work in progress... 4.0.0 ( Q2 2023 ) - [ ] Migration to .NET 7 -- [ ] File / New Project experience -- [ ] Folder Providers + +[3.4.3](https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.3) ( May 3, 2023 ) +- [x] Stabilization improvements [3.4.2](https://github.com/oqtane/oqtane.framework/releases/tag/v3.4.2) ( Mar 29, 2023 ) - [x] Stabilization improvements From 35edc053b5a03bb39309a7789f118212d36adc99 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 3 May 2023 15:31:34 -0400 Subject: [PATCH 30/31] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7a48dd3a..59ea6a91 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,8 @@ Oqtane was created by [Shaun Walker](https://www.linkedin.com/in/shaunbrucewalke # Release Announcements +[Oqtane 3.4](https://www.oqtane.org/blog/!/56/oqtane-3-4-0-released) + [Oqtane 3.3](https://www.oqtane.org/blog/!/54/oqtane-3-3-0-released) [Oqtane 3.2](https://www.oqtane.org/blog/!/50/oqtane-3-2-for-net-maui-blazor-hybrid) From d1b52534de5cd150819ae9946fe5f77fde394690 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 3 May 2023 15:46:38 -0400 Subject: [PATCH 31/31] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 59ea6a91..8b766e3c 100644 --- a/README.md +++ b/README.md @@ -154,14 +154,15 @@ This project is open source, and therefore is a work in progress... [2.0.1](https://github.com/oqtane/oqtane.framework/releases/tag/v2.0.1) ( Feb 27, 2021 ) - [x] Complete Static Localization of Admin UI -[2.0.0](https://github.com/oqtane/oqtane.framework/releases/tag/v2.0.0) ( Nov 11, 2020 - released in conjunction with .NET 5 ) +[2.0.0](https://github.com/oqtane/oqtane.framework/releases/tag/v2.0.0) ( Nov 11, 2020 ) - [x] Migration to .NET 5 - [x] Static Localization ( ie. labels, help text, etc.. ) - [x] Improved JavaScript Reference Support - [x] Performance Optimizations - [x] Developer Productivity Enhancements -[1.0.0](https://github.com/oqtane/oqtane.framework/releases/tag/v1.0.0) ( May 19, 2020 - released in conjunction with .NET Core 3.2 ) +[1.0.0](https://github.com/oqtane/oqtane.framework/releases/tag/v1.0.0) ( May 19, 2020 ) +- [x] Migration to .NET Core 3.2 - [x] Multi-Tenant ( Shared Database & Isolated Database ) - [x] Modular Architecture - [x] Headless API with Swagger Support @@ -181,6 +182,10 @@ This project is open source, and therefore is a work in progress... - [x] JavaScript Lazy Loading - [x] Dynamic CSS/Lazy Loading +[POC](https://www.oqtane.org/blog/!/7/announcing-oqtane-a-modular-application-framework-for-blazor) ( May 9, 2019 ) +- [x] Initial public release on GitHub +- [x] .NET Core 3.0 + # Background Oqtane was created by [Shaun Walker](https://www.linkedin.com/in/shaunbrucewalker/) and is inspired by the DotNetNuke web application framework. Initially created as a proof of concept, Oqtane is a native Blazor application written from the ground up using modern .NET Core technology and a Single Page Application (SPA) architecture. It is a modular application framework offering a fully dynamic page compositing model, multi-site support, designer friendly themes, and extensibility via third party modules.