Merge pull request #3707 from sbwalker/dev

render mode integration
This commit is contained in:
Shaun Walker 2024-01-31 15:22:39 -05:00 committed by GitHub
commit d97cb4c360
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 145 additions and 116 deletions

View File

@ -260,7 +260,8 @@
IsNewTenant = true, IsNewTenant = true,
SiteName = Constants.DefaultSite, SiteName = Constants.DefaultSite,
Register = _register, Register = _register,
SiteTemplate = _template SiteTemplate = _template,
RenderMode = RenderModes.InteractiveServer
}; };
var installation = await InstallationService.Install(config); var installation = await InstallationService.Install(config);

View File

@ -311,27 +311,32 @@
<Section Name="Hosting" Heading="Hosting Model" ResourceKey="Hosting"> <Section Name="Hosting" Heading="Hosting Model" ResourceKey="Hosting">
<div class="container"> <div class="container">
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runtime" HelpText="The Blazor runtime hosting model for the site" ResourceKey="Runtime">Runtime: </Label> <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"> <div class="col-sm-9">
<select id="runtime" class="form-select" @bind="@_runtime" required> <select id="rendermode" class="form-select" @bind="@_rendermode" required>
<option value="Server">@SharedLocalizer["BlazorServer"]</option> <option value="@RenderModes.StaticServer">@SharedLocalizer[@RenderModes.StaticServer]</option>
<option value="WebAssembly">@SharedLocalizer["BlazorWebAssembly"]</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>
</select> </select>
</div> </div>
</div> </div>
@if (_rendermode != "Static")
{
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="prerender" HelpText="Specifies if the site should be prerendered (for search crawlers, etc...)" ResourceKey="Prerender">Prerender? </Label> <Label Class="col-sm-3" For="prerender" HelpText="Specifies if the site supports prerendering" ResourceKey="Prerender">Prerender? </Label>
<div class="col-sm-9"> <div class="col-sm-9">
<select id="prerender" class="form-select" @bind="@_prerender" required> <select id="prerender" class="form-select" @bind="@_prerender" required>
<option value="Prerendered">@SharedLocalizer["Yes"]</option> <option value="True">@SharedLocalizer["Yes"]</option>
<option value="">@SharedLocalizer["No"]</option> <option value="False">@SharedLocalizer["No"]</option>
</select> </select>
</div> </div>
</div> </div>
}
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="hybridenabled" HelpText="Specifies if the site can be integrated with an external .NET MAUI hybrid application" ResourceKey="HybridEnabled">Hybrid Enabled? </Label> <Label Class="col-sm-3" For="hybrid" HelpText="Specifies if the site can be integrated with an external .NET MAUI hybrid application" ResourceKey="Hybrid">Hybrid? </Label>
<div class="col-sm-9"> <div class="col-sm-9">
<select id="hybridenabled" class="form-select" @bind="@_hybridenabled" required> <select id="hybrid" class="form-select" @bind="@_hybrid" required>
<option value="True">@SharedLocalizer["Yes"]</option> <option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option> <option value="False">@SharedLocalizer["No"]</option>
</select> </select>
@ -414,9 +419,9 @@
private int _aliasid = -1; private int _aliasid = -1;
private string _aliasname; private string _aliasname;
private string _defaultalias; private string _defaultalias;
private string _runtime = ""; private string _rendermode = RenderModes.InteractiveServer;
private string _prerender = ""; private string _prerender = "True";
private string _hybridenabled = ""; private string _hybrid = "False";
private string _tenant = string.Empty; private string _tenant = string.Empty;
private string _database = string.Empty; private string _database = string.Empty;
private string _connectionstring = string.Empty; private string _connectionstring = string.Empty;
@ -500,9 +505,9 @@
await GetAliases(); await GetAliases();
// hosting model // hosting model
_runtime = site.Runtime; _rendermode = site.RenderMode;
_prerender = site.RenderMode.Replace(_runtime, ""); _prerender = site.Prerender.ToString();
_hybridenabled = site.HybridEnabled.ToString(); _hybrid = site.Hybrid.ToString();
// database // database
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
@ -640,11 +645,11 @@
// hosting model // hosting model
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) 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 = _rendermode;
site.RenderMode = _runtime + _prerender; site.Prerender = bool.Parse(_prerender);
site.HybridEnabled = bool.Parse(_hybridenabled); site.Hybrid = bool.Parse(_hybrid);
reload = true; // needs to be reloaded on serve reload = true; // needs to be reloaded on serve
} }
} }

