Merge branch 'oqtane:dev' into dev

This commit is contained in:
vnetonline
2025-11-29 15:12:07 +11:00
committed by GitHub
9 changed files with 78 additions and 12 deletions

View File

@@ -411,6 +411,18 @@
</select> </select>
</div> </div>
</div> </div>
@if (_rendermode == RenderModes.Static)
{
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="enhancednavigation" HelpText="Indicates if enhanced navigation should be used with static rendering" ResourceKey="EnhancedNavigation">Enhanced Navigation: </Label>
<div class="col-sm-9">
<select id="enhancednavigation" class="form-select" @bind="@_enhancednavigation" required>
<option value="True">@SharedLocalizer["Yes"]</option>
<option value="False">@SharedLocalizer["No"]</option>
</select>
</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 render mode for UI components which require interactivity" ResourceKey="Runtime">Interactivity: </Label> <Label Class="col-sm-3" For="runtime" HelpText="The render mode for UI components which require interactivity" ResourceKey="Runtime">Interactivity: </Label>
<div class="col-sm-9"> <div class="col-sm-9">
@@ -537,6 +549,7 @@
private string _defaultalias; private string _defaultalias;
private string _rendermode = RenderModes.Interactive; private string _rendermode = RenderModes.Interactive;
private string _enhancednavigation = "True";
private string _runtime = Runtimes.Server; private string _runtime = Runtimes.Server;
private string _prerender = "True"; private string _prerender = "True";
private string _hybrid = "False"; private string _hybrid = "False";
@@ -660,6 +673,7 @@
// hosting model // hosting model
_rendermode = site.RenderMode; _rendermode = site.RenderMode;
_enhancednavigation = site.EnhancedNavigation.ToString();
_runtime = site.Runtime; _runtime = site.Runtime;
_prerender = site.Prerender.ToString(); _prerender = site.Prerender.ToString();
_hybrid = site.Hybrid.ToString(); _hybrid = site.Hybrid.ToString();
@@ -807,13 +821,11 @@
// hosting model // hosting model
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
{ {
if (site.RenderMode != _rendermode || site.Runtime != _runtime || site.Prerender != bool.Parse(_prerender) || site.Hybrid != bool.Parse(_hybrid)) site.RenderMode = _rendermode;
{ site.EnhancedNavigation = bool.Parse(_enhancednavigation);
site.RenderMode = _rendermode; site.Runtime = _runtime;
site.Runtime = _runtime; site.Prerender = bool.Parse(_prerender);
site.Prerender = bool.Parse(_prerender); site.Hybrid = bool.Parse(_hybrid);
site.Hybrid = bool.Parse(_hybrid);
}
} }
site = await SiteService.UpdateSiteAsync(site); site = await SiteService.UpdateSiteAsync(site);

View File

@@ -460,6 +460,11 @@ namespace Oqtane.Modules
public string ReplaceTokens(string content, object obj) public string ReplaceTokens(string content, object obj)
{ {
// check for null or empty content
if (string.IsNullOrEmpty(content))
{
return content;
}
// Using StringBuilder avoids the performance penalty of repeated string allocations // Using StringBuilder avoids the performance penalty of repeated string allocations
// that occur with string.Replace or string concatenation inside loops. // that occur with string.Replace or string concatenation inside loops.
var sb = new StringBuilder(); var sb = new StringBuilder();

View File

@@ -31,7 +31,7 @@
<dependency id="MySql.Data" version="9.5.0" exclude="Build,Analyzers" /> <dependency id="MySql.Data" version="9.5.0" exclude="Build,Analyzers" />
<dependency id="Pomelo.EntityFrameworkCore.MySql" version="9.0.0" exclude="Build,Analyzers" /> <dependency id="Pomelo.EntityFrameworkCore.MySql" version="9.0.0" exclude="Build,Analyzers" />
<dependency id="EFCore.NamingConventions" version="10.0.0-rc.2" exclude="Build,Analyzers" /> <dependency id="EFCore.NamingConventions" version="10.0.0-rc.2" exclude="Build,Analyzers" />
<dependency id="Npgsql.EntityFrameworkCore.PostgreSQL" version="10.0.0-rc.2" exclude="Build,Analyzers" /> <dependency id="Npgsql.EntityFrameworkCore.PostgreSQL" version="10.0.0" exclude="Build,Analyzers" />
<dependency id="Microsoft.EntityFrameworkCore.Sqlite" version="10.0.0" exclude="Build,Analyzers" /> <dependency id="Microsoft.EntityFrameworkCore.Sqlite" version="10.0.0" exclude="Build,Analyzers" />
<dependency id="Microsoft.Data.Sqlite.Core" version="10.0.0" exclude="Build,Analyzers" /> <dependency id="Microsoft.Data.Sqlite.Core" version="10.0.0" exclude="Build,Analyzers" />
<dependency id="Microsoft.EntityFrameworkCore.SqlServer" version="10.0.0" exclude="Build,Analyzers" /> <dependency id="Microsoft.EntityFrameworkCore.SqlServer" version="10.0.0" exclude="Build,Analyzers" />

View File

@@ -60,7 +60,7 @@
} }
@((MarkupString)_headResources) @((MarkupString)_headResources)
</head> </head>
<body> <body data-enhance-nav="@_enhancedNavigation.ToString().ToLower()">
@if (string.IsNullOrEmpty(_message)) @if (string.IsNullOrEmpty(_message))
{ {
@if (_renderMode == RenderModes.Static) @if (_renderMode == RenderModes.Static)
@@ -97,6 +97,7 @@
private string _renderMode = RenderModes.Interactive; private string _renderMode = RenderModes.Interactive;
private string _runtime = Runtimes.Server; private string _runtime = Runtimes.Server;
private bool _prerender = true; private bool _prerender = true;
private bool _enhancedNavigation = true;
private string _fingerprint = ""; private string _fingerprint = "";
private int _visitorId = -1; private int _visitorId = -1;
private string _antiForgeryToken = ""; private string _antiForgeryToken = "";
@@ -141,6 +142,7 @@
_renderMode = site.RenderMode; _renderMode = site.RenderMode;
_runtime = site.Runtime; _runtime = site.Runtime;
_prerender = site.Prerender; _prerender = site.Prerender;
_enhancedNavigation = site.EnhancedNavigation;
_fingerprint = site.Fingerprint; _fingerprint = site.Fingerprint;
var cookieConsentSettings = SettingService.GetSetting(site.Settings, "CookieConsent", string.Empty); var cookieConsentSettings = SettingService.GetSetting(site.Settings, "CookieConsent", string.Empty);

View File

@@ -265,7 +265,19 @@ namespace Oqtane.Controllers
_syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); _syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
// set user personalized page path // set user personalized page path
_settings.AddSetting(new Setting { EntityName = EntityNames.User, EntityId = page.UserId.Value, SettingName = $"PersonalizedPagePath:{page.SiteId}:{parent.PageId}", SettingValue = path, IsPrivate = false }); var settingName = $"PersonalizedPagePath:{page.SiteId}:{parent.PageId}";
var pathSetting = _settings.GetSetting(EntityNames.User, page.UserId.Value, settingName);
if(pathSetting == null)
{
pathSetting = new Setting { EntityName = EntityNames.User, EntityId = page.UserId.Value, SettingName = settingName, SettingValue = path, IsPrivate = false };
_settings.AddSetting(pathSetting);
}
else
{
pathSetting.SettingValue = path;
_settings.UpdateSetting(pathSetting);
}
_syncManager.AddSyncEvent(_alias, EntityNames.User, user.UserId, SyncEventActions.Update); _syncManager.AddSyncEvent(_alias, EntityNames.User, user.UserId, SyncEventActions.Update);
} }
} }

