diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 2970d442..194b0e13 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -346,6 +346,12 @@ } } + if (!PagePathIsUnique(page.Path, page.SiteId, _pageList)) + { + AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + return; + } + Page child; switch (_insert) { @@ -407,4 +413,8 @@ } } + private static bool PagePathIsUnique(string pagePath, int siteId, List existingPages) + { + return !existingPages.Any(page => page.SiteId == siteId && page.Path == pagePath); + } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 7373d36a..4b28d530 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -333,7 +333,7 @@ _children = new List(); if (_parentid == "-1") { - foreach(Page p in PageState.Pages.Where(item => item.ParentId == null)) + foreach (Page p in PageState.Pages.Where(item => item.ParentId == null)) { if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions)) { @@ -433,6 +433,13 @@ page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); } } + + if (!PagePathIsUnique(page.Path, page.SiteId, page.PageId, _pageList)) + { + AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + return; + } + if (_insert != "=") { Page child; @@ -512,4 +519,9 @@ AddModuleMessage("Error Saving Page", MessageType.Error); } } + + private static bool PagePathIsUnique(string pagePath, int siteId, int pageId, List existingPages) + { + return !existingPages.Any(page => page.SiteId == siteId && page.Path == pagePath && page.PageId != pageId); + } } diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 1f6d38eb..633caed5 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -116,35 +116,51 @@ namespace Oqtane.Modules return Utilities.ContentUrl(PageState.Alias, fileid); } - public Dictionary GetUrlParameters(string parameterTemplate) + public virtual Dictionary GetUrlParameters(string parametersTemplate = "") { var urlParameters = new Dictionary(); - - var templateSegments = parameterTemplate.Split('/', StringSplitOptions.RemoveEmptyEntries); + string[] templateSegments; var parameters = PageState.UrlParameters.Split('/', StringSplitOptions.RemoveEmptyEntries); + var parameterId = 0; - if (parameters.Length == templateSegments.Length) + if (string.IsNullOrEmpty(parametersTemplate)) { for (int i = 0; i < parameters.Length; i++) { - if (parameters.Length > i) + urlParameters.TryAdd("parameter" + i, parameters[i]); + } + } + else + { + templateSegments = parametersTemplate.Split('/', StringSplitOptions.RemoveEmptyEntries); + + if (parameters.Length == templateSegments.Length) + { + for (int i = 0; i < parameters.Length; i++) { - if (templateSegments[i] == parameters[i]) + if (parameters.Length > i) { - } - else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) - { - var key = templateSegments[i].Replace("{", ""); - key = key.Replace("}", ""); - urlParameters.TryAdd(key, parameters[i]); - } - else - { - i = parameters.Length; + if (templateSegments[i] == parameters[i]) + { + urlParameters.TryAdd("parameter" + parameterId, parameters[i]); + parameterId++; + } + else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) + { + var key = templateSegments[i].Replace("{", ""); + key = key.Replace("}", ""); + urlParameters.TryAdd(key, parameters[i]); + } + else + { + i = parameters.Length; + urlParameters.Clear(); + } } } } } + return urlParameters; } diff --git a/Oqtane.Server/Repository/NotificationRepository.cs b/Oqtane.Server/Repository/NotificationRepository.cs index 45730d84..43025c3a 100644 --- a/Oqtane.Server/Repository/NotificationRepository.cs +++ b/Oqtane.Server/Repository/NotificationRepository.cs @@ -21,7 +21,7 @@ namespace Oqtane.Repository return _db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.IsDelivered == false) - .Where(item => item.SendOn < System.DateTime.UtcNow) + .Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow) .ToList(); }