From fc6a7947149d498ceab3f22d93e3f90f86872385 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 12 Aug 2022 10:43:00 -0400 Subject: [PATCH] add support for preserving state when loading admin components --- Oqtane.Client/Modules/Admin/Logs/Detail.razor | 9 +-------- Oqtane.Client/Modules/Admin/Logs/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Visitors/Detail.razor | 9 +-------- Oqtane.Client/Modules/Admin/Visitors/Index.razor | 2 +- Oqtane.Client/Modules/Controls/ActionLink.razor | 12 ++++++++++-- Oqtane.Client/Themes/AdminContainer.razor | 6 +++--- Oqtane.Client/UI/PageState.cs | 3 ++- Oqtane.Client/UI/SiteRouter.razor | 9 ++++++++- 8 files changed, 27 insertions(+), 25 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Logs/Detail.razor b/Oqtane.Client/Modules/Admin/Logs/Detail.razor index 1953a72d..7df9838f 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Detail.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Detail.razor @@ -191,13 +191,6 @@ private string CloseUrl() { - if (!PageState.QueryString.ContainsKey("level")) - { - return NavigateUrl(); - } - else - { - return NavigateUrl(PageState.Page.Path, "level=" + PageState.QueryString["level"] + "&function=" + PageState.QueryString["function"] + "&rows=" + PageState.QueryString["rows"] + "&page=" + PageState.QueryString["page"]); - } + return (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl(); } } diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index d2af52a0..e8ed4717 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -63,7 +63,7 @@ else @Localizer["Function"] - + @context.LogDate @context.Level @context.Feature diff --git a/Oqtane.Client/Modules/Admin/Visitors/Detail.razor b/Oqtane.Client/Modules/Admin/Visitors/Detail.razor index 3078eb1b..e0570431 100644 --- a/Oqtane.Client/Modules/Admin/Visitors/Detail.razor +++ b/Oqtane.Client/Modules/Admin/Visitors/Detail.razor @@ -128,13 +128,6 @@ private string CloseUrl() { - if (!PageState.QueryString.ContainsKey("type")) - { - return NavigateUrl(); - } - else - { - return NavigateUrl(PageState.Page.Path, "type=" + PageState.QueryString["type"] + "&days=" + PageState.QueryString["days"] + "&page=" + PageState.QueryString["page"]); - } + return (!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl(); } } diff --git a/Oqtane.Client/Modules/Admin/Visitors/Index.razor b/Oqtane.Client/Modules/Admin/Visitors/Index.razor index 11deb70f..59e5739c 100644 --- a/Oqtane.Client/Modules/Admin/Visitors/Index.razor +++ b/Oqtane.Client/Modules/Admin/Visitors/Index.razor @@ -43,7 +43,7 @@ else @Localizer["Created"] - + @context.IPAddress @if (context.UserId != null) diff --git a/Oqtane.Client/Modules/Controls/ActionLink.razor b/Oqtane.Client/Modules/Controls/ActionLink.razor index 0ba0dfbe..a74c0d8a 100644 --- a/Oqtane.Client/Modules/Controls/ActionLink.razor +++ b/Oqtane.Client/Modules/Controls/ActionLink.razor @@ -1,4 +1,5 @@ @namespace Oqtane.Modules.Controls +@using System.Net @inherits LocalizableComponent @inject IUserService UserService @@ -71,6 +72,9 @@ [Parameter] public bool IconOnly { get; set; } // optional - specifies only icon in link + [Parameter] + public string ReturnUrl { get; set; } // optional - used to set a url to redirect to + protected override void OnParametersSet() { base.OnParametersSet(); @@ -116,8 +120,12 @@ } _permissions = (string.IsNullOrEmpty(Permissions)) ? ModuleState.Permissions : Permissions; - _text = Localize(nameof(Text), _text); - _url = (ModuleId == -1) ? EditUrl(Action, _parameters) : EditUrl(ModuleId, Action, _parameters); + _text = Localize(nameof(Text), _text); + if (!string.IsNullOrEmpty(ReturnUrl)) + { + _parameters += ((!string.IsNullOrEmpty(_parameters)) ? "&" : "") + $"returnurl={WebUtility.UrlEncode(ReturnUrl)}"; + } + _url = (ModuleId == -1) ? EditUrl(Action, _parameters) : EditUrl(ModuleId, Action, _parameters); _authorized = IsAuthorized(); } diff --git a/Oqtane.Client/Themes/AdminContainer.razor b/Oqtane.Client/Themes/AdminContainer.razor index 1999a970..7dfbbee1 100644 --- a/Oqtane.Client/Themes/AdminContainer.razor +++ b/Oqtane.Client/Themes/AdminContainer.razor @@ -19,9 +19,9 @@ @code { - private void CloseModal() - { - NavigationManager.NavigateTo(NavigateUrl()); + private void CloseModal() + { + NavigationManager.NavigateTo((!string.IsNullOrEmpty(PageState.ReturnUrl)) ? PageState.ReturnUrl : NavigateUrl()); } } diff --git a/Oqtane.Client/UI/PageState.cs b/Oqtane.Client/UI/PageState.cs index 46eacd49..a4316e85 100644 --- a/Oqtane.Client/UI/PageState.cs +++ b/Oqtane.Client/UI/PageState.cs @@ -20,8 +20,9 @@ namespace Oqtane.UI public string Action { get; set; } public bool EditMode { get; set; } public DateTime LastSyncDate { get; set; } - public Oqtane.Shared.Runtime Runtime { get; set; } + public Shared.Runtime Runtime { get; set; } public int VisitorId { get; set; } public string RemoteIPAddress { get; set; } + public string ReturnUrl { get; set; } } } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 8d75dc4f..c3e5dc28 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -1,4 +1,5 @@ @using System.Diagnostics.CodeAnalysis +@using System.Net @namespace Oqtane.UI @inject AuthenticationStateProvider AuthenticationStateProvider @inject SiteState SiteState @@ -85,6 +86,11 @@ int moduleid = (int.TryParse(route.ModuleId, out moduleid)) ? moduleid : -1; var action = (!string.IsNullOrEmpty(route.Action)) ? route.Action : Constants.DefaultAction; var querystring = ParseQueryString(route.Query); + var returnurl = ""; + if (querystring.ContainsKey("returnurl")) + { + returnurl = WebUtility.UrlDecode(querystring["returnurl"]); + } // reload the client application from the server if there is a forced reload or the user navigated to a site with a different alias if (querystring.ContainsKey("reload") || (!NavigationManager.ToBaseRelativePath(_absoluteUri).ToLower().StartsWith(SiteState.Alias.Path.ToLower()) && !string.IsNullOrEmpty(SiteState.Alias.Path))) @@ -248,7 +254,8 @@ LastSyncDate = lastsyncdate, Runtime = runtime, VisitorId = VisitorId, - RemoteIPAddress = SiteState.RemoteIPAddress + RemoteIPAddress = SiteState.RemoteIPAddress, + ReturnUrl = returnurl }; OnStateChange?.Invoke(_pagestate);