From ddbb08ea759d5363b5527932c1e8d186a336938a Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Fri, 22 May 2020 21:29:06 +0200 Subject: [PATCH 1/4] Control panel state persistence --- .../Themes/Controls/ControlPanel.razor | 212 +++++++++--------- 1 file changed, 108 insertions(+), 104 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index e80ca085..2da8f847 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -1,5 +1,5 @@ @namespace Oqtane.Themes.Controls -@inherits ThemeControlBase +@inherits ThemeControlBase @attribute [OqtaneIgnore] @inject NavigationManager NavigationManager @inject IUserService UserService @@ -9,8 +9,9 @@ @inject IPageService PageService @inject IPageModuleService PageModuleService @inject ILogService logger +@inject ISettingService SettingService -@if (_moduleDefinitions != null && UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions)) +@if (_moduleDefinitions != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) {
@@ -31,7 +32,7 @@
-
+
@@ -73,23 +74,23 @@
} -
+
- - @if (_moduleType == "new") + @if (ModuleType == "new") { @if (_moduleDefinitions != null) { - @((MarkupString)@_description) + @((MarkupString) Description) } } else @@ -128,7 +129,7 @@ } - @foreach (Module module in _modules) { @@ -141,13 +142,13 @@
- +
- @foreach (string pane in PageState.Page.Panes) { @@ -159,7 +160,7 @@
- @foreach (KeyValuePair container in _containers) { @@ -168,16 +169,16 @@
-
+
- @((MarkupString) _message) + @((MarkupString) Message)
} -@if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions) || (PageState.Page.IsPersonalizable && PageState.User != null)) +@if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions) || (PageState.Page.IsPersonalizable && PageState.User != null)) { @if (PageState.Page.EditMode) { @@ -202,32 +203,52 @@ } } -@if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions)) +@if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { } -@code { +@code{ + private bool _deleteConfirmation = false; - private string _moduleType = "new"; private List _categories = new List(); private List _allModuleDefinitions; private List _moduleDefinitions; private List _pages = new List(); - private string _pageId = "-"; - private string _moduleId = "-"; private List _modules = new List(); private Dictionary _containers = new Dictionary(); - private string _moduleDefinitionName = "-"; - private string _category = "Common"; - private string _description = ""; - private string _pane = ""; - private string _title = ""; - private string _containerType = ""; private string _display = "display: none;"; - private string _message = ""; + private string _category = "Common"; + + protected string PageId { get; private set; } = "-"; + protected string ModuleId { get; private set; } = "-"; + protected string ModuleType { get; private set; } = "new"; + protected string ModuleDefinitionName { get; private set; } = "-"; + + protected string Category + { + get => _category; + private set + { + if (_category != value) + { + _category = value; + _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(Category)).ToList(); + ModuleDefinitionName = "-"; + Description = ""; + StateHasChanged(); + _ = UpdateSettingsAsync(); + } + } + } + + protected string Description { get; private set; } = ""; + protected string Pane { get; private set; } = ""; + protected string Title { get; private set; } = ""; + protected string ContainerType { get; private set; } = ""; + protected string Message { get; private set; } = ""; [Parameter] public string ButtonClass { get; set; } @@ -241,7 +262,8 @@ [Parameter] public string BodyClass { get; set; } - protected override async Task OnParametersSetAsync() + + protected override async Task OnInitializedAsync() { if (string.IsNullOrEmpty(ButtonClass)) { @@ -263,131 +285,107 @@ BodyClass = "card-body"; } - if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions)) + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { _pages?.Clear(); foreach (Page p in PageState.Pages) { - if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, p.Permissions)) + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions)) { _pages.Add(p); } } + await LoadSettingsAsync(); var panes = PageState.Page.Panes; - _pane = panes.Count() == 1 ? panes.SingleOrDefault() : ""; + Pane = panes.Count() == 1 ? panes.SingleOrDefault() : ""; var themes = await ThemeService.GetThemesAsync(); _containers = ThemeService.GetContainerTypes(themes); - _containerType = PageState.Site.DefaultContainerType; + ContainerType = PageState.Site.DefaultContainerType; _allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(Category)).ToList(); - _categories = new List(); - foreach (ModuleDefinition moduledefinition in _allModuleDefinitions) - { - if (moduledefinition.Categories != "") - { - foreach (string category in moduledefinition.Categories.Split(',')) - { - if (!_categories.Contains(category)) - { - _categories.Add(category); - } - } - } - } - - _category = "Common"; - _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); - _moduleDefinitionName = "-"; - _description = ""; + _categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList(); } } private void CategoryChanged(ChangeEventArgs e) { - _category = (string) e.Value; - _moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList(); - _moduleDefinitionName = "-"; - _description = ""; - StateHasChanged(); + Category = (string) e.Value; } private void ModuleChanged(ChangeEventArgs e) { - _moduleDefinitionName = (string)e.Value; - if (_moduleDefinitionName != "-") + ModuleDefinitionName = (string) e.Value; + if (ModuleDefinitionName != "-") { - var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName); - _description = "
" + moduleDefinition.Description + "
"; + var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName); + Description = "
" + moduleDefinition.Description + "
"; } else { - _description = ""; + Description = ""; } + StateHasChanged(); } private void PageChanged(ChangeEventArgs e) { - _pageId = (string) e.Value; - _modules?.Clear(); - - if (_pageId != "-") + PageId = (string) e.Value; + if (PageId != "-") { - foreach (Module module in PageState.Modules.Where(item => item.PageId == int.Parse(_pageId) && !item.IsDeleted)) - { - if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, module.Permissions)) - { - _modules.Add(module); - } - } + _modules = PageState.Modules + .Where(module => module.PageId == int.Parse(PageId) + && !module.IsDeleted + && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.Permissions)) + .ToList(); } - - _moduleId = "-"; + ModuleId = "-"; StateHasChanged(); } private async Task AddModule() { - if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions)) + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { - if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-")) + if ((ModuleType == "new" && ModuleDefinitionName != "-") || (ModuleType != "new" && ModuleId != "-")) { - if (_moduleType == "new") + if (ModuleType == "new") { Module module = new Module(); module.SiteId = PageState.Site.SiteId; module.PageId = PageState.Page.PageId; - module.ModuleDefinitionName = _moduleDefinitionName; + module.ModuleDefinitionName = ModuleDefinitionName; module.AllPages = false; module.Permissions = PageState.Page.Permissions; module = await ModuleService.AddModuleAsync(module); - _moduleId = module.ModuleId.ToString(); + ModuleId = module.ModuleId.ToString(); } var pageModule = new PageModule { PageId = PageState.Page.PageId, - ModuleId = int.Parse(_moduleId), - Title = _title + ModuleId = int.Parse(ModuleId), + Title = Title }; if (pageModule.Title == "") { - if (_moduleType == "new") + if (ModuleType == "new") { - pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName)?.Name; + pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName)?.Name; } else { - pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(_moduleId))?.Title; + pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(ModuleId))?.Title; } } - pageModule.Pane = _pane; + pageModule.Pane = Pane; pageModule.Order = int.MaxValue; - pageModule.ContainerType = _containerType; + pageModule.ContainerType = ContainerType; if (pageModule.ContainerType == PageState.Site.DefaultContainerType) { @@ -397,32 +395,23 @@ await PageModuleService.AddPageModuleAsync(pageModule); await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane); - _message = "
Module Added To Page
"; - - _moduleDefinitionName = "-"; - _description = ""; - _pane = ""; - _title = ""; - _containerType = ""; - _pageId = "-"; - _moduleId = "-"; - + Message = "
Module Added To Page
"; NavigationManager.NavigateTo(NavigateUrl()); } else { - _message = "
You Must Select A Module
"; + Message = "
You Must Select A Module
"; } } else { - _message = "
Not Authorized
"; + Message = "
Not Authorized
"; } } private async Task ToggleEditMode(bool EditMode) { - if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, PageState.Page.Permissions)) + if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { if (EditMode) { @@ -432,6 +421,7 @@ { PageState.EditMode = true; } + NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "edit=" + ((PageState.EditMode) ? "1" : "0"))); } else @@ -447,14 +437,14 @@ private void ShowControlPanel() { - _message = ""; + Message = ""; _display = "width: 25%; min-width: 375px;"; StateHasChanged(); } private void HideControlPanel() { - _message = ""; + Message = ""; _display = "width: 0%;"; StateHasChanged(); } @@ -466,7 +456,7 @@ switch (location) { case "Admin": - // get admin dashboard moduleid + // get admin dashboard moduleid module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.AdminDashboardModule); if (module != null) @@ -478,7 +468,7 @@ case "Add": case "Edit": string url = ""; - // get page management moduleid + // get page management moduleid module = PageState.Modules.FirstOrDefault(item => item.ModuleDefinitionName == Constants.PageManagementModule); if (module != null) @@ -536,4 +526,18 @@ } } + private string settingName = "CP-category"; + + private async Task LoadSettingsAsync() + { + Dictionary settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); + _category = SettingService.GetSetting(settings, settingName, "Common"); + } + + private async Task UpdateSettingsAsync() + { + Dictionary settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); + SettingService.SetSetting(settings, settingName, _category); + await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); + } } From 068803615b6a202fb87d9db1471f1db9f2aeb287 Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Fri, 22 May 2020 21:29:52 +0200 Subject: [PATCH 2/4] Notification job fill mail subject --- Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs index bd667486..b3a3e7b2 100644 --- a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs @@ -66,7 +66,7 @@ namespace Oqtane.Infrastructure { MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress(settings["SMTPUsername"], site.Name); - + mailMessage.Subject = notification.Subject; if (notification.FromUserId != null) { mailMessage.Body = "From: " + notification.FromUser.DisplayName + "<" + notification.FromUser.Email + ">" + "\n"; From 2f272ef4b6fa42d1a61619932c2af722d0e4a81e Mon Sep 17 00:00:00 2001 From: Cody Date: Sun, 24 May 2020 17:47:27 -0700 Subject: [PATCH 3/4] style module actions dropdown text #fff --- .../wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Oqtane.Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css b/Oqtane.Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css index 693c8e7f..b8056c79 100644 --- a/Oqtane.Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css +++ b/Oqtane.Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css @@ -46,6 +46,10 @@ body { margin-left: auto; } +div.app-moduleactions a.dropdown-toggle, div.app-moduleactions div.dropdown-menu { + color:#ffffff; +} + @media (max-width: 767px) { .app-menu { @@ -76,4 +80,4 @@ body { position: relative; top: 60px; } -} \ No newline at end of file +} From 97df6736091e7d0cccfa6079eba2fed7926ade1c Mon Sep 17 00:00:00 2001 From: Jim Spillane Date: Sun, 24 May 2020 23:04:55 -0400 Subject: [PATCH 4/4] Change JavaScript namespace from interop to Oqtane --- .../Modules/Controls/RichTextEditorInterop.cs | 14 +++++------ Oqtane.Client/UI/Interop.cs | 24 +++++++++---------- Oqtane.Server/wwwroot/js/interop.js | 4 +++- Oqtane.Server/wwwroot/js/quill-interop.js | 4 +++- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/RichTextEditorInterop.cs b/Oqtane.Client/Modules/Controls/RichTextEditorInterop.cs index c9b442d4..a5bd4ffa 100644 --- a/Oqtane.Client/Modules/Controls/RichTextEditorInterop.cs +++ b/Oqtane.Client/Modules/Controls/RichTextEditorInterop.cs @@ -24,7 +24,7 @@ namespace Oqtane.Modules.Controls try { _jsRuntime.InvokeAsync( - "interop.createQuill", + "Oqtane.RichTextEditor.createQuill", quillElement, toolbar, readOnly, placeholder, theme, debugLevel); return Task.CompletedTask; @@ -40,7 +40,7 @@ namespace Oqtane.Modules.Controls try { return _jsRuntime.InvokeAsync( - "interop.getQuillText", + "Oqtane.RichTextEditor.getQuillText", quillElement); } catch @@ -54,7 +54,7 @@ namespace Oqtane.Modules.Controls try { return _jsRuntime.InvokeAsync( - "interop.getQuillHTML", + "Oqtane.RichTextEditor.getQuillHTML", quillElement); } catch @@ -68,7 +68,7 @@ namespace Oqtane.Modules.Controls try { return _jsRuntime.InvokeAsync( - "interop.getQuillContent", + "Oqtane.RichTextEditor.getQuillContent", quillElement); } catch @@ -82,7 +82,7 @@ namespace Oqtane.Modules.Controls try { _jsRuntime.InvokeAsync( - "interop.loadQuillContent", + "Oqtane.RichTextEditor.loadQuillContent", quillElement, content); return Task.CompletedTask; } @@ -97,7 +97,7 @@ namespace Oqtane.Modules.Controls try { _jsRuntime.InvokeAsync( - "interop.enableQuillEditor", quillElement, mode); + "Oqtane.RichTextEditor.enableQuillEditor", quillElement, mode); return Task.CompletedTask; } catch @@ -111,7 +111,7 @@ namespace Oqtane.Modules.Controls try { _jsRuntime.InvokeAsync( - "interop.insertQuillImage", + "Oqtane.RichTextEditor.insertQuillImage", quillElement, imageUrl); return Task.CompletedTask; } diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 5c95ade6..c098ad34 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -17,7 +17,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.setCookie", + "Oqtane.Interop.setCookie", name, value, days); return Task.CompletedTask; } @@ -32,7 +32,7 @@ namespace Oqtane.UI try { return _jsRuntime.InvokeAsync( - "interop.getCookie", + "Oqtane.Interop.getCookie", name); } catch @@ -46,7 +46,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.updateTitle", + "Oqtane.Interop.updateTitle", title); return Task.CompletedTask; } @@ -61,7 +61,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.includeMeta", + "Oqtane.Interop.includeMeta", id, attribute, name, content); return Task.CompletedTask; } @@ -76,7 +76,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.includeLink", + "Oqtane.Interop.includeLink", id, rel, url, type, integrity, crossorigin); return Task.CompletedTask; } @@ -91,7 +91,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.includeScript", + "Oqtane.Interop.includeScript", id, src, content, location, integrity, crossorigin); return Task.CompletedTask; } @@ -106,7 +106,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.includeLink", + "Oqtane.Interop.includeLink", id, "stylesheet", url, "text/css"); return Task.CompletedTask; } @@ -121,7 +121,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.removeElementsById", + "Oqtane.Interop.removeElementsById", prefix, first, last); return Task.CompletedTask; } @@ -137,7 +137,7 @@ namespace Oqtane.UI try { return _jsRuntime.InvokeAsync( - "interop.getElementByName", + "Oqtane.Interop.getElementByName", name); } catch @@ -151,7 +151,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.submitForm", + "Oqtane.Interop.submitForm", path, fields); return Task.CompletedTask; } @@ -166,7 +166,7 @@ namespace Oqtane.UI try { return _jsRuntime.InvokeAsync( - "interop.getFiles", + "Oqtane.Interop.getFiles", id); } catch @@ -180,7 +180,7 @@ namespace Oqtane.UI try { _jsRuntime.InvokeAsync( - "interop.uploadFiles", + "Oqtane.Interop.uploadFiles", posturl, folder, id); return Task.CompletedTask; } diff --git a/Oqtane.Server/wwwroot/js/interop.js b/Oqtane.Server/wwwroot/js/interop.js index 01762d32..4317b07f 100644 --- a/Oqtane.Server/wwwroot/js/interop.js +++ b/Oqtane.Server/wwwroot/js/interop.js @@ -1,4 +1,6 @@ -window.interop = { +var Oqtane = Oqtane || {}; + +Oqtane.Interop = { setCookie: function (name, value, days) { var d = new Date(); d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); diff --git a/Oqtane.Server/wwwroot/js/quill-interop.js b/Oqtane.Server/wwwroot/js/quill-interop.js index 4d34231d..abb1b35f 100644 --- a/Oqtane.Server/wwwroot/js/quill-interop.js +++ b/Oqtane.Server/wwwroot/js/quill-interop.js @@ -1,4 +1,6 @@ -window.interop = { +var Oqtane = Oqtane || {}; + +Oqtane.RichTextEditor = { createQuill: function ( quillElement, toolBar, readOnly, placeholder, theme, debugLevel) {