View File

@ -71,20 +71,13 @@ else
</div> </div>
</div> </div>
<div class="row mb-1 align-items-center"> <div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="runtime" HelpText="The runtime hosting model" ResourceKey="Runtime">Runtime: </Label> <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"> <div class="col-sm-9">
<select id="runtime" class="form-select" @bind="@_runtime" required> <select id="rendermode" class="form-select" @bind="@_rendermode" required>
<option value="Server">@SharedLocalizer["BlazorServer"]</option> <option value="@RenderModes.StaticServer">@SharedLocalizer[@RenderModes.StaticServer]</option>
<option value="WebAssembly">@SharedLocalizer["BlazorWebAssembly"]</option> <option value="@RenderModes.InteractiveServer">@SharedLocalizer[@RenderModes.InteractiveServer]</option>
</select> <option value="@RenderModes.InteractiveWebAssembly">@SharedLocalizer[@RenderModes.InteractiveWebAssembly]</option>
</div> <option value="@RenderModes.InteractiveAuto">@SharedLocalizer[@RenderModes.InteractiveAuto]</option>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="prerender" HelpText="Specifies if the site should be prerendered (for search crawlers, etc...)" ResourceKey="Prerender">Prerender? </Label>
<div class="col-sm-9">
<select id="prerender" class="form-select" @bind="@_prerender" required>
<option value="Prerendered">@SharedLocalizer["Yes"]</option>
<option value="">@SharedLocalizer["No"]</option>
</select> </select>
</div> </div>
</div> </div>
@ -201,8 +194,7 @@ else
private string _themetype = "-"; private string _themetype = "-";
private string _containertype = "-"; private string _containertype = "-";
private string _sitetemplatetype = "-"; private string _sitetemplatetype = "-";
private string _runtime = "Server"; private string _rendermode = RenderModes.InteractiveServer;
private string _prerender = "Prerendered";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host;
@ -399,8 +391,7 @@ else
config.DefaultContainer = _containertype; config.DefaultContainer = _containertype;
config.DefaultAdminContainer = ""; config.DefaultAdminContainer = "";
config.SiteTemplate = _sitetemplatetype; config.SiteTemplate = _sitetemplatetype;
config.Runtime = _runtime; config.RenderMode = _rendermode;
config.RenderMode = _runtime + _prerender;
ShowProgressIndicator(); ShowProgressIndicator();

View File

@ -277,16 +277,16 @@
<value>Hosting Model</value> <value>Hosting Model</value>
</data> </data>
<data name="Prerender.HelpText" xml:space="preserve"> <data name="Prerender.HelpText" xml:space="preserve">
<value>Specifies if the site should be prerendered (for search crawlers, etc...)</value> <value>Specifies if the site supports prerendering</value>
</data> </data>
<data name="Prerender.Text" xml:space="preserve"> <data name="Prerender.Text" xml:space="preserve">
<value>Prerender? </value> <value>Prerender? </value>
</data> </data>
<data name="Runtime.HelpText" xml:space="preserve"> <data name="RenderMode.HelpText" xml:space="preserve">
<value>The Blazor runtime hosting model for the site</value> <value>The default render mode for the site</value>
</data> </data>
<data name="Runtime.Text" xml:space="preserve"> <data name="RenderMode.Text" xml:space="preserve">
<value>Runtime: </value> <value>Render Mode:</value>
</data> </data>
<data name="Browse" xml:space="preserve"> <data name="Browse" xml:space="preserve">
<value>Browse</value> <value>Browse</value>

View File

