split RenderMode and Runtime configuration

This commit is contained in:
sbwalker 2024-02-01 09:08:39 -05:00
parent 97762712e6
commit 1e332ed075
22 changed files with 251 additions and 169 deletions

View File

@ -261,8 +261,9 @@
SiteName = Constants.DefaultSite,
Register = _register,
SiteTemplate = _template,
RenderMode = RenderModes.InteractiveServer
};
RenderMode = RenderModes.Interactive,
Runtime = Runtimes.Server
};
var installation = await InstallationService.Install(config);
if (installation.Success)

View File

@ -314,15 +314,24 @@
<Label Class="col-sm-3" For="rendermode" HelpText="The default render mode for the site" ResourceKey="Rendermode">Render Mode: </Label>
<div class="col-sm-9">
<select id="rendermode" class="form-select" @bind="@_rendermode" required>
<option value="@RenderModes.StaticServer">@SharedLocalizer[@RenderModes.StaticServer]</option>
<option value="@RenderModes.InteractiveServer">@SharedLocalizer[@RenderModes.InteractiveServer]</option>
<option value="@RenderModes.InteractiveWebAssembly">@SharedLocalizer[@RenderModes.InteractiveWebAssembly]</option>
<option value="@RenderModes.InteractiveAuto">@SharedLocalizer[@RenderModes.InteractiveAuto]</option>
<option value="@RenderModes.Interactive">@(SharedLocalizer["RenderMode" + @RenderModes.Interactive])</option>
<option value="@RenderModes.Static">@(SharedLocalizer["RenderMode" + @RenderModes.Static])</option>
<option value="@RenderModes.Headless">@(SharedLocalizer["RenderMode" + @RenderModes.Headless])</option>
</select>
</div>
</div>
@if (_rendermode != RenderModes.StaticServer)
@if (_rendermode == RenderModes.Interactive)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runtime" HelpText="The interactive render mode for the site" ResourceKey="Runtime">Interactivity: </Label>
<div class="col-sm-9">
<select id="runtime" class="form-select" @bind="@_runtime" required>
<option value="@Runtimes.Server">@(SharedLocalizer["Runtime" + @Runtimes.Server])</option>
<option value="@Runtimes.WebAssembly">@(SharedLocalizer["Runtime" + @Runtimes.WebAssembly])</option>
<option value="@Runtimes.Auto">@(SharedLocalizer["Runtime" + @Runtimes.Auto])</option>
</select>
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="prerender" HelpText="Specifies if the site supports prerendering" ResourceKey="Prerender">Prerender? </Label>
<div class="col-sm-9">
@ -419,7 +428,8 @@
private int _aliasid = -1;
private string _aliasname;
private string _defaultalias;
private string _rendermode = RenderModes.InteractiveServer;
private string _rendermode = RenderModes.Interactive;
private string _runtime = Runtimes.Server;
private string _prerender = "True";
private string _hybrid = "False";
private string _tenant = string.Empty;
@ -506,6 +516,7 @@
// hosting model
_rendermode = site.RenderMode;
_runtime = site.Runtime;
_prerender = site.Prerender.ToString();
_hybrid = site.Hybrid.ToString();
@ -645,9 +656,10 @@
// hosting model
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{
if (site.RenderMode != _rendermode || site.Prerender != bool.Parse(_prerender) || site.Hybrid != bool.Parse(_hybrid))
if (site.RenderMode != _rendermode || site.Runtime != _runtime || site.Prerender != bool.Parse(_prerender) || site.Hybrid != bool.Parse(_hybrid))
{
site.RenderMode = _rendermode;
site.Runtime = _runtime;
site.Prerender = bool.Parse(_prerender);
site.Hybrid = bool.Parse(_hybrid);
reload = true; // needs to be reloaded on serve

View File

@ -74,13 +74,25 @@ else
<Label Class="col-sm-3" For="rendermode" HelpText="The default render mode for the site" ResourceKey="Rendermode">Render Mode: </Label>
<div class="col-sm-9">
<select id="rendermode" class="form-select" @bind="@_rendermode" required>
<option value="@RenderModes.StaticServer">@SharedLocalizer[@RenderModes.StaticServer]</option>
<option value="@RenderModes.InteractiveServer">@SharedLocalizer[@RenderModes.InteractiveServer]</option>
<option value="@RenderModes.InteractiveWebAssembly">@SharedLocalizer[@RenderModes.InteractiveWebAssembly]</option>
<option value="@RenderModes.InteractiveAuto">@SharedLocalizer[@RenderModes.InteractiveAuto]</option>
<option value="@RenderModes.Interactive">@(SharedLocalizer["RenderMode" + @RenderModes.Interactive])</option>
<option value="@RenderModes.Static">@(SharedLocalizer["RenderMode" + @RenderModes.Static])</option>
<option value="@RenderModes.Headless">@(SharedLocalizer["RenderMode" + @RenderModes.Headless])</option>
</select>
</div>
</div>
@if (_rendermode == RenderModes.Interactive)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runtime" HelpText="The interactive render mode for the site" ResourceKey="Runtime">Interactivity: </Label>
<div class="col-sm-9">
<select id="runtime" class="form-select" @bind="@_runtime" required>
<option value="@Runtimes.Server">@(SharedLocalizer["Runtime" + @Runtimes.Server])</option>
<option value="@Runtimes.WebAssembly">@(SharedLocalizer["Runtime" + @Runtimes.WebAssembly])</option>
<option value="@Runtimes.Auto">@(SharedLocalizer["Runtime" + @Runtimes.Auto])</option>
</select>
</div>
</div>
}
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="tenant" HelpText="Select the database for the site" ResourceKey="Tenant">Database: </Label>
<div class="col-sm-9">
@ -194,7 +206,8 @@ else
private string _themetype = "-";
private string _containertype = "-";
private string _sitetemplatetype = "-";
private string _rendermode = RenderModes.InteractiveServer;
private string _rendermode = RenderModes.Interactive;
private string _runtime = Runtimes.Server;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@ -220,137 +233,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<ThemeControl>();
else
{
_containers = new List<ThemeControl>();
_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<string>();
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<string>();
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;
@ -392,6 +405,7 @@ else
config.DefaultAdminContainer = "";
config.SiteTemplate = _sitetemplatetype;
config.RenderMode = _rendermode;
config.Runtime = _runtime;
ShowProgressIndicator();

View File

@ -423,4 +423,10 @@
<data name="HybridEnabled.Text" xml:space="preserve">
<value>Hybrid Enabled?</value>
</data>
<data name="Runtime.HelpText" xml:space="preserve">
<value>The interactive render mode for the site</value>
</data>
<data name="Runtime.Text" xml:space="preserve">
<value>Interactivity:</value>
</data>
</root>

View File

@ -246,4 +246,10 @@
<data name="EnterConnectionString" xml:space="preserve">
<value>Enter Connection String</value>
</data>
<data name="Runtime.HelpText" xml:space="preserve">
<value>The interactive render mode for the site</value>
</data>
<data name="Runtime.Text" xml:space="preserve">
<value>Interactivity:</value>
</data>
</root>

View File

@ -312,11 +312,11 @@
<data name="Not Specified" xml:space="preserve">
<value>Not Specified</value>
</data>
<data name="InteractiveServer" xml:space="preserve">
<value>Interactive Server Rendering</value>
<data name="RuntimeServer" xml:space="preserve">
<value>Server Rendering</value>
</data>
<data name="InteractiveWebAssembly" xml:space="preserve">
<value>Interactive WebAssembly Rendering</value>
<data name="RuntimeWebAssembly" xml:space="preserve">
<value>WebAssembly Rendering</value>
</data>
<data name="StaticServer" xml:space="preserve">
<value>Static Server Rendering</value>
@ -441,7 +441,16 @@
<data name="Message.EffectiveExpiryDateError" xml:space="preserve">
<value>Effective Date cannot be after Expiry Date.</value>
</data>
<data name="InteractiveAuto" xml:space="preserve">
<value>Interactive Auto Rendering</value>
<data name="RuntimeAuto" xml:space="preserve">
<value>Auto Rendering</value>
</data>
<data name="RenderModeHeadless" xml:space="preserve">
<value>Headless API (No Rendering)</value>
</data>
<data name="RenderModeInteractive" xml:space="preserve">
<value>Global Interactivity</value>
</data>
<data name="RenderModeStatic" xml:space="preserve">
<value>Static Server Rendering</value>
</data>
</root>

View File

@ -16,7 +16,7 @@
<div style="@_display">
<CascadingAuthenticationState>
<CascadingValue Value="@PageState">
<SiteRouter Runtime="@Runtime" RenderMode="@RenderMode" VisitorId="@VisitorId" OnStateChange="@ChangeState" />
<SiteRouter RenderMode="@RenderMode" Runtime="@Runtime" VisitorId="@VisitorId" OnStateChange="@ChangeState" />
</CascadingValue>
</CascadingAuthenticationState>
</div>
@ -35,10 +35,10 @@
public string AntiForgeryToken { get; set; }
[Parameter]
public string Runtime { get; set; }
public string RenderMode { get; set; }
[Parameter]
public string RenderMode { get; set; }
public string Runtime { get; set; }
[Parameter]
public int VisitorId { get; set; }

View File

@ -18,8 +18,8 @@ namespace Oqtane.UI
public string Action { get; set; }
public bool EditMode { get; set; }
public DateTime LastSyncDate { get; set; }
public Shared.Runtime Runtime { get; set; }
public string RenderMode { get; set; }
public Shared.Runtime Runtime { get; set; }
public int VisitorId { get; set; }
public string RemoteIPAddress { get; set; }
public string ReturnUrl { get; set; }

View File

@ -6,15 +6,15 @@ namespace Oqtane.UI
{
public static class RenderMode
{
public static IComponentRenderMode GetInteractiveRenderMode(string interactiveRenderMode, bool prerender)
public static IComponentRenderMode GetInteractiveRenderMode(string runtime, bool prerender)
{
switch (interactiveRenderMode)
switch (runtime)
{
case RenderModes.InteractiveServer:
case Runtimes.Server:
return new InteractiveServerRenderMode(prerender);
case RenderModes.InteractiveWebAssembly:
case Runtimes.WebAssembly:
return new InteractiveWebAssemblyRenderMode(prerender);
case RenderModes.InteractiveAuto:
case Runtimes.Auto:
return new InteractiveAutoRenderMode(prerender);
}
return null;

View File

@ -30,10 +30,10 @@
private string _error = "";
[Parameter]
public string Runtime { get; set; }
public string RenderMode { get; set; }
[Parameter]
public string RenderMode { get; set; }
public string Runtime { get; set; }
[Parameter]
public int VisitorId { get; set; }
@ -291,8 +291,8 @@
Action = action,
EditMode = editmode,
LastSyncDate = lastsyncdate,
Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime),
RenderMode = RenderMode,
Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime),
VisitorId = VisitorId,
RemoteIPAddress = SiteState.RemoteIPAddress,
ReturnUrl = returnurl,

View File

@ -47,26 +47,26 @@
@((MarkupString)_styleSheets)
<link id="app-stylesheet-page" />
<link id="app-stylesheet-module" />
@if (_renderMode == RenderModes.StaticServer)
@if (_renderMode == RenderModes.Static)
{
<Head />
}
else
{
<Head @rendermode="@RenderMode.GetInteractiveRenderMode((_renderMode), _prerender)" />
<Head @rendermode="@RenderMode.GetInteractiveRenderMode((_runtime), _prerender)" />
}
@((MarkupString)_headResources)
</head>
<body>
@if (string.IsNullOrEmpty(_message))
{
@if (_renderMode == RenderModes.StaticServer)
@if (_renderMode == RenderModes.Static)
{
<Routes AntiForgeryToken="@_antiForgeryToken" Runtime="Web" RenderMode="@_renderMode" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" />
<Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" Runtime="@_runtime" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" />
}
else
{
<Routes AntiForgeryToken="@_antiForgeryToken" Runtime="Web" RenderMode="@_renderMode" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" @rendermode="@RenderMode.GetInteractiveRenderMode((_renderMode), _prerender)" />
<Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" Runtime="@_runtime" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" @rendermode="@RenderMode.GetInteractiveRenderMode((_runtime), _prerender)" />
}
<script src="js/interop.js"></script>
@ -90,7 +90,8 @@
</html>
@code {
private string _renderMode = RenderModes.InteractiveServer;
private string _renderMode = RenderModes.Interactive;
private string _runtime = Runtimes.Server;
private bool _prerender = true;
private int _visitorId = -1;
private string _remoteIPAddress = "";
@ -127,9 +128,10 @@
}
var site = SiteRepository.GetSite(alias.SiteId);
if (site != null && (!site.IsDeleted || url.Contains("admin/site")))
if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && site.RenderMode != RenderModes.Headless)
{
_renderMode = site.RenderMode;
_runtime = site.Runtime;
_prerender = site.Prerender;
Route route = new Route(url, alias.Path);
@ -179,7 +181,7 @@
ManageStyleSheets(resources, alias, theme.ThemeName);
// scripts
if (_renderMode == RenderModes.InteractiveServer)
if (_renderMode == RenderModes.Interactive && _runtime == Runtimes.Server)
{
_reconnectScript = CreateReconnectScript();
}

View File

@ -119,7 +119,7 @@ namespace Oqtane.Controllers
var assemblyList = new List<ClientAssembly>();
var site = _sites.GetSite(alias.SiteId);
if (site != null && (site.RenderMode == "InteractiveWebAssembly" || site.Hybrid))
if (site != null && (site.Runtime == Runtimes.WebAssembly || 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.RenderMode == "InteractiveWebAssembly" || site.Hybrid))
if (site != null && (site.Runtime == Runtimes.WebAssembly || site.Hybrid))
{
var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

View File

@ -13,8 +13,6 @@ using System.Globalization;
using Microsoft.Extensions.Caching.Memory;
using Oqtane.Extensions;
using System;
using Oqtane.UI;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace Oqtane.Controllers
{
@ -212,7 +210,7 @@ namespace Oqtane.Controllers
site = _sites.UpdateSite(site);
_syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, site.SiteId, SyncEventActions.Update);
string action = SyncEventActions.Refresh;
if (current.RenderMode != site.RenderMode)
if (current.RenderMode != site.RenderMode || current.Runtime != site.Runtime)
{
action = SyncEventActions.Reload;
}

View File

@ -46,7 +46,8 @@ namespace Oqtane.Controllers
break;
case "configuration":
systeminfo.Add("InstallationId", _configManager.GetInstallationId());
systeminfo.Add("RenderMode", _configManager.GetSetting("RenderMode", RenderModes.InteractiveServer));
systeminfo.Add("RenderMode", _configManager.GetSetting("RenderMode", RenderModes.Interactive));
systeminfo.Add("Runtime", _configManager.GetSetting("Runtime", Runtimes.Server));
systeminfo.Add("DetailedErrors", _configManager.GetSetting("DetailedErrors", "false"));
systeminfo.Add("Logging:LogLevel:Default", _configManager.GetSetting("Logging:LogLevel:Default", "Information"));
systeminfo.Add("Logging:LogLevel:Notify", _configManager.GetSetting("Logging:LogLevel:Notify", "Error"));

View File

@ -557,6 +557,7 @@ namespace Oqtane.Infrastructure
AdminContainerType = (!string.IsNullOrEmpty(install.DefaultAdminContainer)) ? install.DefaultAdminContainer : Constants.DefaultAdminContainer,
SiteTemplateType = install.SiteTemplate,
RenderMode = (!string.IsNullOrEmpty(install.RenderMode)) ? install.RenderMode : _configManager.GetSection("RenderMode").Value,
Runtime = (!string.IsNullOrEmpty(install.Runtime)) ? install.Runtime : _configManager.GetSection("Runtime").Value,
Prerender = true,
Hybrid = false
};

View File

@ -63,6 +63,9 @@ namespace Oqtane.Infrastructure
case "3.3.0":
Upgrade_3_3_0(tenant, scope);
break;
case "5.1.0":
Upgrade_5_1_0(tenant, scope);
break;
}
}
}
@ -111,7 +114,11 @@ namespace Oqtane.Infrastructure
_configManager.RemoveSetting("Localization:SupportedCultures", true);
if (_configManager.GetSetting("RenderMode", "") == "")
{
_configManager.AddOrUpdateSetting("RenderMode", "ServerPrerendered", true);
_configManager.AddOrUpdateSetting("RenderMode", RenderModes.Interactive, true);
}
if (_configManager.GetSetting("Runtime", "") == "")
{
_configManager.AddOrUpdateSetting("Runtime", Runtimes.Server, true);
}
}
}
@ -349,5 +356,17 @@ namespace Oqtane.Infrastructure
Debug.WriteLine($"Oqtane Error: Error In 3.3.0 Upgrade Logic - {ex}");
}
}
private void Upgrade_5_1_0(Tenant tenant, IServiceScope scope)
{
if (tenant.Name == TenantNames.Master)
{
var rendermode = _configManager.GetSetting("RenderMode", "");
if (rendermode.Contains("Prerendered"))
{
_configManager.AddOrUpdateSetting("RenderMode", rendermode.Replace("Prerendered", ""), true);
}
}
}
}
}

