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,