@ -223,16 +223,16 @@
<value>Error loading Database Configuration Control</value> <value>Error loading Database Configuration Control</value>
</data> </data>
<data name="Prerender.HelpText" xml:space="preserve"> <data name="Prerender.HelpText" xml:space="preserve">
<value>Specifies if the site should be prerendered (for search crawlers, etc...)</value> <value>Specifies if the site supports prerendering</value>
</data> </data>
<data name="Prerender.Text" xml:space="preserve"> <data name="Prerender.Text" xml:space="preserve">
<value>Prerender? </value> <value>Prerender? </value>
</data> </data>
<data name="Runtime.HelpText" xml:space="preserve"> <data name="RenderMode.HelpText" xml:space="preserve">
<value>The Blazor runtime hosting model</value> <value>The default render mode for the site</value>
</data> </data>
<data name="Runtime.Text" xml:space="preserve"> <data name="RenderMode.Text" xml:space="preserve">
<value>Runtime: </value> <value>Render Mode: </value>
</data> </data>
<data name="ConnectionString.HelpText" xml:space="preserve"> <data name="ConnectionString.HelpText" xml:space="preserve">
<value>Enter a complete connection string including all parameters and delimiters</value> <value>Enter a complete connection string including all parameters and delimiters</value>

View File

@ -312,14 +312,14 @@
<data name="Not Specified" xml:space="preserve"> <data name="Not Specified" xml:space="preserve">
<value>Not Specified</value> <value>Not Specified</value>
</data> </data>
<data name="BlazorServer" xml:space="preserve"> <data name="InteractiveServer" xml:space="preserve">
<value>Blazor Server</value> <value>Interactive Server Rendering</value>
</data> </data>
<data name="BlazorWebAssembly" xml:space="preserve"> <data name="InteractiveWebAssembly" xml:space="preserve">
<value>Blazor WebAssembly</value> <value>Interactive WebAssembly Rendering</value>
</data> </data>
<data name="BlazorHybrid" xml:space="preserve"> <data name="StaticServer" xml:space="preserve">
<value>Blazor Hybrid</value> <value>Static Server Rendering</value>
</data> </data>
<data name="Settings" xml:space="preserve"> <data name="Settings" xml:space="preserve">
<value>Settings</value> <value>Settings</value>
@ -441,4 +441,7 @@
<data name="Message.EffectiveExpiryDateError" xml:space="preserve"> <data name="Message.EffectiveExpiryDateError" xml:space="preserve">
<value>Effective Date cannot be after Expiry Date.</value> <value>Effective Date cannot be after Expiry Date.</value>
</data> </data>
<data name="InteractiveAuto" xml:space="preserve">
<value>Interactive Auto Rendering</value>
</data>
</root> </root>

View File

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

View File

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

View File

@ -1,19 +1,20 @@
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components; 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) public static IComponentRenderMode GetInteractiveRenderMode(string interactiveRenderMode, bool prerender)
{ {
switch (interactiveRenderMode) switch (interactiveRenderMode)
{ {
case "InteractiveServer": case RenderModes.InteractiveServer:
return new InteractiveServerRenderMode(prerender); return new InteractiveServerRenderMode(prerender);
case "InteractiveWebAssembly": case RenderModes.InteractiveWebAssembly:
return new InteractiveWebAssemblyRenderMode(prerender); return new InteractiveWebAssemblyRenderMode(prerender);
case "InteractiveAuto": case RenderModes.InteractiveAuto:
return new InteractiveAutoRenderMode(prerender); return new InteractiveAutoRenderMode(prerender);
} }
return null; return null;

View File

@ -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
}
}

View File

