diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index ae722343..b5bfa662 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -85,6 +85,15 @@ +
+ +
+ +
+
@@ -96,9 +105,9 @@
- +
- +
@@ -125,21 +134,12 @@
- +
- +
-
- -
- -
-
- +
} @@ -170,7 +170,6 @@ private List _containers = new List(); private string _name; private string _title; - private string _meta; private string _path = string.Empty; private string _parentid = "-1"; private string _insert = ">>"; @@ -182,7 +181,8 @@ private string _ispersonalizable = "False"; private string _themetype = string.Empty; private string _containertype = string.Empty; - private string _icon = string.Empty; + private string _headcontent; + private string _icon = string.Empty; private string _permissions = null; private PermissionGrid _permissionGrid; private Type _themeSettingsType; @@ -376,11 +376,11 @@ { page.DefaultContainerType = string.Empty; } - page.Icon = (_icon == null ? string.Empty : _icon); + page.HeadContent = _headcontent; + page.Icon = (_icon == null ? string.Empty : _icon); page.PermissionList = _permissionGrid.GetPermissionList(); page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable)); page.UserId = null; - page.Meta = _meta; page = await PageService.AddPageAsync(page); await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId); diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 4f0c1166..77920ad7 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -93,6 +93,15 @@ +
+ +
+ +
+
@@ -103,9 +112,9 @@
- +
- +
@@ -132,18 +141,9 @@
- +
- -
-
-
- -
- +
@@ -207,8 +207,7 @@ private int _pageId; private string _name; private string _title; - private string _meta; - private string _path; + private string _path; private string _currentparentid; private string _parentid = "-1"; private string _insert = "="; @@ -220,7 +219,8 @@ private string _ispersonalizable; private string _themetype; private string _containertype = "-"; - private string _icon; + private string _headcontent; + private string _icon; private List _permissions = null; private string _createdby; private DateTime _createdon; @@ -250,7 +250,6 @@ { _name = page.Name; _title = page.Title; - _meta = page.Meta; _path = page.Path; _pageModules = PageState.Modules.Where(m => m.PageId == page.PageId).ToList(); @@ -291,7 +290,8 @@ { _containertype = PageState.Site.DefaultContainerType; } - _icon = page.Icon; + _headcontent = page.HeadContent; + _icon = page.Icon; _permissions = page.PermissionList; _createdby = page.CreatedBy; _createdon = page.CreatedOn; @@ -508,11 +508,11 @@ { page.DefaultContainerType = string.Empty; } - page.Icon = _icon ?? string.Empty; + page.HeadContent = _headcontent; + page.Icon = _icon ?? string.Empty; page.PermissionList = _permissionGrid.GetPermissionList(); page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable)); page.UserId = null; - page.Meta = _meta; page = await PageService.UpdatePageAsync(page); await PageService.UpdatePageOrderAsync(page.SiteId, page.PageId, page.ParentId); diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index bc7a68e2..52ac9445 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -22,6 +22,39 @@ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
@@ -72,36 +105,12 @@
- +
- +
-
- -
- -
-
-
- -
- -
-
- +
@@ -306,221 +315,224 @@ } @code { - private ElementReference form; - private bool validated = false; - private bool _initialized = false; - private List _themeList; - private List _themes = new List(); - private List _containers = new List(); - private string _name = string.Empty; - private List _aliases; - private int _aliasid = -1; - private string _aliasname; - private string _defaultalias; - private string _runtime = ""; - private string _prerender = ""; - private int _logofileid = -1; - private FileManager _logofilemanager; - private int _faviconfileid = -1; - private FileManager _faviconfilemanager; - private string _themetype = "-"; - private string _containertype = "-"; - private string _admincontainertype = "-"; - private string _homepageid = "-"; - private string _sitemap = ""; - private string _smtphost = string.Empty; - private string _smtpport = string.Empty; - private string _smtpssl = "False"; - private string _smtpusername = string.Empty; - private string _smtppassword = string.Empty; - private string _smtppasswordtype = "password"; - private string _togglesmtppassword = string.Empty; - private string _smtpsender = string.Empty; - private string _smtprelay = "False"; - private string _retention = string.Empty; - private string _pwaisenabled; - private int _pwaappiconfileid = -1; - private FileManager _pwaappiconfilemanager; - private int _pwasplashiconfileid = -1; - private FileManager _pwasplashiconfilemanager; - private string _tenant = string.Empty; - private string _database = string.Empty; - private string _connectionstring = string.Empty; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; - private string _deletedby; - private DateTime? _deletedon; - private string _isdeleted; + private ElementReference form; + private bool validated = false; + private bool _initialized = false; + private List _themeList; + private List _themes = new List(); + private List _containers = new List(); + private string _name = string.Empty; + private List _aliases; + private int _aliasid = -1; + private string _aliasname; + private string _defaultalias; + private string _runtime = ""; + private string _prerender = ""; + private int _logofileid = -1; + private FileManager _logofilemanager; + private int _faviconfileid = -1; + private FileManager _faviconfilemanager; + private string _themetype = "-"; + private string _containertype = "-"; + private string _admincontainertype = "-"; + private string _headcontent = string.Empty; + private string _homepageid = "-"; + private string _sitemap = ""; + private string _smtphost = string.Empty; + private string _smtpport = string.Empty; + private string _smtpssl = "False"; + private string _smtpusername = string.Empty; + private string _smtppassword = string.Empty; + private string _smtppasswordtype = "password"; + private string _togglesmtppassword = string.Empty; + private string _smtpsender = string.Empty; + private string _smtprelay = "False"; + private string _retention = string.Empty; + private string _pwaisenabled; + private int _pwaappiconfileid = -1; + private FileManager _pwaappiconfilemanager; + private int _pwasplashiconfileid = -1; + private FileManager _pwasplashiconfilemanager; + private string _tenant = string.Empty; + private string _database = string.Empty; + private string _connectionstring = string.Empty; + private string _createdby; + private DateTime _createdon; + private string _modifiedby; + private DateTime _modifiedon; + private string _deletedby; + private DateTime? _deletedon; + private string _isdeleted; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnInitializedAsync() - { - try - { - _themeList = await ThemeService.GetThemesAsync(); - Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); - if (site != null) - { - _name = site.Name; - _runtime = site.Runtime; - _prerender = site.RenderMode.Replace(_runtime, ""); - _isdeleted = site.IsDeleted.ToString(); - _sitemap = PageState.Alias.Protocol + PageState.Alias.Name + "/pages/sitemap.xml"; + protected override async Task OnInitializedAsync() + { + try + { + _themeList = await ThemeService.GetThemesAsync(); + Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); + if (site != null) + { + _name = site.Name; + _runtime = site.Runtime; + _prerender = site.RenderMode.Replace(_runtime, ""); + _isdeleted = site.IsDeleted.ToString(); + _sitemap = PageState.Alias.Protocol + PageState.Alias.Name + "/pages/sitemap.xml"; - await GetAliases(); + await GetAliases(); - if (site.LogoFileId != null) - { - _logofileid = site.LogoFileId.Value; - } + if (site.LogoFileId != null) + { + _logofileid = site.LogoFileId.Value; + } - if (site.FaviconFileId != null) - { - _faviconfileid = site.FaviconFileId.Value; - } + if (site.FaviconFileId != null) + { + _faviconfileid = site.FaviconFileId.Value; + } - _themes = ThemeService.GetThemeControls(_themeList); - _themetype = (!string.IsNullOrEmpty(site.DefaultThemeType)) ? site.DefaultThemeType : Constants.DefaultTheme; - _containers = ThemeService.GetContainerControls(_themeList, _themetype); - _containertype = (!string.IsNullOrEmpty(site.DefaultContainerType)) ? site.DefaultContainerType : Constants.DefaultContainer; - _admincontainertype = (!string.IsNullOrEmpty(site.AdminContainerType)) ? site.AdminContainerType : Constants.DefaultAdminContainer; + _themes = ThemeService.GetThemeControls(_themeList); + _themetype = (!string.IsNullOrEmpty(site.DefaultThemeType)) ? site.DefaultThemeType : Constants.DefaultTheme; + _containers = ThemeService.GetContainerControls(_themeList, _themetype); + _containertype = (!string.IsNullOrEmpty(site.DefaultContainerType)) ? site.DefaultContainerType : Constants.DefaultContainer; + _admincontainertype = (!string.IsNullOrEmpty(site.AdminContainerType)) ? site.AdminContainerType : Constants.DefaultAdminContainer; + _headcontent = site.HeadContent; - if (site.HomePageId != null) - { - _homepageid = site.HomePageId.Value.ToString(); - } + if (site.HomePageId != null) + { + _homepageid = site.HomePageId.Value.ToString(); + } - _pwaisenabled = site.PwaIsEnabled.ToString(); - if (site.PwaAppIconFileId != null) - { - _pwaappiconfileid = site.PwaAppIconFileId.Value; - } - if (site.PwaSplashIconFileId != null) - { - _pwasplashiconfileid = site.PwaSplashIconFileId.Value; - } + _pwaisenabled = site.PwaIsEnabled.ToString(); + if (site.PwaAppIconFileId != null) + { + _pwaappiconfileid = site.PwaAppIconFileId.Value; + } + if (site.PwaSplashIconFileId != null) + { + _pwasplashiconfileid = site.PwaSplashIconFileId.Value; + } - var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); - _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); - _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); - _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); - _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); - _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); - _togglesmtppassword = SharedLocalizer["ShowPassword"]; - _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); - _smtprelay = SettingService.GetSetting(settings, "SMTPRelay", "False"); - _retention = SettingService.GetSetting(settings, "NotificationRetention", "30"); + var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); + _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); + _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); + _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); + _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); + _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); + _togglesmtppassword = SharedLocalizer["ShowPassword"]; + _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); + _smtprelay = SettingService.GetSetting(settings, "SMTPRelay", "False"); + _retention = SettingService.GetSetting(settings, "NotificationRetention", "30"); - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - var tenants = await TenantService.GetTenantsAsync(); - var _databases = await DatabaseService.GetDatabasesAsync(); - var tenant = tenants.Find(item => item.TenantId == site.TenantId); - if (tenant != null) - { - _tenant = tenant.Name; - _database = _databases.Find(item => item.DBType == tenant.DBType)?.Name; - _connectionstring = tenant.DBConnectionString; - } - } + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + var tenants = await TenantService.GetTenantsAsync(); + var _databases = await DatabaseService.GetDatabasesAsync(); + var tenant = tenants.Find(item => item.TenantId == site.TenantId); + if (tenant != null) + { + _tenant = tenant.Name; + _database = _databases.Find(item => item.DBType == tenant.DBType)?.Name; + _connectionstring = tenant.DBConnectionString; + } + } - _createdby = site.CreatedBy; - _createdon = site.CreatedOn; - _modifiedby = site.ModifiedBy; - _modifiedon = site.ModifiedOn; - _deletedby = site.DeletedBy; - _deletedon = site.DeletedOn; + _createdby = site.CreatedBy; + _createdon = site.CreatedOn; + _modifiedby = site.ModifiedBy; + _modifiedon = site.ModifiedOn; + _deletedby = site.DeletedBy; + _deletedon = site.DeletedOn; - _initialized = true; - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Site {SiteId} {Error}", PageState.Site.SiteId, ex.Message); - AddModuleMessage(ex.Message, MessageType.Error); - } - } + _initialized = true; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Site {SiteId} {Error}", PageState.Site.SiteId, ex.Message); + AddModuleMessage(ex.Message, MessageType.Error); + } + } - private async void ThemeChanged(ChangeEventArgs e) - { - try - { - _themetype = (string)e.Value; - if (_themetype != "-") - { - _containers = ThemeService.GetContainerControls(_themeList, _themetype); - } - else - { - _containers = new List(); - } - _containertype = "-"; - _admincontainertype = Constants.DefaultAdminContainer; - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage(Localizer["Error.Theme.LoadPane"], MessageType.Error); - } - } + private async void ThemeChanged(ChangeEventArgs e) + { + try + { + _themetype = (string)e.Value; + if (_themetype != "-") + { + _containers = ThemeService.GetContainerControls(_themeList, _themetype); + } + else + { + _containers = new List(); + } + _containertype = "-"; + _admincontainertype = Constants.DefaultAdminContainer; + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Containers For Theme {ThemeType} {Error}", _themetype, ex.Message); + AddModuleMessage(Localizer["Error.Theme.LoadPane"], MessageType.Error); + } + } - private async Task SaveSite() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - try - { - if (_name != string.Empty && _themetype != "-" && _containertype != "-") - { - var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); - if (site != null) - { - bool refresh = false; - bool reload = false; + private async Task SaveSite() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + try + { + if (_name != string.Empty && _themetype != "-" && _containertype != "-") + { + var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); + if (site != null) + { + bool refresh = false; + bool reload = false; - site.Name = _name; - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender) - { - site.Runtime = _runtime; - site.RenderMode = _runtime + _prerender; - reload = true; // needs to be reloaded on server - } - } - site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); + site.Name = _name; + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender) + { + site.Runtime = _runtime; + site.RenderMode = _runtime + _prerender; + reload = true; // needs to be reloaded on server + } + } + site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); - site.LogoFileId = null; - var logofileid = _logofilemanager.GetFileId(); - if (logofileid != -1) - { - site.LogoFileId = logofileid; - } - int? faviconFieldId = _faviconfilemanager.GetFileId(); - if (faviconFieldId == -1) faviconFieldId = null; - if (site.FaviconFileId != faviconFieldId) - { - site.FaviconFileId = faviconFieldId; - reload = true; // needs to be reloaded on server - } - if (site.DefaultThemeType != _themetype) - { - site.DefaultThemeType = _themetype; - refresh = true; // needs to be refreshed on client - } - if (site.DefaultContainerType != _containertype) - { - site.DefaultContainerType = _containertype; - refresh = true; // needs to be refreshed on client - } - site.AdminContainerType = _admincontainertype; - site.HomePageId = (_homepageid != "-" ? int.Parse(_homepageid) : null); + site.LogoFileId = null; + var logofileid = _logofilemanager.GetFileId(); + if (logofileid != -1) + { + site.LogoFileId = logofileid; + } + int? faviconFieldId = _faviconfilemanager.GetFileId(); + if (faviconFieldId == -1) faviconFieldId = null; + if (site.FaviconFileId != faviconFieldId) + { + site.FaviconFileId = faviconFieldId; + reload = true; // needs to be reloaded on server + } + if (site.DefaultThemeType != _themetype) + { + site.DefaultThemeType = _themetype; + refresh = true; // needs to be refreshed on client + } + if (site.DefaultContainerType != _containertype) + { + site.DefaultContainerType = _containertype; + refresh = true; // needs to be refreshed on client + } + site.AdminContainerType = _admincontainertype; + site.HeadContent = _headcontent; + site.HomePageId = (_homepageid != "-" ? int.Parse(_homepageid) : null); if (site.PwaIsEnabled.ToString() != _pwaisenabled) { diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx index 3b2128c2..85b92768 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx @@ -228,11 +228,11 @@ Appearance - - Optionally enter meta tags (in exactly the form you want them to be included in the page output). + + Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). - - Meta: + + Head Content: The page name {0} is reserved. Please enter a different name for your page. diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx index 32ffa56e..184b4af4 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx @@ -264,11 +264,11 @@ Clickable? - - Optionally enter meta tags (in exactly the form you want them to be included in the page output). + + Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). - - Meta: + + Head Content: The page name {0} is reserved. Please enter a different name for your page. diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 16b840c1..5b5df55c 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -351,4 +351,13 @@ Site Map: + + Appearance + + + Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). + + + Head Content: + \ No newline at end of file diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index ec2a05bf..69625df5 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -38,15 +38,14 @@ favicon = Utilities.FileUrl(PageState.Alias, PageState.Site.FaviconFileId.Value); } headcontent += $"\n"; - // PWA manifest - if (PageState.Site.PwaIsEnabled && PageState.Site.PwaAppIconFileId != null && PageState.Site.PwaSplashIconFileId != null) + // head content + if (!string.IsNullOrEmpty(PageState.Site.HeadContent)) { - headcontent += "\n"; + headcontent += PageState.Site.HeadContent + "\n"; } - // meta - if (!string.IsNullOrEmpty(PageState.Page.Meta)) + if (!string.IsNullOrEmpty(PageState.Page.HeadContent)) { - headcontent += PageState.Page.Meta + "\n"; + headcontent += PageState.Page.HeadContent + "\n"; } // stylesheets foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) @@ -54,6 +53,11 @@ var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url; headcontent += CreateLink(url, resource.Integrity, resource.CrossOrigin) + "\n"; } + // PWA manifest + if (PageState.Site.PwaIsEnabled && PageState.Site.PwaAppIconFileId != null && PageState.Site.PwaSplashIconFileId != null) + { + headcontent += "\n"; + } SiteState.Properties.HeadContent = headcontent; // set page body content diff --git a/Oqtane.Server/Migrations/Tenant/04000001_AddHeadContent.cs b/Oqtane.Server/Migrations/Tenant/04000001_AddHeadContent.cs new file mode 100644 index 00000000..fcb4bd1a --- /dev/null +++ b/Oqtane.Server/Migrations/Tenant/04000001_AddHeadContent.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Components.Web; +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.04.00.00.01")] + public class AddHeaderContent : MultiDatabaseMigration + { + public AddHeaderContent(IDatabase database) : base(database) + { + } + + protected override void Up(MigrationBuilder migrationBuilder) + { + var siteEntityBuilder = new SiteEntityBuilder(migrationBuilder, ActiveDatabase); + siteEntityBuilder.AddStringColumn("HeadContent", 4000, true); + + var pageEntityBuilder = new PageEntityBuilder(migrationBuilder, ActiveDatabase); + pageEntityBuilder.AddStringColumn("HeadContent", 4000, true); + + pageEntityBuilder.UpdateColumn("HeadContent", "Meta"); + pageEntityBuilder.DropColumn("Meta"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + // not implemented + } + } +} diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs index 9298f46b..fd8191b3 100644 --- a/Oqtane.Shared/Models/Page.cs +++ b/Oqtane.Shared/Models/Page.cs @@ -65,9 +65,9 @@ namespace Oqtane.Models public string DefaultContainerType { get; set; } /// - /// Meta tags to be included in the head of the page + /// Content to be included in the head of the page /// - public string Meta { get; set; } + public string HeadContent { get; set; } /// /// Icon file for this page. diff --git a/Oqtane.Shared/Models/Site.cs b/Oqtane.Shared/Models/Site.cs index 3becda88..383b5668 100644 --- a/Oqtane.Shared/Models/Site.cs +++ b/Oqtane.Shared/Models/Site.cs @@ -79,7 +79,7 @@ namespace Oqtane.Models public string RenderMode { get; set; } /// - /// Keeps track of site configuration changes and is used by the IUpgradeable interface + /// Keeps track of site configuration changes and is used by the ISiteMigration interface /// public string Version { get; set; } @@ -88,6 +88,11 @@ namespace Oqtane.Models /// public int? HomePageId { get; set; } + /// + /// Content to be included in the head of the page + /// + public string HeadContent { get; set; } + [NotMapped] public Dictionary Settings { get; set; }