View File

@ -19,15 +19,13 @@ namespace Oqtane.Migrations.Tenant
{
var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase);
siteEntityBuilder.UpdateColumn("RenderMode", $"'{RenderModes.InteractiveServer}'");
siteEntityBuilder.UpdateColumn("RenderMode", $"'{RenderModes.Interactive}'");
siteEntityBuilder.AddBooleanColumn("Prerender", true);
siteEntityBuilder.UpdateColumn("Prerender", "1", "bool", "");
siteEntityBuilder.AddBooleanColumn("Hybrid", true);
siteEntityBuilder.UpdateColumn("Hybrid", "0", "bool", "");
siteEntityBuilder.DropColumn("Runtime");
siteEntityBuilder.DropColumn("HybridEnabled");
}

View File

@ -2,7 +2,9 @@ namespace Oqtane.Shared
{
public enum Runtime
{
Web,
Server,
WebAssembly,
Auto,
Hybrid
}
}

View File

@ -69,12 +69,17 @@ namespace Oqtane.Models
public string SiteGuid { get; set; }
/// <summary>
/// The default render mode for the site (ie. Static,InteractiveServer,InteractiveWebAssembly,InteractiveAuto)
/// The default render mode for the site ie. Static,Interactive,Headless
/// </summary>
public string RenderMode { get; set; }
/// <summary>
/// If the site supports prerendering (only applies to Interactive rendering)
/// The interactive render mode for the site ie. Server,WebAssembly,Auto (only applies to Interactive rendermode)
/// </summary>
public string Runtime { get; set; }
/// <summary>
/// If the site supports prerendering (only applies to Interactive rendermode)
/// </summary>
public bool Prerender { get; set; }

View File

@ -18,6 +18,7 @@ namespace Oqtane.Shared
public string DefaultContainer { get; set; }
public string DefaultAdminContainer { get; set; }
public string RenderMode { get; set; }
public string Runtime { get; set; }
public bool Register { get; set; }
}
}

View File

@ -1,8 +1,7 @@
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";
public const string Static = "Static";
public const string Interactive = "Interactive";
public const string Headless = "Headless";
}
}

View File

@ -0,0 +1,8 @@
namespace Oqtane.Shared {
public class Runtimes {
public const string Server = "Server";
public const string WebAssembly = "WebAssembly";
public const string Auto = "Auto";
public const string Hybrid = "Hybrid";
}
}