@ -100,7 +100,6 @@
var editmode = false; var editmode = false;
var refresh = false; var refresh = false;
var lastsyncdate = DateTime.MinValue; var lastsyncdate = DateTime.MinValue;
var runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime);
_error = ""; _error = "";
Route route = new Route(_absoluteUri, SiteState.Alias.Path); Route route = new Route(_absoluteUri, SiteState.Alias.Path);
@ -286,7 +285,8 @@
Action = action, Action = action,
EditMode = editmode, EditMode = editmode,
LastSyncDate = lastsyncdate, LastSyncDate = lastsyncdate,
Runtime = runtime, Runtime = Shared.Runtime.Hybrid,
RenderMode = RenderMode,
VisitorId = VisitorId, VisitorId = VisitorId,
RemoteIPAddress = SiteState.RemoteIPAddress, RemoteIPAddress = SiteState.RemoteIPAddress,
ReturnUrl = returnurl, ReturnUrl = returnurl,
@ -425,7 +425,7 @@
{ {
var typename = Constants.ErrorModule; 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; typename = module.ModuleDefinition.ControlTypeTemplate;

View File

@ -8,7 +8,7 @@
@using Microsoft.Net.Http.Headers @using Microsoft.Net.Http.Headers
@using Microsoft.Extensions.Primitives @using Microsoft.Extensions.Primitives
@using Oqtane.Client @using Oqtane.Client
@using Oqtane.Client.Utilities @using Oqtane.UI
@using Oqtane.Repository @using Oqtane.Repository
@using Oqtane.Infrastructure @using Oqtane.Infrastructure
@using Oqtane.Security @using Oqtane.Security
@ -47,26 +47,26 @@
@((MarkupString)_styleSheets) @((MarkupString)_styleSheets)
<link id="app-stylesheet-page" /> <link id="app-stylesheet-page" />
<link id="app-stylesheet-module" /> <link id="app-stylesheet-module" />
@if (_renderMode == "Interactive") @if (_renderMode == RenderModes.StaticServer)
{ {
<Head @rendermode="@RenderModes.GetInteractiveRenderMode((_renderMode + _interactiveRenderMode), _prerender.Contains("Prerendered"))" /> <Head />
} }
else else
{ {
<Head /> <Head @rendermode="@RenderMode.GetInteractiveRenderMode((_renderMode), _prerender)" />
} }
@((MarkupString)_headResources) @((MarkupString)_headResources)
</head> </head>
<body> <body>
@if (string.IsNullOrEmpty(_message)) @if (string.IsNullOrEmpty(_message))
{ {
@if (_renderMode == "Interactive") @if (_renderMode == RenderModes.StaticServer)
{ {
<Routes AntiForgeryToken="@_antiForgeryToken" Runtime="@_interactiveRenderMode" RenderMode="@_prerender" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" @rendermode="@RenderModes.GetInteractiveRenderMode((_renderMode + _interactiveRenderMode), _prerender.Contains("Prerendered"))" /> <Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" />
} }
else else
{ {
<Routes AntiForgeryToken="@_antiForgeryToken" Runtime="@_interactiveRenderMode" RenderMode="@_prerender" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" /> <Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" @rendermode="@RenderMode.GetInteractiveRenderMode((_renderMode), _prerender)" />
} }
<script src="js/interop.js"></script> <script src="js/interop.js"></script>
@ -90,9 +90,8 @@
</html> </html>
@code { @code {
private string _renderMode = "Interactive"; private string _renderMode = RenderModes.InteractiveServer;
private string _interactiveRenderMode = "Server"; private bool _prerender = true;
private string _prerender = "Prerendered";
private int _visitorId = -1; private int _visitorId = -1;
private string _remoteIPAddress = ""; private string _remoteIPAddress = "";
private string _authorizationToken = ""; private string _authorizationToken = "";
@ -128,16 +127,10 @@
} }
var site = SiteRepository.GetSite(alias.SiteId); 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)) _renderMode = site.RenderMode;
{ _prerender = site.Prerender;
_interactiveRenderMode = site.Runtime;
}
if (!string.IsNullOrEmpty(site.RenderMode))
{
_prerender = site.RenderMode;
}
Route route = new Route(url, alias.Path); Route route = new Route(url, alias.Path);
var page = PageRepository.GetPage(route.PagePath, site.SiteId); var page = PageRepository.GetPage(route.PagePath, site.SiteId);
@ -186,7 +179,7 @@
ManageStyleSheets(resources, alias, theme.ThemeName); ManageStyleSheets(resources, alias, theme.ThemeName);
// scripts // scripts
if (_interactiveRenderMode == "InteractiveServer") if (_renderMode == RenderModes.InteractiveServer)
{ {
_reconnectScript = CreateReconnectScript(); _reconnectScript = CreateReconnectScript();
} }

View File

@ -119,7 +119,7 @@ namespace Oqtane.Controllers
var assemblyList = new List<ClientAssembly>(); var assemblyList = new List<ClientAssembly>();
var site = _sites.GetSite(alias.SiteId); 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); var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
@ -201,7 +201,7 @@ namespace Oqtane.Controllers
private byte[] GetZIP(string list, Alias alias) private byte[] GetZIP(string list, Alias alias)
{ {
var site = _sites.GetSite(alias.SiteId); 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); var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

View File

@ -212,7 +212,7 @@ namespace Oqtane.Controllers
site = _sites.UpdateSite(site); site = _sites.UpdateSite(site);
_syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, site.SiteId, SyncEventActions.Update); _syncManager.AddSyncEvent(_alias.TenantId, EntityNames.Site, site.SiteId, SyncEventActions.Update);
string action = SyncEventActions.Refresh; string action = SyncEventActions.Refresh;
if (current.Runtime != site.Runtime || current.RenderMode != site.RenderMode) if (current.RenderMode != site.RenderMode)
{ {
action = SyncEventActions.Reload; action = SyncEventActions.Reload;
} }

View File

@ -556,9 +556,9 @@ namespace Oqtane.Infrastructure
DefaultContainerType = (!string.IsNullOrEmpty(install.DefaultContainer)) ? install.DefaultContainer : Constants.DefaultContainer, DefaultContainerType = (!string.IsNullOrEmpty(install.DefaultContainer)) ? install.DefaultContainer : Constants.DefaultContainer,
AdminContainerType = (!string.IsNullOrEmpty(install.DefaultAdminContainer)) ? install.DefaultAdminContainer : Constants.DefaultAdminContainer, AdminContainerType = (!string.IsNullOrEmpty(install.DefaultAdminContainer)) ? install.DefaultAdminContainer : Constants.DefaultAdminContainer,
SiteTemplateType = install.SiteTemplate, 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, RenderMode = (!string.IsNullOrEmpty(install.RenderMode)) ? install.RenderMode : _configManager.GetSection("RenderMode").Value,
HybridEnabled = false Prerender = true,
Hybrid = false
}; };
site = sites.AddSite(site); site = sites.AddSite(site);

