diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor
index 78dec87a..436eb45a 100644
--- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor
+++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor
@@ -116,7 +116,7 @@
diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx
index b142a19c..cf720e19 100644
--- a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx
+++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx
@@ -169,7 +169,7 @@
Select whether the page is part of the site navigation or hidden
- Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. If the page is intended to be the root path specify '/'.
+ Optionally enter a url path for this page (ie. home ). If you do not provide a url path, the page name will be used. Please note that spaces and punctuation will be replaced by a dash. If the page is intended to be the root path specify '/'.
Optionally enter a url which this page should redirect to when a user navigates to it
@@ -297,4 +297,10 @@
Expiry Date:
-
+
+ Url Path:
+
+
+ Provide a url path for your personalized page. Please note that spaces and punctuation will be replaced by a dash.
+
+
\ No newline at end of file
diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor
index 11619c43..68996c8b 100644
--- a/Oqtane.Client/UI/SiteRouter.razor
+++ b/Oqtane.Client/UI/SiteRouter.razor
@@ -20,7 +20,7 @@
@if (!string.IsNullOrEmpty(_error))
{
-
+
}
@DynamicComponent
@@ -244,7 +244,9 @@
// look for personalized page
if (user != null && page.IsPersonalizable && !UserSecurity.IsAuthorized(user, PermissionNames.Edit, page.PermissionList))
{
- var personalized = await PageService.GetPageAsync(route.PagePath + "/" + Utilities.GetFriendlyUrl(user.Username), site.SiteId);
+ var settingName = $"PersonalizedPagePath:{page.SiteId}:{page.PageId}";
+ var path = (user.Settings.ContainsKey(settingName)) ? user.Settings[settingName] : Utilities.GetFriendlyUrl(user.Username);
+ var personalized = await PageService.GetPageAsync(route.PagePath + "/" + path, site.SiteId);
if (personalized != null)
{
// redirect to the personalized page
diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs
index 03a602e0..97c303ac 100644
--- a/Oqtane.Server/Controllers/PageController.cs
+++ b/Oqtane.Server/Controllers/PageController.cs
@@ -9,7 +9,6 @@ using System.Net;
using Oqtane.Enums;
using Oqtane.Infrastructure;
using Oqtane.Repository;
-using System;
namespace Oqtane.Controllers
{
@@ -189,16 +188,16 @@ namespace Oqtane.Controllers
User user = _userPermissions.GetUser(User);
if (parent != null && parent.SiteId == _alias.SiteId && parent.IsPersonalizable && user.UserId == int.Parse(userid))
{
- var path = parent.Path + "/" + Utilities.GetFriendlyUrl(user.Username);
- page = _pages.GetPage(path, parent.SiteId);
+ var path = Utilities.GetFriendlyUrl(user.Username);
+ page = _pages.GetPage(parent.Path + "/" + path, parent.SiteId);
if (page == null)
{
page = new Page();
page.SiteId = parent.SiteId;
page.ParentId = parent.PageId;
- page.Name = (!string.IsNullOrEmpty(user.DisplayName)) ? user.DisplayName : user.Username;
- page.Path = path;
- page.Title = page.Name + " - " + parent.Name;
+ page.Name = user.Username;
+ page.Path = parent.Path + "/" + path;
+ page.Title = ((!string.IsNullOrEmpty(user.DisplayName)) ? user.DisplayName : user.Username) + " - " + parent.Name;
page.Order = 0;
page.IsNavigation = false;
page.Url = "";
@@ -251,6 +250,11 @@ namespace Oqtane.Controllers
_syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Create);
_syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
+
+ // set user personalized page path
+ var setting = new Setting { EntityName = EntityNames.User, EntityId = page.UserId.Value, SettingName = $"PersonalizedPagePath:{page.SiteId}:{parent.PageId}", SettingValue = path, IsPrivate = false };
+ _settings.AddSetting(setting);
+ _syncManager.AddSyncEvent(_alias, EntityNames.User, user.UserId, SyncEventActions.Update);
}
}
else
@@ -341,6 +345,28 @@ namespace Oqtane.Controllers
_syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Update);
_syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
+
+ // personalized page
+ if (page.UserId != null && currentPage.Path != page.Path)
+ {
+ // set user personalized page path
+ var settingName = $"PersonalizedPagePath:{page.SiteId}:{page.ParentId}";
+ var path = page.Path.Substring(page.Path.LastIndexOf("/") + 1);
+ var settings = _settings.GetSettings(EntityNames.User, page.UserId.Value).ToList();
+ var setting = settings.FirstOrDefault(item => item.SettingName == settingName);
+ if (setting == null)
+ {
+ setting = new Setting { EntityName = EntityNames.User, EntityId = page.UserId.Value, SettingName = settingName, SettingValue = path, IsPrivate = false };
+ _settings.AddSetting(setting);
+ }
+ else
+ {
+ setting.SettingValue = path;
+ _settings.UpdateSetting(setting);
+ }
+ _syncManager.AddSyncEvent(_alias, EntityNames.User, page.UserId.Value, SyncEventActions.Update);
+ }
+
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Page Updated {Page}", page);
}
else