diff --git a/Oqtane.Client/App.razor b/Oqtane.Client/App.razor deleted file mode 100644 index fa1d4e8d..00000000 --- a/Oqtane.Client/App.razor +++ /dev/null @@ -1,91 +0,0 @@ -@using Microsoft.AspNetCore.Http -@inject IInstallationService InstallationService -@inject IJSRuntime JSRuntime -@inject SiteState SiteState - -@if (_initialized) -{ - @if (!_installation.Success) - { - - } - else - { - @if (string.IsNullOrEmpty(_installation.Message)) - { -
- - - - - -
- } - else - { -
- @_installation.Message -
- } - } -} - -@code { - [Parameter] - public string AntiForgeryToken { get; set; } - - [Parameter] - public string Runtime { get; set; } - - [Parameter] - public string RenderMode { get; set; } - - [Parameter] - public int VisitorId { get; set; } - - [Parameter] - public string RemoteIPAddress { get; set; } - - [Parameter] - public string AuthorizationToken { get; set; } - - [CascadingParameter] - HttpContext HttpContext { get; set; } - - private bool _initialized = false; - private string _display = "display: none;"; - private Installation _installation = new Installation { Success = false, Message = "" }; - - private PageState PageState { get; set; } - - protected override async Task OnParametersSetAsync() - { - SiteState.RemoteIPAddress = RemoteIPAddress; - SiteState.AntiForgeryToken = AntiForgeryToken; - SiteState.AuthorizationToken = AuthorizationToken; - SiteState.IsPrerendering = (HttpContext != null) ? true : false; - - _installation = await InstallationService.IsInstalled(); - if (_installation.Alias != null) - { - SiteState.Alias = _installation.Alias; - } - _initialized = true; - } - - protected override void OnAfterRender(bool firstRender) - { - if (firstRender) - { - // prevents flash on initial page load - _display = ""; - StateHasChanged(); - } - } - - private void ChangeState(PageState pageState) - { - PageState = pageState; - StateHasChanged(); - } -} diff --git a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs index bc1d4780..7dcb2575 100644 --- a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs @@ -7,16 +7,17 @@ namespace Microsoft.Extensions.DependencyInjection { public static class OqtaneServiceCollectionExtensions { - public static IServiceCollection AddOqtaneAuthorization(this IServiceCollection services) + public static IServiceCollection AddOqtaneAuthentication(this IServiceCollection services) { services.AddAuthorizationCore(); + services.AddCascadingAuthenticationState(); services.AddScoped(); services.AddScoped(s => s.GetRequiredService()); return services; } - public static IServiceCollection AddOqtaneScopedServices(this IServiceCollection services) + public static IServiceCollection AddOqtaneClientScopedServices(this IServiceCollection services) { services.AddScoped(); services.AddScoped(); diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 7e223ca0..2ce996de 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -260,8 +260,10 @@ IsNewTenant = true, SiteName = Constants.DefaultSite, Register = _register, - SiteTemplate = _template - }; + SiteTemplate = _template, + RenderMode = RenderModes.Static, + Runtime = Runtimes.Server + }; var installation = await InstallationService.Install(config); if (installation.Success) diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index 69f3d9cb..9ca81674 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -12,12 +12,12 @@ if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.PermissionList)) { string url = NavigateUrl(p.Path); -

+

-

@((MarkupString)SharedLocalizer[p.Name].ToString().Replace(" ", "
"))

+
@((MarkupString)SharedLocalizer[p.Name].ToString().Replace(" ", "
"))
-

+
} } @@ -27,6 +27,7 @@ private List _pages; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; + public override string RenderMode => RenderModes.Static; protected override void OnInitialized() { diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index ee9fb6fe..bc5f5c60 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -17,7 +17,6 @@ else
-       @SharedLocalizer["Name"] @@ -28,7 +27,6 @@ else
- @context.Name @DisplayStatus(context.IsEnabled, context.IsExecuting) @@ -49,17 +47,17 @@ else } @code { - private List _jobs; + private List _jobs; public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } - - protected override async Task OnParametersSetAsync() - { - _jobs = await JobService.GetJobsAsync(); - if (_jobs.Count == 0) - { - AddModuleMessage(string.Format(Localizer["Message.NoJobs"], NavigateUrl("admin/system")), MessageType.Warning); - } + + protected override async Task OnInitializedAsync() + { + _jobs = await JobService.GetJobsAsync(); + if (_jobs.Count == 0) + { + AddModuleMessage(string.Format(Localizer["Message.NoJobs"], NavigateUrl("admin/system")), MessageType.Warning); + } } private string DisplayStatus(bool isEnabled, bool isExecuting) @@ -112,22 +110,6 @@ else return result; } - private async Task DeleteJob(Job job) - { - try - { - await JobService.DeleteJobAsync(job.JobId); - await logger.LogInformation("Job Deleted {Job}", job); - _jobs = await JobService.GetJobsAsync(); - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Deleting Job {Job} {Error}", job, ex.Message); - AddModuleMessage(Localizer["Error.Job.Delete"], MessageType.Error); - } - } - private async Task StartJob(int jobId) { try diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index b152a5d1..8ce6ea86 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -12,6 +12,9 @@ ... + + + @if (!twofactor) { @@ -47,8 +50,13 @@

- - } + + @if (PageState.Site.AllowRegistration) + { +

+ @Localizer["Register"] + } + } } @@ -84,8 +92,6 @@ private bool _alwaysremember = false; private string _code = string.Empty; - private string _returnUrl = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; public override List Resources => new List() @@ -103,11 +109,6 @@ _togglepassword = SharedLocalizer["ShowPassword"]; - if (PageState.QueryString.ContainsKey("returnurl")) - { - _returnUrl = PageState.QueryString["returnurl"]; - } - if (PageState.QueryString.ContainsKey("name")) { _username = PageState.QueryString["name"]; @@ -168,11 +169,14 @@ { if (firstRender && PageState.User == null && _allowsitelogin) { - await username.FocusAsync(); + if (!string.IsNullOrEmpty(username.Id)) // ensure username is visible in UI + { + await username.FocusAsync(); + } } // redirect logged in user to specified page - if (PageState.User != null) + if (PageState.User != null && !UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) { NavigationManager.NavigateTo(PageState.ReturnUrl); } @@ -208,12 +212,12 @@ // hybrid apps utilize an interactive login var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); + NavigationManager.NavigateTo(NavigateUrl(PageState.ReturnUrl, true)); } else { // post back to the Login page so that the cookies are set correctly - var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; + var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = WebUtility.UrlEncode(PageState.ReturnUrl) }; string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/"); await interop.SubmitForm(url, fields); } @@ -255,7 +259,7 @@ private void Cancel() { - NavigationManager.NavigateTo(_returnUrl); + NavigationManager.NavigateTo(PageState.ReturnUrl); } private async Task Forgot() @@ -323,7 +327,7 @@ private void ExternalLogin() { - NavigationManager.NavigateTo(Utilities.TenantUrl(PageState.Alias, "/pages/external?returnurl=" + _returnUrl), true); + NavigationManager.NavigateTo(Utilities.TenantUrl(PageState.Alias, "/pages/external?returnurl=" + WebUtility.UrlEncode(PageState.ReturnUrl)), true); } } diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor index b1ed379a..0031c729 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor @@ -120,7 +120,7 @@
- @SharedLocalizer["Cancel"] + @SharedLocalizer["Cancel"]

@@ -155,6 +155,7 @@ private DateTime modifiedon; private DateTime? _effectivedate = null; private DateTime? _expirydate = null; + protected override void OnInitialized() { _module = ModuleState.ModuleDefinition.Name; @@ -197,7 +198,8 @@ ModuleSettingsComponent = builder => { builder.OpenComponent(0, _moduleSettingsType); - builder.AddComponentReferenceCapture(1, inst => { _moduleSettings = Convert.ChangeType(inst, _moduleSettingsType); }); + builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); + builder.AddComponentReferenceCapture(2, inst => { _moduleSettings = Convert.ChangeType(inst, _moduleSettingsType); }); builder.CloseComponent(); }; } @@ -216,7 +218,8 @@ ContainerSettingsComponent = builder => { builder.OpenComponent(0, _containerSettingsType); - builder.AddComponentReferenceCapture(1, inst => { _containerSettings = Convert.ChangeType(inst, _containerSettingsType); }); + builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); + builder.AddComponentReferenceCapture(2, inst => { _containerSettings = Convert.ChangeType(inst, _containerSettingsType); }); builder.CloseComponent(); }; } @@ -280,7 +283,7 @@ await containerSettingsControl.UpdateSettings(); } - NavigationManager.NavigateTo(NavigateUrl()); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else { diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 05a97d7a..9009ba29 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -201,7 +201,7 @@ @if (_themeSettingsType != null) { - @ThemeSettingsComponent + @_themeSettingsComponent } @@ -240,7 +240,7 @@ private PermissionGrid _permissionGrid; private Type _themeSettingsType; private object _themeSettings; - private RenderFragment ThemeSettingsComponent { get; set; } + private RenderFragment _themeSettingsComponent { get; set; } private bool _refresh = false; protected Page _parent = null; protected Dictionary _icons; @@ -337,16 +337,18 @@ private void ThemeSettings() { _themeSettingsType = null; + _themeSettingsComponent = null; var theme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_themetype))); if (theme != null && !string.IsNullOrEmpty(theme.ThemeSettingsType)) { _themeSettingsType = Type.GetType(theme.ThemeSettingsType); if (_themeSettingsType != null) { - ThemeSettingsComponent = builder => + _themeSettingsComponent = builder => { builder.OpenComponent(0, _themeSettingsType); - builder.AddComponentReferenceCapture(1, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); + builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); + builder.AddComponentReferenceCapture(2, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); builder.CloseComponent(); }; } @@ -374,36 +376,54 @@ page.SiteId = PageState.Page.SiteId; page.Name = _name; - if (string.IsNullOrEmpty(_path)) - { - _path = _name; - } - if (_path.Contains("/")) - { - if (_path.EndsWith("/") && _path != "/") - { - _path = _path.Substring(0, _path.Length - 1); - } - _path = _path.Substring(_path.LastIndexOf("/") + 1); - } - if (_parentid == "-1") { page.ParentId = null; - page.Path = Utilities.GetFriendlyUrl(_path); } else { page.ParentId = Int32.Parse(_parentid); - var parent = PageState.Pages.Where(item => item.PageId == page.ParentId).FirstOrDefault(); - if (parent.Path == string.Empty) + } + + // path can be a link to an external url + if (!_path.Contains("://")) + { + if (string.IsNullOrEmpty(_path)) { - page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); + _path = _name; + } + + (_path, string parameters) = Utilities.ParsePath(_path); + + if (_path.Contains("/")) + { + if (_path.EndsWith("/") && _path != "/") + { + _path = _path.Substring(0, _path.Length - 1); + } + _path = _path.Substring(_path.LastIndexOf("/") + 1); + } + if (_parentid == "-1") + { + page.Path = Utilities.GetFriendlyUrl(_path); } else { - page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); + Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == page.ParentId); + if (parent.Path == string.Empty) + { + page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); + } + else + { + page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); + } } + page.Path += parameters; + } + else + { + page.Path = _path; } var _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); @@ -449,23 +469,23 @@ // appearance page.Title = _title; page.Icon = (_icon == null ? string.Empty : _icon); - page.ThemeType = _themetype; - if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) - { - page.ThemeType = string.Empty; - } - page.DefaultContainerType = _containertype; - if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) - { - page.DefaultContainerType = string.Empty; - } + page.ThemeType = _themetype; + if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) + { + page.ThemeType = string.Empty; + } + page.DefaultContainerType = _containertype; + if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) + { + page.DefaultContainerType = string.Empty; + } // page content page.HeadContent = _headcontent; page.BodyContent = _bodycontent; // permissions - page.PermissionList = _permissionGrid.GetPermissionList(); + page.PermissionList = _permissionGrid.GetPermissionList(); page = await PageService.AddPageAsync(page); await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId); @@ -473,11 +493,18 @@ await logger.LogInformation("Page Added {Page}", page); if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(page.Path); // redirect to new page + NavigationManager.NavigateTo(PageState.ReturnUrl, true); } else { - NavigationManager.NavigateTo(NavigateUrl()); // redirect to page management + if (!page.Path.Contains("://")) + { + NavigationManager.NavigateTo(page.Path); // redirect to new page created + } + else + { + NavigationManager.NavigateTo(NavigateUrl("admin/pages")); + } } } else diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 3084ef84..46ba727b 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -179,9 +179,12 @@
@@ -234,7 +237,7 @@ @if (_themeSettingsType != null) { - @ThemeSettingsComponent + @_themeSettingsComponent
} @@ -278,7 +281,7 @@ @if (_themeSettingsType != null) { - @ThemeSettingsComponent + @_themeSettingsComponent
} @@ -317,7 +320,7 @@ private string _containertype = "-"; private Type _themeSettingsType; private object _themeSettings; - private RenderFragment ThemeSettingsComponent { get; set; } + private RenderFragment _themeSettingsComponent { get; set; } private string _headcontent; private string _bodycontent; private List _permissions = null; @@ -377,7 +380,7 @@ } else { - if (_path.Contains("/")) + if (_path.Contains("/") & !_path.Contains("://")) { _path = _path.Substring(_path.LastIndexOf("/") + 1); } @@ -467,7 +470,7 @@ _containertype = _containers.First().TypeName; ThemeSettings(); StateHasChanged(); - + // if theme chosen is different than default site theme, display warning message to user if (ThemeService.GetTheme(PageState.Site.Themes, _themetype)?.ThemeName != ThemeService.GetTheme(PageState.Site.Themes, PageState.Site.DefaultThemeType)?.ThemeName) { @@ -478,16 +481,19 @@ private void ThemeSettings() { _themeSettingsType = null; + _themeSettingsComponent = null; var theme = PageState.Site.Themes.FirstOrDefault(item => item.Themes.Any(themecontrol => themecontrol.TypeName.Equals(_themetype))); if (theme != null && !string.IsNullOrEmpty(theme.ThemeSettingsType)) { _themeSettingsType = Type.GetType(theme.ThemeSettingsType); if (_themeSettingsType != null) { - ThemeSettingsComponent = builder => + _themeSettingsComponent = builder => { builder.OpenComponent(0, _themeSettingsType); - builder.AddComponentReferenceCapture(1, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); + builder.AddAttribute(1, "RenderModeBoundary", RenderModeBoundary); + builder.AddComponentReferenceCapture(2, inst => { _themeSettings = Convert.ChangeType(inst, _themeSettingsType); }); + builder.CloseComponent(); }; } @@ -514,36 +520,54 @@ _page.Name = _name; - if (string.IsNullOrEmpty(_path)) - { - _path = _name; - } - if (_path.Contains("/")) - { - if (_path.EndsWith("/") && _path != "/") - { - _path = _path.Substring(0, _path.Length - 1); - } - _path = _path.Substring(_path.LastIndexOf("/") + 1); - } - if (_parentid == "-1") { _page.ParentId = null; - _page.Path = Utilities.GetFriendlyUrl(_path); } else { _page.ParentId = Int32.Parse(_parentid); - Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); - if (parent.Path == string.Empty) + } + + // path can be a link to an external url + if (!_path.Contains("://")) + { + if (string.IsNullOrEmpty(_path)) { - _page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); + _path = _name; + } + + (_path, string parameters) = Utilities.ParsePath(_path); + + if (_path.Contains("/")) + { + if (_path.EndsWith("/") && _path != "/") + { + _path = _path.Substring(0, _path.Length - 1); + } + _path = _path.Substring(_path.LastIndexOf("/") + 1); + } + if (_parentid == "-1") + { + _page.Path = Utilities.GetFriendlyUrl(_path); } else { - _page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); + Page parent = PageState.Pages.FirstOrDefault(item => item.PageId == _page.ParentId); + if (parent.Path == string.Empty) + { + _page.Path = Utilities.GetFriendlyUrl(parent.Name) + "/" + Utilities.GetFriendlyUrl(_path); + } + else + { + _page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); + } } + _page.Path += parameters; + } + else + { + _page.Path = _path; } var _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); @@ -630,11 +654,18 @@ await logger.LogInformation("Page Saved {Page}", _page); if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(PageState.ReturnUrl); + NavigationManager.NavigateTo(PageState.ReturnUrl, true); } else { - NavigationManager.NavigateTo(NavigateUrl()); + if (!_page.Path.Contains("://")) + { + NavigationManager.NavigateTo(NavigateUrl(), true); // redirect to page being edited + } + else + { + NavigationManager.NavigateTo(NavigateUrl("admin/pages")); + } } } else diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index 1d88dcf8..91cf3669 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -140,7 +140,7 @@ else { try { - ModuleInstance.ShowProgressIndicator(); + ShowProgressIndicator(); foreach (Page page in _pages.Where(item => item.IsDeleted)) { await PageService.DeletePageAsync(page.PageId); @@ -149,7 +149,7 @@ else await logger.LogInformation("Pages Permanently Deleted"); await Load(); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); StateHasChanged(); NavigationManager.NavigateTo(NavigateUrl()); } @@ -157,7 +157,7 @@ else { await logger.LogError(ex, "Error Permanently Deleting Pages {Error}", ex.Message); AddModuleMessage(ex.Message, MessageType.Error); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); } } @@ -199,21 +199,21 @@ else { try { - ModuleInstance.ShowProgressIndicator(); + ShowProgressIndicator(); foreach (Module module in _modules.Where(item => item.IsDeleted).ToList()) { await PageModuleService.DeletePageModuleAsync(module.PageModuleId); } await logger.LogInformation("Modules Permanently Deleted"); await Load(); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Permanently Deleting Modules {Error}", ex.Message); AddModuleMessage(Localizer["Error.Modules.Delete"], MessageType.Error); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); } } private void OnPageChangePage(int page) diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index b7c80851..1239a512 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -9,60 +9,68 @@ @if (PageState.Site.AllowRegistration) { - - - ... - - - - - - -
-
-
- -
- + if (!_userCreated) + { + + + ... + + + + + + + +
+
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
-
- -
-
- - -
-
-
-
- -
-
- - -
-
-
-
- -
- -
-
-
- -
- -
-
-
-
- - - - - +
+ + + @if (_allowsitelogin) + { +

+ @Localizer["Login"] + } + + + + } } else { @@ -80,12 +88,15 @@ else private string _confirm = string.Empty; private string _email = string.Empty; private string _displayname = string.Empty; + private bool _userCreated = false; + private bool _allowsitelogin = true; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; protected override async Task OnInitializedAsync() { - _passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId); + _passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId); + _allowsitelogin = bool.Parse(SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:AllowSiteLogin", "true")); } protected override void OnParametersSet() @@ -121,14 +132,8 @@ else if (user != null) { await logger.LogInformation("User Created {Username} {Email}", _username, _email); - if (PageState.QueryString.ContainsKey("returnurl")) - { - NavigationManager.NavigateTo(WebUtility.UrlDecode(PageState.QueryString["returnurl"])); - } - else // legacy behavior - { - AddModuleMessage(Localizer["Info.User.AccountCreate"], MessageType.Info); - } + _userCreated = true; + AddModuleMessage(Localizer["Info.User.AccountCreate"], MessageType.Info); } else { @@ -160,7 +165,7 @@ else private void Cancel() { - NavigationManager.NavigateTo(NavigateUrl(string.Empty)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } private void TogglePassword() diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 01a6bba3..56df0b3e 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -98,9 +98,12 @@
@@ -110,9 +113,12 @@
@@ -311,27 +317,38 @@
- + +
+ +
+
+
+
- +
- +
- @@ -414,9 +431,10 @@ private int _aliasid = -1; private string _aliasname; private string _defaultalias; - private string _runtime = ""; - private string _prerender = ""; - private string _hybridenabled = ""; + private string _rendermode = RenderModes.Interactive; + private string _runtime = Runtimes.Server; + private string _prerender = "True"; + private string _hybrid = "False"; private string _tenant = string.Empty; private string _database = string.Empty; private string _connectionstring = string.Empty; @@ -500,9 +518,10 @@ await GetAliases(); // hosting model + _rendermode = site.RenderMode; _runtime = site.Runtime; - _prerender = site.RenderMode.Replace(_runtime, ""); - _hybridenabled = site.HybridEnabled.ToString(); + _prerender = site.Prerender.ToString(); + _hybrid = site.Hybrid.ToString(); // database if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) @@ -566,9 +585,6 @@ var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); if (site != null) { - bool refresh = false; - bool reload = false; - site.Name = _name; site.HomePageId = (_homepageid != "-" ? int.Parse(_homepageid) : null); site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); @@ -582,7 +598,6 @@ if (logofileid != _logofileid) { _logofileid = logofileid; - refresh = true; // needs to be refreshed on client } } int? faviconFieldId = _faviconfilemanager.GetFileId(); @@ -590,17 +605,14 @@ if (site.FaviconFileId != faviconFieldId) { site.FaviconFileId = faviconFieldId; - reload = true; // needs to be reloaded on server } if (site.DefaultThemeType != _themetype) { site.DefaultThemeType = _themetype; - refresh = true; // needs to be refreshed on client } if (site.DefaultContainerType != _containertype) { site.DefaultContainerType = _containertype; - refresh = true; // needs to be refreshed on client } site.AdminContainerType = _admincontainertype; @@ -608,44 +620,39 @@ if (site.HeadContent != _headcontent) { site.HeadContent = _headcontent; - reload = true; } if (site.BodyContent != _bodycontent) { site.BodyContent = _bodycontent; - reload = true; } // PWA if (site.PwaIsEnabled.ToString() != _pwaisenabled) { site.PwaIsEnabled = Boolean.Parse(_pwaisenabled); - reload = true; // needs to be reloaded on server } int? pwaappiconfileid = _pwaappiconfilemanager.GetFileId(); if (pwaappiconfileid == -1) pwaappiconfileid = null; if (site.PwaAppIconFileId != pwaappiconfileid) { site.PwaAppIconFileId = pwaappiconfileid; - reload = true; // needs to be reloaded on server } int? pwasplashiconfileid = _pwasplashiconfilemanager.GetFileId(); if (pwasplashiconfileid == -1) pwasplashiconfileid = null; if (site.PwaSplashIconFileId != pwasplashiconfileid) { site.PwaSplashIconFileId = pwasplashiconfileid; - reload = true; // needs to be reloaded on server } // hosting model if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { - if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender || site.HybridEnabled != bool.Parse(_hybridenabled)) + if (site.RenderMode != _rendermode || site.Runtime != _runtime || site.Prerender != bool.Parse(_prerender) || site.Hybrid != bool.Parse(_hybrid)) { + site.RenderMode = _rendermode; site.Runtime = _runtime; - site.RenderMode = _runtime + _prerender; - site.HybridEnabled = bool.Parse(_hybridenabled); - reload = true; // needs to be reloaded on serve + site.Prerender = bool.Parse(_prerender); + site.Hybrid = bool.Parse(_hybrid); } } @@ -672,15 +679,7 @@ await logger.LogInformation("Site Settings Saved {Site}", site); - if (refresh || reload) - { - NavigationManager.NavigateTo(NavigateUrl(true), reload); // refresh/reload - } - else - { - AddModuleMessage(Localizer["Success.Settings.SaveSite"], MessageType.Success); - await ScrollToPageTop(); - } + NavigationManager.NavigateTo(NavigateUrl(), true); // reload } } else diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 2471ed63..300aafcb 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -71,20 +71,22 @@ else
- +
- +
- +
- + + +
@@ -201,8 +203,8 @@ else private string _themetype = "-"; private string _containertype = "-"; private string _sitetemplatetype = "-"; - private string _runtime = "Server"; - private string _prerender = "Prerendered"; + private string _rendermode = RenderModes.Static; + private string _runtime = Runtimes.Server; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -228,137 +230,137 @@ else _sitetemplatetype = Constants.DefaultSiteTemplate; } - _databases = await DatabaseService.GetDatabasesAsync(); - if (_databases.Exists(item => item.IsDefault)) - { - _databaseName = _databases.Find(item => item.IsDefault).Name; - } - else - { - _databaseName = "LocalDB"; - } - LoadDatabaseConfigComponent(); - } + _databases = await DatabaseService.GetDatabasesAsync(); + if (_databases.Exists(item => item.IsDefault)) + { + _databaseName = _databases.Find(item => item.IsDefault).Name; + } + else + { + _databaseName = "LocalDB"; + } + LoadDatabaseConfigComponent(); + } - private void DatabaseChanged(ChangeEventArgs eventArgs) - { - try - { - _databaseName = (string)eventArgs.Value; - _showConnectionString = false; - LoadDatabaseConfigComponent(); - } - catch - { - AddModuleMessage(Localizer["Error.Database.LoadConfig"], MessageType.Error); - } - } + private void DatabaseChanged(ChangeEventArgs eventArgs) + { + try + { + _databaseName = (string)eventArgs.Value; + _showConnectionString = false; + LoadDatabaseConfigComponent(); + } + catch + { + AddModuleMessage(Localizer["Error.Database.LoadConfig"], MessageType.Error); + } + } - private void LoadDatabaseConfigComponent() - { - var database = _databases.SingleOrDefault(d => d.Name == _databaseName); - if (database != null) - { - _databaseConfigType = Type.GetType(database.ControlType); - DatabaseConfigComponent = builder => - { - builder.OpenComponent(0, _databaseConfigType); - builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); }); - builder.CloseComponent(); - }; - } - } + private void LoadDatabaseConfigComponent() + { + var database = _databases.SingleOrDefault(d => d.Name == _databaseName); + if (database != null) + { + _databaseConfigType = Type.GetType(database.ControlType); + DatabaseConfigComponent = builder => + { + builder.OpenComponent(0, _databaseConfigType); + builder.AddComponentReferenceCapture(1, inst => { _databaseConfig = Convert.ChangeType(inst, _databaseConfigType); }); + builder.CloseComponent(); + }; + } + } - private void TenantChanged(ChangeEventArgs e) - { - _tenantid = (string)e.Value; - if (string.IsNullOrEmpty(_tenantName)) - { - _tenantName = _name; - } - StateHasChanged(); - } + private void TenantChanged(ChangeEventArgs e) + { + _tenantid = (string)e.Value; + if (string.IsNullOrEmpty(_tenantName)) + { + _tenantName = _name; + } + StateHasChanged(); + } - private async void ThemeChanged(ChangeEventArgs e) - { - try - { - _themetype = (string)e.Value; - if (_themetype != "-") - { - _containers = ThemeService.GetContainerControls(_themeList, _themetype); + private async void ThemeChanged(ChangeEventArgs e) + { + try + { + _themetype = (string)e.Value; + if (_themetype != "-") + { + _containers = ThemeService.GetContainerControls(_themeList, _themetype); _containertype = _containers.First().TypeName; } - else - { - _containers = new List(); + else + { + _containers = new List(); _containertype = "-"; } - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage(Localizer["Error.Theme.LoadContainers"], MessageType.Error); - } - } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message); + AddModuleMessage(Localizer["Error.Theme.LoadContainers"], MessageType.Error); + } + } - private async Task SaveSite() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - if (_tenantid != "-" && _name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-" && _sitetemplatetype != "-") - { - _urls = Regex.Replace(_urls, @"\r\n?|\n", ","); - var duplicates = new List(); - var aliases = await AliasService.GetAliasesAsync(); - foreach (string name in _urls.Split(',', StringSplitOptions.RemoveEmptyEntries)) - { - if (aliases.Exists(item => item.Name == name)) - { - duplicates.Add(name); - } - } + private async Task SaveSite() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + if (_tenantid != "-" && _name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-" && _sitetemplatetype != "-") + { + _urls = Regex.Replace(_urls, @"\r\n?|\n", ","); + var duplicates = new List(); + var aliases = await AliasService.GetAliasesAsync(); + foreach (string name in _urls.Split(',', StringSplitOptions.RemoveEmptyEntries)) + { + if (aliases.Exists(item => item.Name == name)) + { + duplicates.Add(name); + } + } - if (duplicates.Count == 0) - { - InstallConfig config = new InstallConfig(); + if (duplicates.Count == 0) + { + InstallConfig config = new InstallConfig(); - if (_tenantid == "+") - { - if (!string.IsNullOrEmpty(_tenantName) && !_tenants.Exists(item => item.Name == _tenantName)) - { - // validate host credentials - var user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = _hostusername; - user.Password = _hostpassword; - user.LastIPAddress = PageState.RemoteIPAddress; - user = await UserService.LoginUserAsync(user, false, false); + if (_tenantid == "+") + { + if (!string.IsNullOrEmpty(_tenantName) && !_tenants.Exists(item => item.Name == _tenantName)) + { + // validate host credentials + var user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = _hostusername; + user.Password = _hostpassword; + user.LastIPAddress = PageState.RemoteIPAddress; + user = await UserService.LoginUserAsync(user, false, false); if (user.IsAuthenticated) { - var database = _databases.SingleOrDefault(d => d.Name == _databaseName); - var connectionString = String.Empty; - if (_showConnectionString) - { - connectionString = _connectionString; - } - else - { - if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) - { - connectionString = databaseConfigControl.GetConnectionString(); - } - } + var database = _databases.SingleOrDefault(d => d.Name == _databaseName); + var connectionString = String.Empty; + if (_showConnectionString) + { + connectionString = _connectionString; + } + else + { + if (_databaseConfig is IDatabaseConfigControl databaseConfigControl) + { + connectionString = databaseConfigControl.GetConnectionString(); + } + } if (connectionString != "") { config.TenantName = _tenantName; config.DatabaseType = database.DBType; config.ConnectionString = connectionString; - config.HostUsername = _hostusername; + config.HostUsername = _hostusername; config.HostPassword = _hostpassword; config.HostEmail = user.Email; config.HostName = user.DisplayName; @@ -399,8 +401,8 @@ else config.DefaultContainer = _containertype; config.DefaultAdminContainer = ""; config.SiteTemplate = _sitetemplatetype; + config.RenderMode = _rendermode; config.Runtime = _runtime; - config.RenderMode = _runtime + _prerender; ShowProgressIndicator(); diff --git a/Oqtane.Client/Modules/Admin/Sites/Index.razor b/Oqtane.Client/Modules/Admin/Sites/Index.razor index 58f281a5..541deed5 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Index.razor @@ -62,7 +62,7 @@ else { if (PageState.Alias.Name == name) { - NavigationManager.NavigateTo("/"); + NavigationManager.NavigateTo(PageState.Alias.Path + "/"); } else { diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 0f5dad7b..c67f3305 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -483,9 +483,9 @@ await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); await logger.LogInformation("User Profile Saved"); - if (PageState.QueryString.ContainsKey("returnurl")) + if (!string.IsNullOrEmpty(PageState.ReturnUrl)) { - NavigationManager.NavigateTo(WebUtility.UrlDecode(PageState.QueryString["returnurl"])); + NavigationManager.NavigateTo(PageState.ReturnUrl); } else // legacy behavior { @@ -551,7 +551,7 @@ private void Cancel() { - NavigationManager.NavigateTo(NavigateUrl(string.Empty)); + NavigationManager.NavigateTo(PageState.ReturnUrl); } private void ProfileChanged(ChangeEventArgs e, string SettingName) @@ -596,7 +596,7 @@ { try { - ModuleInstance.ShowProgressIndicator(); + ShowProgressIndicator(); foreach(var Notification in notifications) { if (!Notification.IsDeleted) @@ -612,7 +612,7 @@ } await logger.LogInformation("Notifications Permanently Deleted"); await LoadNotificationsAsync(); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); StateHasChanged(); } @@ -620,7 +620,7 @@ { await logger.LogError(ex, "Error Deleting Notifications {Error}", ex.Message); AddModuleMessage(ex.Message, MessageType.Error); - ModuleInstance.HideProgressIndicator(); + HideProgressIndicator(); } } diff --git a/Oqtane.Client/Modules/Controls/ActionDialog.razor b/Oqtane.Client/Modules/Controls/ActionDialog.razor index 9cb5fd7f..f21d5a64 100644 --- a/Oqtane.Client/Modules/Controls/ActionDialog.razor +++ b/Oqtane.Client/Modules/Controls/ActionDialog.razor @@ -2,47 +2,102 @@ @using System.Text.Json @inherits LocalizableComponent @inject IStringLocalizer SharedLocalizer +@inject NavigationManager NavigationManager -@if (_visible) +@if (PageState.RenderMode == RenderModes.Interactive || ModuleState.RenderMode == RenderModes.Interactive) { -
-