View File

@@ -279,7 +279,7 @@ namespace Oqtane.Managers
await _identityUserManager.UpdateAsync(identityuser); // security stamp not updated await _identityUserManager.UpdateAsync(identityuser); // security stamp not updated
} }
if (bool.Parse(_settings.GetSettingValue(EntityNames.Site, alias.SiteId, "LoginOptions:RequireConfirmedEmail", "true"))) if (bool.Parse(_settings.GetSettingValue(EntityNames.Site, alias.SiteId, "LoginOptions:RequireConfirmedEmail", "true")) && !user.IsDeleted)
{ {
if (user.EmailConfirmed) if (user.EmailConfirmed)
{ {

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Oqtane.Databases.Interfaces;
using Oqtane.Migrations.EntityBuilders;
using Oqtane.Repository;
namespace Oqtane.Migrations.Tenant
{
[DbContext(typeof(TenantDBContext))]
[Migration("Tenant.10.00.01.01")]
public class AddSiteEnhancedNavigation : MultiDatabaseMigration
{
public AddSiteEnhancedNavigation(IDatabase database) : base(database)
{
}
protected override void Up(MigrationBuilder migrationBuilder)
{
var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase);
siteEntityBuilder.AddBooleanColumn("EnhancedNavigation", true);
siteEntityBuilder.UpdateData("EnhancedNavigation", true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
// not implemented
}
}
}

View File

@@ -43,7 +43,7 @@
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" />
<!-- PostgreSQL Database Provider Dependencies --> <!-- PostgreSQL Database Provider Dependencies -->
<PackageReference Include="EFCore.NamingConventions" Version="10.0.0-rc.2" /> <PackageReference Include="EFCore.NamingConventions" Version="10.0.0-rc.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0-rc.2" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0" />
<!-- SQLite Database Provider Dependencies --> <!-- SQLite Database Provider Dependencies -->
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.0" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="10.0.0" /> <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="10.0.0" />

View File

@@ -115,6 +115,11 @@ namespace Oqtane.Models
/// </summary> /// </summary>
public bool Hybrid { get; set; } public bool Hybrid { get; set; }
/// <summary>
/// Indicates if enhanced navigation should be used with static rendering
/// </summary>
public bool EnhancedNavigation { 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
/// </summary> /// </summary>
@@ -222,6 +227,7 @@ namespace Oqtane.Models
Runtime = Runtime, Runtime = Runtime,
Prerender = Prerender, Prerender = Prerender,
Hybrid = Hybrid, Hybrid = Hybrid,
EnhancedNavigation = EnhancedNavigation,
Version = Version, Version = Version,
HomePageId = HomePageId, HomePageId = HomePageId,
HeadContent = HeadContent, HeadContent = HeadContent,