From 11002efc02aa25fc92bf4f28c1fa661678526cfc Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 14 Jan 2022 13:26:24 -0500 Subject: [PATCH] hide deleted pages in Admin Dashboard, impove Settings API by replacing IsPublic with IsPrivate, isolate Setting updates to not affect PageState, make Pager horizintally scrollable on narrow viewports, improve LocalizableComponent to support embedded controls --- .../Modules/Admin/Dashboard/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Logs/Index.razor | 4 +- .../Modules/Admin/ModuleCreator/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Site/Index.razor | 24 ++-- Oqtane.Client/Modules/Admin/Sql/Index.razor | 30 +++-- .../Modules/Admin/Visitors/Index.razor | 6 +- .../Modules/Controls/LocalizableComponent.cs | 12 +- Oqtane.Client/Modules/Controls/Pager.razor | 32 ++--- Oqtane.Client/Modules/HtmlText/Settings.razor | 65 +++++----- .../{Containers => }/ContainerSettings.resx | 116 +++++++++--------- .../{Themes => }/ThemeSettings.resx | 2 +- .../Services/Interfaces/ISettingService.cs | 2 +- Oqtane.Client/Services/SettingService.cs | 17 ++- .../Containers/ContainerSettings.razor | 73 +++++------ .../OqtaneTheme/Themes/ThemeSettings.razor | 31 ++--- Oqtane.Server/Controllers/ModuleController.cs | 4 +- Oqtane.Server/Controllers/PageController.cs | 6 +- .../Controllers/SettingController.cs | 8 +- Oqtane.Server/Controllers/SiteController.cs | 2 +- .../Tenant/03000202_UpdateSettingIsPrivate.cs | 32 +++++ Oqtane.Shared/Models/Setting.cs | 4 +- Oqtane.Shared/Shared/Utilities.cs | 5 +- 22 files changed, 260 insertions(+), 219 deletions(-) rename Oqtane.Client/Resources/Themes/OqtaneTheme/{Containers => }/ContainerSettings.resx (51%) rename Oqtane.Client/Resources/Themes/OqtaneTheme/{Themes => }/ThemeSettings.resx (99%) create mode 100644 Oqtane.Server/Migrations/Tenant/03000202_UpdateSettingIsPrivate.cs diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index 6c665ba2..3e3eb82c 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -27,6 +27,6 @@ protected override void OnInitialized() { var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin"); - _pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId).ToList(); + _pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId && !item.IsDeleted).ToList(); } } diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index 7a30893d..853409cb 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -195,8 +195,8 @@ else { try { - var settings = PageState.Site.Settings; - settings = SettingService.SetSetting(settings, "LogRetention", _retention); + var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); + settings = SettingService.SetSetting(settings, "LogRetention", _retention, true); await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success); diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index 27f32ea7..d81480b5 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -128,7 +128,7 @@ else var moduleDefinition = new ModuleDefinition { Owner = _owner, Name = _module, Description = _description, Template = _template, Version = _reference }; moduleDefinition = await ModuleDefinitionService.CreateModuleDefinitionAsync(moduleDefinition); - var settings = ModuleState.Settings; + var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); SettingService.SetSetting(settings, "ModuleDefinitionName", moduleDefinition.ModuleDefinitionName); await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 63ce2afc..63f22032 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -479,12 +479,12 @@ site = await SiteService.UpdateSiteAsync(site); var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); - SettingService.SetSetting(settings, "SMTPHost", _smtphost, false); - SettingService.SetSetting(settings, "SMTPPort", _smtpport, false); - SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, false); - SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, false); - SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, false); - SettingService.SetSetting(settings, "SMTPSender", _smtpsender, false); + SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); + SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); + SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); + SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); + SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); + SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId); if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) @@ -596,12 +596,12 @@ try { var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); - SettingService.SetSetting(settings, "SMTPHost", _smtphost); - SettingService.SetSetting(settings, "SMTPPort", _smtpport); - SettingService.SetSetting(settings, "SMTPSSL", _smtpssl); - SettingService.SetSetting(settings, "SMTPUsername", _smtpusername); - SettingService.SetSetting(settings, "SMTPPassword", _smtppassword); - SettingService.SetSetting(settings, "SMTPSender", _smtpsender); + SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); + SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); + SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); + SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); + SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); + SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); await logger.LogInformation("Site SMTP Settings Saved"); diff --git a/Oqtane.Client/Modules/Admin/Sql/Index.razor b/Oqtane.Client/Modules/Admin/Sql/Index.razor index b22d279e..db41daaa 100644 --- a/Oqtane.Client/Modules/Admin/Sql/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sql/Index.razor @@ -57,22 +57,20 @@ else { @if (_results.Count > 0) { -
- -
- @foreach (KeyValuePair kvp in _results.First()) - { - @kvp.Key - } -
- - @foreach (KeyValuePair kvp in context) - { - @kvp.Value - } - -
-
+ +
+ @foreach (KeyValuePair kvp in _results.First()) + { + @kvp.Key + } +
+ + @foreach (KeyValuePair kvp in context) + { + @kvp.Value + } + +
} else { diff --git a/Oqtane.Client/Modules/Admin/Visitors/Index.razor b/Oqtane.Client/Modules/Admin/Visitors/Index.razor index f0613839..a3f97ecd 100644 --- a/Oqtane.Client/Modules/Admin/Visitors/Index.razor +++ b/Oqtane.Client/Modules/Admin/Visitors/Index.razor @@ -151,9 +151,9 @@ else site.VisitorTracking = bool.Parse(_tracking); await SiteService.UpdateSiteAsync(site); - var settings = PageState.Site.Settings; - settings = SettingService.SetSetting(settings, "VisitorFilter", _filter); - settings = SettingService.SetSetting(settings, "VisitorRetention", _retention); + var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); + settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true); + settings = SettingService.SetSetting(settings, "VisitorRetention", _retention, true); await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success); diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index 773df857..711504c6 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -13,6 +13,9 @@ namespace Oqtane.Modules.Controls [Parameter] public string ResourceKey { get; set; } + [Parameter] + public string ResourceType { get; set; } + protected bool IsLocalizable { get; private set; } protected string Localize(string name) => _localizer?[name] ?? name; @@ -50,9 +53,14 @@ namespace Oqtane.Modules.Controls { IsLocalizable = false; - if (!String.IsNullOrEmpty(ResourceKey) && ModuleState?.ModuleType != null) + if (string.IsNullOrEmpty(ResourceType)) { - var moduleType = Type.GetType(ModuleState.ModuleType); + ResourceType = ModuleState?.ModuleType; + } + + if (!String.IsNullOrEmpty(ResourceKey) && !string.IsNullOrEmpty(ResourceType)) + { + var moduleType = Type.GetType(ResourceType); if (moduleType != null) { using (var scope = ServiceActivator.GetScope()) diff --git a/Oqtane.Client/Modules/Controls/Pager.razor b/Oqtane.Client/Modules/Controls/Pager.razor index bd491d1f..99dbc1ca 100644 --- a/Oqtane.Client/Modules/Controls/Pager.razor +++ b/Oqtane.Client/Modules/Controls/Pager.razor @@ -54,21 +54,23 @@ } @if (Format == "Table" && Row != null) { - - - @Header - - - @foreach (var item in ItemList) - { - @Row(item) - @if (Detail != null) - { - @Detail(item) - } - } - -
+
+ + + @Header + + + @foreach (var item in ItemList) + { + @Row(item) + @if (Detail != null) + { + @Detail(item) + } + } + +
+
} @if (Format == "Grid" && Row != null) { diff --git a/Oqtane.Client/Modules/HtmlText/Settings.razor b/Oqtane.Client/Modules/HtmlText/Settings.razor index 8aab9c77..237049a6 100644 --- a/Oqtane.Client/Modules/HtmlText/Settings.razor +++ b/Oqtane.Client/Modules/HtmlText/Settings.razor @@ -5,44 +5,45 @@ @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer -
-
- -
- -
+
+
+ +
+
+
- @code { - private string _allowfilemanagement; +@code { + private string resourceType = "Oqtane.Modules.HtmlText.Settings, Oqtane.Client"; // for localization + private string _allowfilemanagement; - protected override void OnInitialized() + protected override void OnInitialized() + { + try { - try - { - _allowfilemanagement = SettingService.GetSetting(ModuleState.Settings, "AllowFileManagement", "true"); - } - catch (Exception ex) - { - ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); - } + _allowfilemanagement = SettingService.GetSetting(ModuleState.Settings, "AllowFileManagement", "true"); } - - public async Task UpdateSettings() + catch (Exception ex) { - try - { - var settings = ModuleState.Settings; - settings = SettingService.SetSetting(settings, "AllowFileManagement", _allowfilemanagement); - await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); - } - catch (Exception ex) - { - ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); - } + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); } } + + public async Task UpdateSettings() + { + try + { + var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + settings = SettingService.SetSetting(settings, "AllowFileManagement", _allowfilemanagement); + await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Resources/Themes/OqtaneTheme/Containers/ContainerSettings.resx b/Oqtane.Client/Resources/Themes/OqtaneTheme/ContainerSettings.resx similarity index 51% rename from Oqtane.Client/Resources/Themes/OqtaneTheme/Containers/ContainerSettings.resx rename to Oqtane.Client/Resources/Themes/OqtaneTheme/ContainerSettings.resx index 4c05a1fb..1e4a939f 100644 --- a/Oqtane.Client/Resources/Themes/OqtaneTheme/Containers/ContainerSettings.resx +++ b/Oqtane.Client/Resources/Themes/OqtaneTheme/ContainerSettings.resx @@ -1,65 +1,65 @@  - + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + diff --git a/Oqtane.Client/Resources/Themes/OqtaneTheme/Themes/ThemeSettings.resx b/Oqtane.Client/Resources/Themes/OqtaneTheme/ThemeSettings.resx similarity index 99% rename from Oqtane.Client/Resources/Themes/OqtaneTheme/Themes/ThemeSettings.resx rename to Oqtane.Client/Resources/Themes/OqtaneTheme/ThemeSettings.resx index 7d8c7c4d..7200f2dd 100644 --- a/Oqtane.Client/Resources/Themes/OqtaneTheme/Themes/ThemeSettings.resx +++ b/Oqtane.Client/Resources/Themes/OqtaneTheme/ThemeSettings.resx @@ -121,7 +121,7 @@ Specify if a Footer pane should always be displayed in a fixed location at the bottom of the page. - Display Footer? + Display Fixed Footer? Specify if a Login option should be displayed, Note that this option does not prevent the login page from being accessible via a direct url. diff --git a/Oqtane.Client/Services/Interfaces/ISettingService.cs b/Oqtane.Client/Services/Interfaces/ISettingService.cs index e02261f8..60099fd5 100644 --- a/Oqtane.Client/Services/Interfaces/ISettingService.cs +++ b/Oqtane.Client/Services/Interfaces/ISettingService.cs @@ -206,7 +206,7 @@ namespace Oqtane.Services /// Dictionary SetSetting(Dictionary settings, string settingName, string settingValue); - Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPublic); + Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPrivate); Dictionary MergeSettings(Dictionary settings1, Dictionary settings2); diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index f67d585d..8f25bbaf 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -131,12 +131,12 @@ namespace Oqtane.Services foreach (KeyValuePair kvp in settings) { string value = kvp.Value; - bool ispublic = true; + bool isprivate = false; if (value.StartsWith("[Private]")) { value = value.Substring(9); // remove [Private] - ispublic = false; + isprivate = true; } Setting setting = settingsList.FirstOrDefault(item => item.SettingName.Equals(kvp.Key, StringComparison.OrdinalIgnoreCase)); @@ -147,22 +147,21 @@ namespace Oqtane.Services setting.EntityId = entityId; setting.SettingName = kvp.Key; setting.SettingValue = value; - setting.IsPublic = ispublic; + setting.IsPrivate = isprivate; setting = await AddSettingAsync(setting); } else { - if (setting.SettingValue != value || setting.IsPublic != ispublic) + if (setting.SettingValue != value) { setting.SettingValue = value; - setting.IsPublic = ispublic; + setting.IsPrivate = isprivate; setting = await UpdateSettingAsync(setting); } } } } - public async Task GetSettingAsync(string entityName, int settingId) { return await GetJsonAsync($"{Apiurl}/{settingId}/{entityName}"); @@ -196,16 +195,16 @@ namespace Oqtane.Services public Dictionary SetSetting(Dictionary settings, string settingName, string settingValue) { - return SetSetting(settings, settingName, settingValue, true); + return SetSetting(settings, settingName, settingValue, false); } - public Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPublic) + public Dictionary SetSetting(Dictionary settings, string settingName, string settingValue, bool isPrivate) { if (settings == null) { settings = new Dictionary(); } - settingValue = (isPublic) ? settingValue : "[Private]" + settingValue; + settingValue = (isPrivate) ? "[Private]" + settingValue : settingValue; if (settings.ContainsKey(settingName)) { settings[settingName] = settingValue; diff --git a/Oqtane.Client/Themes/OqtaneTheme/Containers/ContainerSettings.razor b/Oqtane.Client/Themes/OqtaneTheme/Containers/ContainerSettings.razor index 44e41bbd..b0c7774f 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Containers/ContainerSettings.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Containers/ContainerSettings.razor @@ -6,7 +6,7 @@
- +
@@ -31,7 +31,7 @@
- +
@@ -65,41 +65,42 @@
- @code { - private string _title = "true"; - private string _background = ""; - private string _text = ""; - private string _border = ""; +@code { + private string resourceType = "Oqtane.Themes.OqtaneTheme.ContainerSettings, Oqtane.Client"; // for localization + private string _title = "true"; + private string _background = ""; + private string _text = ""; + private string _border = ""; - protected override void OnInitialized() + protected override void OnInitialized() + { + try { - try - { - _title = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Title", "true"); - _background = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Background", ""); - _text = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Text", ""); - _border = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Border", ""); - } - catch (Exception ex) - { - ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); - } + _title = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Title", "true"); + _background = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Background", ""); + _text = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Text", ""); + _border = SettingService.GetSetting(ModuleState.Settings, GetType().Namespace + ":Border", ""); } - - public async Task UpdateSettings() + catch (Exception ex) { - try - { - var settings = ModuleState.Settings; - settings = SettingService.SetSetting(settings, GetType().Namespace + ":Title", _title); - settings = SettingService.SetSetting(settings, GetType().Namespace + ":Background", _background); - settings = SettingService.SetSetting(settings, GetType().Namespace + ":Text", _text); - settings = SettingService.SetSetting(settings, GetType().Namespace + ":Border", _border); - await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); - } - catch (Exception ex) - { - ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); - } + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); } } + + public async Task UpdateSettings() + { + try + { + var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + settings = SettingService.SetSetting(settings, GetType().Namespace + ":Title", _title); + settings = SettingService.SetSetting(settings, GetType().Namespace + ":Background", _background); + settings = SettingService.SetSetting(settings, GetType().Namespace + ":Text", _text); + settings = SettingService.SetSetting(settings, GetType().Namespace + ":Border", _border); + await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage(ex.Message, MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor index ecebce19..25f03f45 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor +++ b/Oqtane.Client/Themes/OqtaneTheme/Themes/ThemeSettings.razor @@ -8,7 +8,7 @@
- +
@@ -30,7 +30,7 @@
- +
@@ -52,16 +52,17 @@
@code { - private string _scope = "page"; - private string _login = "-"; - private string _register = "-"; - private string _footer = "-"; + private string resourceType = "Oqtane.Themes.OqtaneTheme.ThemeSettings, Oqtane.Client"; // for localization + private string _scope = "page"; + private string _login = "-"; + private string _register = "-"; + private string _footer = "-"; - protected override async Task OnInitializedAsync() - { - try - { - await LoadSettings(); + protected override async Task OnInitializedAsync() + { + try + { + await LoadSettings(); } catch (Exception ex) { @@ -110,7 +111,7 @@ { if (_scope == "site") { - var settings = PageState.Site.Settings; + var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); if (_login != "-") { settings = SettingService.SetSetting(settings, GetType().Namespace + ":Login", _login, true); @@ -127,7 +128,7 @@ } else { - var settings = PageState.Page.Settings; + var settings = await SettingService.GetPageSettingsAsync(PageState.Page.PageId); if (_login != "-") { settings = SettingService.SetSetting(settings, GetType().Namespace + ":Login", _login); diff --git a/Oqtane.Server/Controllers/ModuleController.cs b/Oqtane.Server/Controllers/ModuleController.cs index cfcad970..100f30ad 100644 --- a/Oqtane.Server/Controllers/ModuleController.cs +++ b/Oqtane.Server/Controllers/ModuleController.cs @@ -75,7 +75,7 @@ namespace Oqtane.Controllers module.ModuleDefinition = moduledefinitions.Find(item => item.ModuleDefinitionName == module.ModuleDefinitionName); module.Settings = settings.Where(item => item.EntityId == pagemodule.ModuleId) - .Where(item => item.IsPublic || _userPermissions.IsAuthorized(User, PermissionNames.Edit, pagemodule.Module.Permissions)) + .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, pagemodule.Module.Permissions)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); modules.Add(module); @@ -102,7 +102,7 @@ namespace Oqtane.Controllers List moduledefinitions = _moduleDefinitions.GetModuleDefinitions(module.SiteId).ToList(); module.ModuleDefinition = moduledefinitions.Find(item => item.ModuleDefinitionName == module.ModuleDefinitionName); module.Settings = _settings.GetSettings(EntityNames.Module, id) - .Where(item => item.IsPublic || _userPermissions.IsAuthorized(User, PermissionNames.Edit, module.Permissions)) + .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, module.Permissions)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); return module; } diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index a0bf6213..5112924f 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -57,7 +57,7 @@ namespace Oqtane.Controllers if (_userPermissions.IsAuthorized(User, PermissionNames.View, page.Permissions)) { page.Settings = settings.Where(item => item.EntityId == page.PageId) - .Where(item => item.IsPublic || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) + .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); pages.Add(page); } @@ -89,7 +89,7 @@ namespace Oqtane.Controllers if (page != null && page.SiteId == _alias.SiteId && _userPermissions.IsAuthorized(User,PermissionNames.View, page.Permissions)) { page.Settings = _settings.GetSettings(EntityNames.Page, page.PageId) - .Where(item => item.IsPublic || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) + .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); return page; } @@ -109,7 +109,7 @@ namespace Oqtane.Controllers if (page != null && page.SiteId == _alias.SiteId && _userPermissions.IsAuthorized(User, PermissionNames.View, page.Permissions)) { page.Settings = _settings.GetSettings(EntityNames.Page, page.PageId) - .Where(item => item.IsPublic || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) + .Where(item => !item.IsPrivate || _userPermissions.IsAuthorized(User, PermissionNames.Edit, page.Permissions)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); return page; } diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index 248342ab..6165a07e 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -41,9 +41,9 @@ namespace Oqtane.Controllers if (IsAuthorized(entityName, entityId, PermissionNames.View)) { settings = _settings.GetSettings(entityName, entityId).ToList(); - if (FilterPublic(entityName, entityId)) + if (FilterPrivate(entityName, entityId)) { - settings = settings.Where(item => item.IsPublic).ToList(); + settings = settings.Where(item => !item.IsPrivate).ToList(); } } else @@ -61,7 +61,7 @@ namespace Oqtane.Controllers Setting setting = _settings.GetSetting(entityName, id); if (IsAuthorized(setting.EntityName, setting.EntityId, PermissionNames.View)) { - if (FilterPublic(entityName, id) && !setting.IsPublic) + if (FilterPrivate(entityName, id) && setting.IsPrivate) { setting = null; } @@ -199,7 +199,7 @@ namespace Oqtane.Controllers return authorized; } - private bool FilterPublic(string entityName, int entityId) + private bool FilterPrivate(string entityName, int entityId) { bool filter = false; switch (entityName) diff --git a/Oqtane.Server/Controllers/SiteController.cs b/Oqtane.Server/Controllers/SiteController.cs index 1ff066a8..9a50b91f 100644 --- a/Oqtane.Server/Controllers/SiteController.cs +++ b/Oqtane.Server/Controllers/SiteController.cs @@ -45,7 +45,7 @@ namespace Oqtane.Controllers if (site.SiteId == _alias.SiteId) { site.Settings = _settings.GetSettings(EntityNames.Site, site.SiteId) - .Where(item => item.IsPublic || User.IsInRole(RoleNames.Admin)) + .Where(item => !item.IsPrivate || User.IsInRole(RoleNames.Admin)) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); return site; } diff --git a/Oqtane.Server/Migrations/Tenant/03000202_UpdateSettingIsPrivate.cs b/Oqtane.Server/Migrations/Tenant/03000202_UpdateSettingIsPrivate.cs new file mode 100644 index 00000000..1d4f25c0 --- /dev/null +++ b/Oqtane.Server/Migrations/Tenant/03000202_UpdateSettingIsPrivate.cs @@ -0,0 +1,32 @@ +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.03.00.02.02")] + public class UpdateSettingIsPrivate : MultiDatabaseMigration + { + public UpdateSettingIsPrivate(IDatabase database) : base(database) + { + } + + protected override void Up(MigrationBuilder migrationBuilder) + { + var settingEntityBuilder = new SettingEntityBuilder(migrationBuilder, ActiveDatabase); + settingEntityBuilder.AddBooleanColumn("IsPrivate", true); + settingEntityBuilder.UpdateColumn("IsPrivate", "0", "bool", ""); + settingEntityBuilder.UpdateColumn("IsPrivate", "1", "bool", "EntityName = 'Site' AND SettingName LIKE 'SMTP%'"); + settingEntityBuilder.DropColumn("IsPublic"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + // not implemented + } + } +} diff --git a/Oqtane.Shared/Models/Setting.cs b/Oqtane.Shared/Models/Setting.cs index 37d72dbe..4b3c66b0 100644 --- a/Oqtane.Shared/Models/Setting.cs +++ b/Oqtane.Shared/Models/Setting.cs @@ -33,9 +33,9 @@ namespace Oqtane.Models public string SettingValue { get; set; } /// - /// Indicates if this setting is publicly available - only applicable to Site Settings as other entities have more granular permissions + /// Indicates if this setting is private - indicating it should be maintained on the server and not sent to the client /// - public bool IsPublic { get; set; } + public bool IsPrivate { get; set; } #region IAuditable Properties diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index b1313a7a..89b33341 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -1,7 +1,6 @@ using Oqtane.Models; using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.Globalization; using System.IO; using System.Linq; @@ -107,7 +106,7 @@ namespace Oqtane.Shared public static string ContentUrl(Alias alias, int fileId, bool asAttachment) { var aliasUrl = (alias != null && !string.IsNullOrEmpty(alias.Path)) ? "/" + alias.Path : ""; - var method = asAttachment ? "/attach":""; + var method = asAttachment ? "/attach" : ""; return $"{aliasUrl}{Constants.ContentUrl}{fileId}{method}"; } @@ -128,7 +127,7 @@ namespace Oqtane.Shared public static string TenantUrl(Alias alias, string url) { - url = (!url.StartsWith("/")) ? "/" + url : url; + url = (!url.StartsWith("/")) ? "/" + url : url; return (alias != null && !string.IsNullOrEmpty(alias.Path)) ? "/" + alias.Path + url : url; }