View File

@ -8,6 +8,7 @@ using Oqtane.Repository;
namespace Oqtane.Migrations.Tenant namespace Oqtane.Migrations.Tenant
{ {
[DbContext(typeof(TenantDBContext))] [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")] [Migration("Tenant.05.01.00.01")]
public class AddPageEffectiveExpiryDate : MultiDatabaseMigration public class AddPageEffectiveExpiryDate : MultiDatabaseMigration
{ {

View File

@ -8,6 +8,7 @@ using Oqtane.Repository;
namespace Oqtane.Migrations.Tenant namespace Oqtane.Migrations.Tenant
{ {
[DbContext(typeof(TenantDBContext))] [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")] [Migration("Tenant.05.01.00.02")]
public class AddPageModuleEffectiveExpiryDate : MultiDatabaseMigration public class AddPageModuleEffectiveExpiryDate : MultiDatabaseMigration
{ {

View File

@ -7,6 +7,7 @@ using Oqtane.Repository;
namespace Oqtane.Migrations.Tenant namespace Oqtane.Migrations.Tenant
{ {
[DbContext(typeof(TenantDBContext))] [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")] [Migration("Tenant.05.01.00.03")]
public class AddProfileAutocomplete : MultiDatabaseMigration public class AddProfileAutocomplete : MultiDatabaseMigration
{ {

View File

@ -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
}
}
}

View File

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

View File

@ -69,19 +69,19 @@ namespace Oqtane.Models
public string SiteGuid { get; set; } public string SiteGuid { get; set; }
/// <summary> /// <summary>
/// The hosting model for the site (ie. Server or WebAssembly ). /// The default render mode for the site (ie. Static,InteractiveServer,InteractiveWebAssembly,InteractiveAuto)
/// </summary>
public string Runtime { get; set; }
/// <summary>
/// The render mode for the site (ie. Server, ServerPrerendered, WebAssembly, WebAssemblyPrerendered ).
/// </summary> /// </summary>
public string RenderMode { get; set; } public string RenderMode { get; set; }
/// <summary>
/// If the site supports prerendering (only applies to Interactive rendering)
/// </summary>
public bool Prerender { get; set; }
/// <summary> /// <summary>
/// Indicates if a site can be integrated with an external .NET MAUI hybrid application /// Indicates if a site can be integrated with an external .NET MAUI hybrid application
/// </summary> /// </summary>
public bool HybridEnabled { get; set; } public bool Hybrid { get; set; }
/// <summary> /// <summary>
/// Keeps track of site configuration changes and is used by the ISiteMigration interface /// Keeps track of site configuration changes and is used by the ISiteMigration interface

View File

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

View File

@ -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";
}
}