diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 7e223ca0..2cbc4d44 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -260,7 +260,8 @@ IsNewTenant = true, SiteName = Constants.DefaultSite, Register = _register, - SiteTemplate = _template + SiteTemplate = _template, + RenderMode = RenderModes.InteractiveServer }; var installation = await InstallationService.Install(config); diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 01a6bba3..ca8edc1c 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -311,27 +311,32 @@
- +
- + + + +
-
- -
- + @if (_rendermode != "Static") + { +
+ +
+ +
-
+ }
- +
- @@ -414,9 +419,9 @@ private int _aliasid = -1; private string _aliasname; private string _defaultalias; - private string _runtime = ""; - private string _prerender = ""; - private string _hybridenabled = ""; + private string _rendermode = RenderModes.InteractiveServer; + 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 +505,9 @@ await GetAliases(); // hosting model - _runtime = site.Runtime; - _prerender = site.RenderMode.Replace(_runtime, ""); - _hybridenabled = site.HybridEnabled.ToString(); + _rendermode = site.RenderMode; + _prerender = site.Prerender.ToString(); + _hybrid = site.Hybrid.ToString(); // database if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) @@ -640,11 +645,11 @@ // 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.Prerender != bool.Parse(_prerender) || site.Hybrid != bool.Parse(_hybrid)) { - site.Runtime = _runtime; - site.RenderMode = _runtime + _prerender; - site.HybridEnabled = bool.Parse(_hybridenabled); + site.RenderMode = _rendermode; + site.Prerender = bool.Parse(_prerender); + site.Hybrid = bool.Parse(_hybrid); reload = true; // needs to be reloaded on serve } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 2471ed63..889b496f 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -71,20 +71,13 @@ else
- +
- -
-
-
- -
- + + + +
@@ -201,8 +194,7 @@ else private string _themetype = "-"; private string _containertype = "-"; private string _sitetemplatetype = "-"; - private string _runtime = "Server"; - private string _prerender = "Prerendered"; + private string _rendermode = RenderModes.InteractiveServer; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; @@ -399,8 +391,7 @@ else config.DefaultContainer = _containertype; config.DefaultAdminContainer = ""; config.SiteTemplate = _sitetemplatetype; - config.Runtime = _runtime; - config.RenderMode = _runtime + _prerender; + config.RenderMode = _rendermode; ShowProgressIndicator(); diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 8d8efaf8..65a918e7 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -277,16 +277,16 @@ Hosting Model - Specifies if the site should be prerendered (for search crawlers, etc...) + Specifies if the site supports prerendering Prerender? - - The Blazor runtime hosting model for the site + + The default render mode for the site - - Runtime: + + Render Mode: Browse diff --git a/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx index fed4bd6a..903dc147 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Sites/Add.resx @@ -223,16 +223,16 @@ Error loading Database Configuration Control - Specifies if the site should be prerendered (for search crawlers, etc...) + Specifies if the site supports prerendering Prerender? - - The Blazor runtime hosting model + + The default render mode for the site - - Runtime: + + Render Mode: Enter a complete connection string including all parameters and delimiters diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index 6152a066..464732c4 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -312,14 +312,14 @@ Not Specified - - Blazor Server + + Interactive Server Rendering - - Blazor WebAssembly + + Interactive WebAssembly Rendering - - Blazor Hybrid + + Static Server Rendering Settings @@ -441,4 +441,7 @@ Effective Date cannot be after Expiry Date. + + Interactive Auto Rendering + \ No newline at end of file diff --git a/Oqtane.Client/Routes.razor b/Oqtane.Client/Routes.razor index fa1d4e8d..24d19a91 100644 --- a/Oqtane.Client/Routes.razor +++ b/Oqtane.Client/Routes.razor @@ -16,7 +16,7 @@
- +
@@ -34,9 +34,6 @@ [Parameter] public string AntiForgeryToken { get; set; } - [Parameter] - public string Runtime { get; set; } - [Parameter] public string RenderMode { get; set; } diff --git a/Oqtane.Client/UI/PageState.cs b/Oqtane.Client/UI/PageState.cs index 7de88d96..c9025622 100644 --- a/Oqtane.Client/UI/PageState.cs +++ b/Oqtane.Client/UI/PageState.cs @@ -19,6 +19,7 @@ namespace Oqtane.UI public bool EditMode { get; set; } public DateTime LastSyncDate { get; set; } public Shared.Runtime Runtime { get; set; } + public string RenderMode { get; set; } public int VisitorId { get; set; } public string RemoteIPAddress { get; set; } public string ReturnUrl { get; set; } diff --git a/Oqtane.Client/Utilities/RenderModes.cs b/Oqtane.Client/UI/RenderMode.cs similarity index 69% rename from Oqtane.Client/Utilities/RenderModes.cs rename to Oqtane.Client/UI/RenderMode.cs index 4809e238..fa41f3c1 100644 --- a/Oqtane.Client/Utilities/RenderModes.cs +++ b/Oqtane.Client/UI/RenderMode.cs @@ -1,19 +1,20 @@ using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components; +using Oqtane.Shared; -namespace Oqtane.Client.Utilities +namespace Oqtane.UI { - public static class RenderModes + public static class RenderMode { public static IComponentRenderMode GetInteractiveRenderMode(string interactiveRenderMode, bool prerender) { switch (interactiveRenderMode) { - case "InteractiveServer": + case RenderModes.InteractiveServer: return new InteractiveServerRenderMode(prerender); - case "InteractiveWebAssembly": + case RenderModes.InteractiveWebAssembly: return new InteractiveWebAssemblyRenderMode(prerender); - case "InteractiveAuto": + case RenderModes.InteractiveAuto: return new InteractiveAutoRenderMode(prerender); } return null; diff --git a/Oqtane.Client/UI/Runtime.cs b/Oqtane.Client/UI/Runtime.cs deleted file mode 100644 index 2d7e6b00..00000000 --- a/Oqtane.Client/UI/Runtime.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Oqtane.UI -{ - [Obsolete("This enum is deprecated and will be removed in the upcoming major release, please use Oqtane.Shared.Runtime instead.")] - public enum Runtime - { - Server, - WebAssembly - } -} diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index d04e4469..8bd12aa2 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -100,7 +100,6 @@ var editmode = false; var refresh = false; var lastsyncdate = DateTime.MinValue; - var runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime); _error = ""; Route route = new Route(_absoluteUri, SiteState.Alias.Path); @@ -286,7 +285,8 @@ Action = action, EditMode = editmode, LastSyncDate = lastsyncdate, - Runtime = runtime, + Runtime = Shared.Runtime.Hybrid, + RenderMode = RenderMode, VisitorId = VisitorId, RemoteIPAddress = SiteState.RemoteIPAddress, ReturnUrl = returnurl, @@ -425,7 +425,7 @@ { var typename = Constants.ErrorModule; - if (module.ModuleDefinition != null && (module.ModuleDefinition.Runtimes == "" || module.ModuleDefinition.Runtimes.Contains(Runtime))) + if (module.ModuleDefinition != null && (module.ModuleDefinition.Runtimes == "" || module.ModuleDefinition.Runtimes.Contains(RenderMode))) { typename = module.ModuleDefinition.ControlTypeTemplate; diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 6083f895..8bf473cc 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -8,7 +8,7 @@ @using Microsoft.Net.Http.Headers @using Microsoft.Extensions.Primitives @using Oqtane.Client -@using Oqtane.Client.Utilities +@using Oqtane.UI @using Oqtane.Repository @using Oqtane.Infrastructure @using Oqtane.Security @@ -47,26 +47,26 @@ @((MarkupString)_styleSheets) - @if (_renderMode == "Interactive") + @if (_renderMode == RenderModes.StaticServer) { - + } else { - + } @((MarkupString)_headResources) @if (string.IsNullOrEmpty(_message)) { - @if (_renderMode == "Interactive") + @if (_renderMode == RenderModes.StaticServer) { - + } else { - + } @@ -90,9 +90,8 @@ @code { - private string _renderMode = "Interactive"; - private string _interactiveRenderMode = "Server"; - private string _prerender = "Prerendered"; + private string _renderMode = RenderModes.InteractiveServer; + private bool _prerender = true; private int _visitorId = -1; private string _remoteIPAddress = ""; private string _authorizationToken = ""; @@ -128,16 +127,10 @@ } var site = SiteRepository.GetSite(alias.SiteId); - if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && site.Runtime != "Hybrid") + if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && !site.Hybrid) { - if (!string.IsNullOrEmpty(site.Runtime)) - { - _interactiveRenderMode = site.Runtime; - } - if (!string.IsNullOrEmpty(site.RenderMode)) - { - _prerender = site.RenderMode; - } + _renderMode = site.RenderMode; + _prerender = site.Prerender; Route route = new Route(url, alias.Path); var page = PageRepository.GetPage(route.PagePath, site.SiteId); @@ -186,7 +179,7 @@ ManageStyleSheets(resources, alias, theme.ThemeName); // scripts - if (_interactiveRenderMode == "InteractiveServer") + if (_renderMode == RenderModes.InteractiveServer) { _reconnectScript = CreateReconnectScript(); } diff --git a/Oqtane.Server/Controllers/InstallationController.cs b/Oqtane.Server/Controllers/InstallationController.cs index b070fce6..39ef38aa 100644 --- a/Oqtane.Server/Controllers/InstallationController.cs +++ b/Oqtane.Server/Controllers/InstallationController.cs @@ -119,7 +119,7 @@ namespace Oqtane.Controllers var assemblyList = new List(); var site = _sites.GetSite(alias.SiteId); - if (site != null && (site.Runtime == "WebAssembly" || site.HybridEnabled)) + if (site != null && (site.RenderMode == "InteractiveWebAssembly" || site.Hybrid)) { var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); @@ -201,7 +201,7 @@ namespace Oqtane.Controllers private byte[] GetZIP(string list, Alias alias) { var site = _sites.GetSite(alias.SiteId); - if (site != null && (site.Runtime == "WebAssembly" || site.HybridEnabled)) + if (site != null && (site.RenderMode == "InteractiveWebAssembly" || site.Hybrid)) { var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); diff --git a/Oqtane.Server/Controllers/SiteController.cs b/Oqtane.Server/Controllers/SiteController.cs index df0384c1..daa904c6 100644 --- a/Oqtane.Server/Controllers/SiteController.cs +++ b/Oqtane.Server/Controllers/SiteController.cs @@ -212,7 +212,7 @@ namespace Oqtane.Controllers site = _sites.UpdateSite(site); _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, site.SiteId, SyncEventActions.Update); string action = SyncEventActions.Refresh; - if (current.Runtime != site.Runtime || current.RenderMode != site.RenderMode) + if (current.RenderMode != site.RenderMode) { action = SyncEventActions.Reload; } diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index d05524ca..18986016 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -556,9 +556,9 @@ namespace Oqtane.Infrastructure DefaultContainerType = (!string.IsNullOrEmpty(install.DefaultContainer)) ? install.DefaultContainer : Constants.DefaultContainer, AdminContainerType = (!string.IsNullOrEmpty(install.DefaultAdminContainer)) ? install.DefaultAdminContainer : Constants.DefaultAdminContainer, SiteTemplateType = install.SiteTemplate, - Runtime = (!string.IsNullOrEmpty(install.Runtime)) ? install.Runtime : _configManager.GetSection("Runtime").Value, RenderMode = (!string.IsNullOrEmpty(install.RenderMode)) ? install.RenderMode : _configManager.GetSection("RenderMode").Value, - HybridEnabled = false + Prerender = true, + Hybrid = false }; site = sites.AddSite(site); diff --git a/Oqtane.Server/Migrations/Tenant/05010001_AddPageEffectiveExpiryDate.cs b/Oqtane.Server/Migrations/Tenant/05010001_AddPageEffectiveExpiryDate.cs index bed22cd2..6111e09e 100644 --- a/Oqtane.Server/Migrations/Tenant/05010001_AddPageEffectiveExpiryDate.cs +++ b/Oqtane.Server/Migrations/Tenant/05010001_AddPageEffectiveExpiryDate.cs @@ -8,6 +8,7 @@ using Oqtane.Repository; namespace Oqtane.Migrations.Tenant { [DbContext(typeof(TenantDBContext))] + // note that the following migration was actually for version 5.0.2 (ie. "Tenant.05.00.02.01") [Migration("Tenant.05.01.00.01")] public class AddPageEffectiveExpiryDate : MultiDatabaseMigration { diff --git a/Oqtane.Server/Migrations/Tenant/05010002_AddPageModuleEffectiveExpiryDate.cs b/Oqtane.Server/Migrations/Tenant/05010002_AddPageModuleEffectiveExpiryDate.cs index f0b9147d..e17f3387 100644 --- a/Oqtane.Server/Migrations/Tenant/05010002_AddPageModuleEffectiveExpiryDate.cs +++ b/Oqtane.Server/Migrations/Tenant/05010002_AddPageModuleEffectiveExpiryDate.cs @@ -8,6 +8,7 @@ using Oqtane.Repository; namespace Oqtane.Migrations.Tenant { [DbContext(typeof(TenantDBContext))] + // note that the following migration was actually for version 5.0.2 (ie. "Tenant.05.00.02.02") [Migration("Tenant.05.01.00.02")] public class AddPageModuleEffectiveExpiryDate : MultiDatabaseMigration { diff --git a/Oqtane.Server/Migrations/Tenant/05010003_AddProfileAutocomplete.cs b/Oqtane.Server/Migrations/Tenant/05010003_AddProfileAutocomplete.cs index 6ec00156..2c2f45a5 100644 --- a/Oqtane.Server/Migrations/Tenant/05010003_AddProfileAutocomplete.cs +++ b/Oqtane.Server/Migrations/Tenant/05010003_AddProfileAutocomplete.cs @@ -7,6 +7,7 @@ using Oqtane.Repository; namespace Oqtane.Migrations.Tenant { [DbContext(typeof(TenantDBContext))] + // note that the following migration was actually for version 5.0.2 (ie. "Tenant.05.00.02.03") [Migration("Tenant.05.01.00.03")] public class AddProfileAutocomplete : MultiDatabaseMigration { diff --git a/Oqtane.Server/Migrations/Tenant/05010004_AddSitePrerender.cs b/Oqtane.Server/Migrations/Tenant/05010004_AddSitePrerender.cs new file mode 100644 index 00000000..f0194dfc --- /dev/null +++ b/Oqtane.Server/Migrations/Tenant/05010004_AddSitePrerender.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations.EntityBuilders; +using Oqtane.Repository; +using Oqtane.Shared; + +namespace Oqtane.Migrations.Tenant +{ + [DbContext(typeof(TenantDBContext))] + [Migration("Tenant.05.01.00.04")] + public class AddSitePrerender : MultiDatabaseMigration + { + public AddSitePrerender(IDatabase database) : base(database) + { + } + + protected override void Up(MigrationBuilder migrationBuilder) + { + var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase); + + siteEntityBuilder.UpdateColumn("RenderMode", $"'{RenderModes.InteractiveServer}'"); + + siteEntityBuilder.AddBooleanColumn("Prerender", true); + siteEntityBuilder.UpdateColumn("Prerender", "1", "bool", ""); + + siteEntityBuilder.AddBooleanColumn("Hybrid", true); + siteEntityBuilder.UpdateColumn("Hybrid", "0", "bool", ""); + + siteEntityBuilder.DropColumn("Runtime"); + siteEntityBuilder.DropColumn("HybridEnabled"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + // not implemented + } + } +} diff --git a/Oqtane.Shared/Enums/Runtime.cs b/Oqtane.Shared/Enums/Runtime.cs index 3758b765..a755b7c1 100644 --- a/Oqtane.Shared/Enums/Runtime.cs +++ b/Oqtane.Shared/Enums/Runtime.cs @@ -2,8 +2,7 @@ namespace Oqtane.Shared { public enum Runtime { - Server, - WebAssembly, + Web, Hybrid } } diff --git a/Oqtane.Shared/Models/Site.cs b/Oqtane.Shared/Models/Site.cs index 30c5c02f..fc1109c9 100644 --- a/Oqtane.Shared/Models/Site.cs +++ b/Oqtane.Shared/Models/Site.cs @@ -69,19 +69,19 @@ namespace Oqtane.Models public string SiteGuid { get; set; } /// - /// The hosting model for the site (ie. Server or WebAssembly ). - /// - public string Runtime { get; set; } - - /// - /// The render mode for the site (ie. Server, ServerPrerendered, WebAssembly, WebAssemblyPrerendered ). + /// The default render mode for the site (ie. Static,InteractiveServer,InteractiveWebAssembly,InteractiveAuto) /// public string RenderMode { get; set; } + /// + /// If the site supports prerendering (only applies to Interactive rendering) + /// + public bool Prerender { get; set; } + /// /// Indicates if a site can be integrated with an external .NET MAUI hybrid application /// - public bool HybridEnabled { get; set; } + public bool Hybrid { get; set; } /// /// Keeps track of site configuration changes and is used by the ISiteMigration interface diff --git a/Oqtane.Shared/Shared/InstallConfig.cs b/Oqtane.Shared/Shared/InstallConfig.cs index f4e7d053..e5371867 100644 --- a/Oqtane.Shared/Shared/InstallConfig.cs +++ b/Oqtane.Shared/Shared/InstallConfig.cs @@ -17,7 +17,6 @@ namespace Oqtane.Shared public string DefaultTheme { get; set; } public string DefaultContainer { get; set; } public string DefaultAdminContainer { get; set; } - public string Runtime { get; set; } public string RenderMode { get; set; } public bool Register { get; set; } } diff --git a/Oqtane.Shared/Shared/RenderModes.cs b/Oqtane.Shared/Shared/RenderModes.cs new file mode 100644 index 00000000..bb0aaa88 --- /dev/null +++ b/Oqtane.Shared/Shared/RenderModes.cs @@ -0,0 +1,8 @@ +namespace Oqtane.Shared { + public class RenderModes { + public const string StaticServer = "StaticServer"; + public const string InteractiveServer = "InteractiveServer"; + public const string InteractiveWebAssembly = "InteractiveWebAssembly"; + public const string InteractiveAuto = "InteractiveAuto"; + } +}