diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index 21a8ba45..dec46b42 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -2,6 +2,7 @@ @inherits ThemeControlBase @inject NavigationManager NavigationManager @inject IPageService PageService +@inject ISettingService SettingService @if (ShowLanguageSwitcher) { @@ -99,7 +100,7 @@ return false; } - private async Task ToggleEditMode(bool EditMode) + private async Task ToggleEditMode(bool editMode) { Page page = null; if (PageState.Page.IsPersonalizable && PageState.User != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Registered)) @@ -109,13 +110,18 @@ if (_showEditMode) { - if (EditMode) + PageState.EditMode = !editMode; + + if(PageState.User != null) //keep edit mode for authenticated users. { - PageState.EditMode = false; - } - else - { - PageState.EditMode = true; + + var viewMode = PageState.EditMode ? ViewMode.Edit.ToString() : ViewMode.View.ToString(); + var userSettings = new Dictionary + { + { UserSetting.ViewMode, viewMode } + }; + + await SettingService.UpdateUserSettingsAsync(userSettings, PageState.User.UserId); } // preserve other querystring parameters diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 4ee12dd1..ba1113dd 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -1,5 +1,6 @@ @using System.Diagnostics.CodeAnalysis @using System.Net +@using Microsoft.AspNetCore.Http @namespace Oqtane.UI @inject AuthenticationStateProvider AuthenticationStateProvider @inject SiteState SiteState @@ -11,7 +12,9 @@ @inject IUserService UserService @inject IUrlMappingService UrlMappingService @inject ILogService LogService +@inject ISettingService SettingService @inject IJSRuntime JSRuntime +@inject IHttpContextAccessor HttpContextAccessor @implements IHandleAfterRender @implements IDisposable @@ -27,7 +30,8 @@ private bool _isInternalNavigation = false; private bool _navigationInterceptionEnabled; private PageState _pagestate; - private string _error = ""; + private string _error = ""; + private bool _pageChanged; [Parameter] public string RenderMode { get; set; } @@ -58,6 +62,17 @@ }; } + protected override async Task OnInitializedAsync() + { + var route = new Route(_absoluteUri, SiteState.Alias.Path); + var lastViewPage = HttpContextAccessor.HttpContext.Request.Cookies[UserSetting.LastViewPage] ?? string.Empty; + if (lastViewPage != route.PagePath) + { + HttpContextAccessor.HttpContext.Response.Cookies.Append(UserSetting.LastViewPage, route.PagePath); + _pageChanged = true; + } + } + public void Dispose() { NavigationManager.LocationChanged -= LocationChanged; @@ -142,21 +157,6 @@ refresh = true; } - if (PageState != null) - { - editmode = PageState.EditMode; - lastsyncdate = PageState.LastSyncDate; - visitorId = PageState.VisitorId; - } - if (PageState?.Page.Path != route.PagePath) - { - editmode = false; // reset edit mode when navigating to different page - } - if (querystring.ContainsKey("edit") && querystring["edit"] == "true") - { - editmode = true; // querystring can set edit mode - } - // verify user is authenticated for current site var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (authState.User.Identity.IsAuthenticated && authState.User.Claims.Any(item => item.Type == "sitekey" && item.Value == SiteState.Alias.SiteKey)) @@ -170,12 +170,52 @@ user.IsAuthenticated = authState.User.Identity.IsAuthenticated; } } - else + else { user = PageState.User; } } + if (PageState != null) + { + editmode = PageState.EditMode; + lastsyncdate = PageState.LastSyncDate; + visitorId = PageState.VisitorId; + } + + + if (PageState?.Page.Path != route.PagePath || _pageChanged) + { + editmode = false; // reset edit mode when navigating to different page + + if (user != null) //keep edit mode for authenticated users. + { + var userSettings = new Dictionary + { + { UserSetting.ViewMode, ViewMode.View.ToString() } + }; + + await SettingService.UpdateUserSettingsAsync(userSettings, user.UserId); + } + } + else + { + if (querystring.ContainsKey("edit") && querystring["edit"] == "true") + { + editmode = true; // querystring can set edit mode + } + + //check edit mode for authenticated users. + if (!editmode && user != null) + { + Enum.TryParse(user.Settings.GetValueOrDefault(UserSetting.ViewMode, ViewMode.View.ToString()), true, out ViewMode viewMode); + if (viewMode == ViewMode.Edit) + { + editmode = true; + } + } + } + // process any sync events var sync = await SyncService.GetSyncEventsAsync(lastsyncdate); lastsyncdate = sync.SyncDate; diff --git a/Oqtane.Shared/Enums/ViewMode.cs b/Oqtane.Shared/Enums/ViewMode.cs new file mode 100644 index 00000000..bc8e1f2f --- /dev/null +++ b/Oqtane.Shared/Enums/ViewMode.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Oqtane.Enums +{ + public enum ViewMode + { + View, + Edit + } +} diff --git a/Oqtane.Shared/Models/UserSetting.cs b/Oqtane.Shared/Models/UserSetting.cs new file mode 100644 index 00000000..737fe6a7 --- /dev/null +++ b/Oqtane.Shared/Models/UserSetting.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Oqtane.Models +{ + public class UserSetting + { + public const string ViewMode = "Page:ViewMode"; + + public const string LastViewPage = "LastViewed"; + } +}