From e01db29354cbb7f6bc00cf2ce59985dbca4f4a3c Mon Sep 17 00:00:00 2001 From: Emanuele Filardo Date: Sat, 19 Oct 2019 22:33:12 +0200 Subject: [PATCH 1/5] Add TabControl & TabPage --- .../Themes/Controls/TabControl.razor | 43 +++++++++++++++++++ Oqtane.Client/Themes/Controls/TabPage.razor | 27 ++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 Oqtane.Client/Themes/Controls/TabControl.razor create mode 100644 Oqtane.Client/Themes/Controls/TabPage.razor diff --git a/Oqtane.Client/Themes/Controls/TabControl.razor b/Oqtane.Client/Themes/Controls/TabControl.razor new file mode 100644 index 00000000..f7b68b78 --- /dev/null +++ b/Oqtane.Client/Themes/Controls/TabControl.razor @@ -0,0 +1,43 @@ +@namespace Oqtane.Themes.Controls +@inherits ThemeControlBase + + +
+ @foreach (TabPage tabPage in Pages) + { + + } +
+ @ChildContent +
+ +@code { + // Next line is needed so we are able to add components inside + [Parameter] + public RenderFragment ChildContent { get; set; } + + public TabPage ActivePage { get; set; } + List Pages = new List(); + + internal void AddPage(TabPage tabPage) + { + Pages.Add(tabPage); + if (Pages.Count == 1) + ActivePage = tabPage; + StateHasChanged(); + } + + string GetButtonClass(TabPage page) + { + return page == ActivePage ? "btn-primary" : "btn-secondary"; + } + + void ActivatePage(TabPage page) + { + ActivePage = page; + } +} diff --git a/Oqtane.Client/Themes/Controls/TabPage.razor b/Oqtane.Client/Themes/Controls/TabPage.razor new file mode 100644 index 00000000..86e218b7 --- /dev/null +++ b/Oqtane.Client/Themes/Controls/TabPage.razor @@ -0,0 +1,27 @@ +@namespace Oqtane.Themes.Controls +@inherits ThemeControlBase + +@if (Parent.ActivePage == (TabPage)(object)this) +{ + @ChildContent +} + +@code { + [CascadingParameter] + private TabControl Parent { get; set; } + + [Parameter] + public RenderFragment ChildContent { get; set; } + + [Parameter] + public string Text { get; set; } + + protected override void OnInitialized() + { + if (Parent == null) + throw new ArgumentNullException(nameof(Parent), "TabPage must exist within a TabControl"); + + base.OnInitialized(); + Parent.AddPage((TabPage)(object)this); + } +} From ee3834b52af8ae08b0e34afaa0d9a051600f4e7b Mon Sep 17 00:00:00 2001 From: Emanuele Filardo Date: Sun, 20 Oct 2019 01:23:24 +0200 Subject: [PATCH 2/5] Improved RecycleBin with PageModules --- .../Modules/Admin/RecycleBin/Index.razor | 152 ++++++++++++++---- .../Themes/Controls/ControlPanel.razor | 5 +- Oqtane.Server/Repository/PageRepository.cs | 4 +- Oqtane.Shared/Models/Module.cs | 6 +- 4 files changed, 134 insertions(+), 33 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index a63a2895..ce2ca569 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -2,43 +2,100 @@ @inherits ModuleBase @inject NavigationManager NavigationManager @inject IPageModuleService PageModuleService +@inject IModuleService ModuleService @inject IPageService PageService -@*Add TabControl with Pages and Modules tabs*@ -

Pages

-@if (pageModules.Count == 0) -{ -

No deleted pages

-} -else -{ - -
- Name - Deletion audit -   -   -
- - @context.Name - @context.DeletedBy - @context.DeletedOn - - - -
-} + + + @if (pages.Count == 0) + { +
+

No deleted pages

+ } + else + { + +
+ Name + Deletion Audit +   +   +
+ + @context.Name + @context.DeletedBy - @context.DeletedOn + + + +
+ } +
+ + @if (pageModules.Count == 0) + { +
+

No deleted modules in pages

+ } + else + { + +
+ Page Name + Control Title + Deletion Audit +   +   +
+ + @PageState.Pages.Find(item => item.PageId == context.PageId).Name + @context.Title + @context.DeletedBy - @context.DeletedOn + + + +
+ } +
+
@code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } - List pageModules = new List(); + bool loadentities { get; set; } + + List pages { get; set; } + List pageModules { get; set; } + + protected override async Task OnInitializedAsync() + { + pages = new List(); + pageModules = new List(); + + loadentities = true; + + await LoadEntities(); + } protected override void OnParametersSet() { - pageModules = PageState.Pages.Where(item => item.IsDeleted).ToList(); + pages = PageState.Pages.Where(item => item.IsDeleted).ToList(); } - private async Task Restore(Page Page) + private async Task LoadEntities() + { + if (loadentities) + { + pageModules.Clear(); + foreach (var module in PageState.Modules.Where(item => item.IsDeleted)) + { + var pageModule = await PageModuleService.GetPageModuleAsync(module.PageModuleId); + pageModules.Add(pageModule); + } + loadentities = false; + } + } + + private async Task RestorePage(Page Page) { try { @@ -52,11 +109,52 @@ else } } - private async Task Delete(int PageId) + private async Task DeletePage(int PageId) { try { + var deletedPageModules = PageState.Modules.Where(item => item.PageId == PageId); await PageService.DeletePageAsync(PageId); + foreach (var module in deletedPageModules) + { + await ModuleService.DeleteModuleAsync(module.ModuleId); + } + NavigationManager.NavigateTo(NavigateUrl("admin/recyclebin", Reload.Site)); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } + + private async Task RestorePageModule(PageModule PageModule) + { + try + { + PageModule.IsDeleted = false; + await PageModuleService.UpdatePageModuleAsync(PageModule); + loadentities = true; + await LoadEntities(); + NavigationManager.NavigateTo(NavigateUrl("admin/recyclebin", Reload.Site)); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } + + private async Task DeletePageModule(int PageModuleId, int ModuleId) + { + try + { + await PageModuleService.DeletePageModuleAsync(PageModuleId); + if (PageState.Modules.Count(item => item.ModuleId == ModuleId) == 1) + { + await ModuleService.DeleteModuleAsync(ModuleId); + } + PageState.Modules.RemoveAt(PageState.Modules.FindIndex(item => item.ModuleId == ModuleId)); + loadentities = true; + await LoadEntities(); NavigationManager.NavigateTo(NavigateUrl("admin/recyclebin", Reload.Site)); } catch (Exception ex) diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 8bef98e7..d27c38ad 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -149,7 +149,7 @@ string moduletype = "new"; List categories = new List(); List moduledefinitions; - List pages; + List pages = new List(); string pageid = ""; string moduleid = "-"; List modules = new List(); @@ -176,7 +176,7 @@ if (UserSecurity.IsAuthorized(PageState.User, "Edit", PageState.Page.Permissions)) { - pages = new List(); + pages?.Clear(); foreach (ModuleDefinition moduledefinition in PageState.ModuleDefinitions) { @@ -224,6 +224,7 @@ private void PageChanged(ChangeEventArgs e) { pageid = (string)e.Value; + modules?.Clear(); if (pageid != "") { foreach (Module module in PageState.Modules.Where(item => item.PageId == int.Parse(pageid) && !item.IsDeleted)) diff --git a/Oqtane.Server/Repository/PageRepository.cs b/Oqtane.Server/Repository/PageRepository.cs index 78a21e9e..51b6510a 100644 --- a/Oqtane.Server/Repository/PageRepository.cs +++ b/Oqtane.Server/Repository/PageRepository.cs @@ -10,14 +10,12 @@ namespace Oqtane.Repository private TenantDBContext db; private readonly IPermissionRepository Permissions; private readonly IPageModuleRepository PageModules; - private readonly IModuleRepository ModuleRepository; - public PageRepository(TenantDBContext context, IPermissionRepository Permissions, IPageModuleRepository PageModules, IModuleRepository ModuleRepository) + public PageRepository(TenantDBContext context, IPermissionRepository Permissions, IPageModuleRepository PageModules) { db = context; this.Permissions = Permissions; this.PageModules = PageModules; - this.ModuleRepository = ModuleRepository; } public IEnumerable GetPages() diff --git a/Oqtane.Shared/Models/Module.cs b/Oqtane.Shared/Models/Module.cs index 09393b0a..259f3ee0 100644 --- a/Oqtane.Shared/Models/Module.cs +++ b/Oqtane.Shared/Models/Module.cs @@ -15,7 +15,11 @@ namespace Oqtane.Models public DateTime CreatedOn { get; set; } public string ModifiedBy { get; set; } public DateTime ModifiedOn { get; set; } - + + [NotMapped] + public string DeletedBy { get; set; } + [NotMapped] + public DateTime? DeletedOn { get; set; } [NotMapped] public bool IsDeleted { get; set; } From 5dcf12f441223703c419ce1c7abf93be0c03da77 Mon Sep 17 00:00:00 2001 From: Emanuele Filardo Date: Sun, 20 Oct 2019 17:34:46 +0200 Subject: [PATCH 3/5] remove no more neessary pseudo-lock --- .../Modules/Admin/RecycleBin/Index.razor | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index ce2ca569..c15dd486 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -60,9 +60,7 @@ @code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } - - bool loadentities { get; set; } - + List pages { get; set; } List pageModules { get; set; } @@ -70,9 +68,6 @@ { pages = new List(); pageModules = new List(); - - loadentities = true; - await LoadEntities(); } @@ -83,15 +78,11 @@ private async Task LoadEntities() { - if (loadentities) + pageModules.Clear(); + foreach (var module in PageState.Modules.Where(item => item.IsDeleted)) { - pageModules.Clear(); - foreach (var module in PageState.Modules.Where(item => item.IsDeleted)) - { - var pageModule = await PageModuleService.GetPageModuleAsync(module.PageModuleId); - pageModules.Add(pageModule); - } - loadentities = false; + var pageModule = await PageModuleService.GetPageModuleAsync(module.PageModuleId); + pageModules.Add(pageModule); } } @@ -133,7 +124,6 @@ { PageModule.IsDeleted = false; await PageModuleService.UpdatePageModuleAsync(PageModule); - loadentities = true; await LoadEntities(); NavigationManager.NavigateTo(NavigateUrl("admin/recyclebin", Reload.Site)); } @@ -153,7 +143,6 @@ await ModuleService.DeleteModuleAsync(ModuleId); } PageState.Modules.RemoveAt(PageState.Modules.FindIndex(item => item.ModuleId == ModuleId)); - loadentities = true; await LoadEntities(); NavigationManager.NavigateTo(NavigateUrl("admin/recyclebin", Reload.Site)); } From e551ec22135cc42871e81f9145fb98441a3dc5ba Mon Sep 17 00:00:00 2001 From: Emanuele Filardo Date: Mon, 21 Oct 2019 23:28:07 +0200 Subject: [PATCH 4/5] Rename TabPage into TabPanel --- .../Themes/Controls/TabControl.razor | 24 +++++++++---------- .../{TabPage.razor => TabPanel.razor} | 6 ++--- 2 files changed, 15 insertions(+), 15 deletions(-) rename Oqtane.Client/Themes/Controls/{TabPage.razor => TabPanel.razor} (77%) diff --git a/Oqtane.Client/Themes/Controls/TabControl.razor b/Oqtane.Client/Themes/Controls/TabControl.razor index f7b68b78..3e037678 100644 --- a/Oqtane.Client/Themes/Controls/TabControl.razor +++ b/Oqtane.Client/Themes/Controls/TabControl.razor @@ -3,12 +3,12 @@
- @foreach (TabPage tabPage in Pages) + @foreach (TabPanel tabPanel in Pages) { }
@@ -16,27 +16,27 @@
@code { - // Next line is needed so we are able to add components inside + // Next line is needed so we are able to add components inside [Parameter] public RenderFragment ChildContent { get; set; } - public TabPage ActivePage { get; set; } - List Pages = new List(); + public TabPanel ActivePage { get; set; } + List Pages = new List(); - internal void AddPage(TabPage tabPage) + internal void AddPage(TabPanel tabPanel) { - Pages.Add(tabPage); + Pages.Add(tabPanel); if (Pages.Count == 1) - ActivePage = tabPage; + ActivePage = tabPanel; StateHasChanged(); } - string GetButtonClass(TabPage page) + string GetButtonClass(TabPanel page) { return page == ActivePage ? "btn-primary" : "btn-secondary"; } - void ActivatePage(TabPage page) + void ActivatePage(TabPanel page) { ActivePage = page; } diff --git a/Oqtane.Client/Themes/Controls/TabPage.razor b/Oqtane.Client/Themes/Controls/TabPanel.razor similarity index 77% rename from Oqtane.Client/Themes/Controls/TabPage.razor rename to Oqtane.Client/Themes/Controls/TabPanel.razor index 86e218b7..964765d0 100644 --- a/Oqtane.Client/Themes/Controls/TabPage.razor +++ b/Oqtane.Client/Themes/Controls/TabPanel.razor @@ -1,7 +1,7 @@ @namespace Oqtane.Themes.Controls @inherits ThemeControlBase -@if (Parent.ActivePage == (TabPage)(object)this) +@if (Parent.ActivePage == (TabPanel)(object)this) { @ChildContent } @@ -19,9 +19,9 @@ protected override void OnInitialized() { if (Parent == null) - throw new ArgumentNullException(nameof(Parent), "TabPage must exist within a TabControl"); + throw new ArgumentNullException(nameof(Parent), "TabPanel must exist within a TabControl"); base.OnInitialized(); - Parent.AddPage((TabPage)(object)this); + Parent.AddPage((TabPanel)(object)this); } } From e0347e5e99b465f46f9ddc1d14e564d874a5a671 Mon Sep 17 00:00:00 2001 From: Emanuele Filardo Date: Tue, 22 Oct 2019 09:04:07 +0200 Subject: [PATCH 5/5] fix missing rename from page to tabpanel --- .../Themes/Controls/TabControl.razor | 24 +++++++++---------- Oqtane.Client/Themes/Controls/TabPanel.razor | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/TabControl.razor b/Oqtane.Client/Themes/Controls/TabControl.razor index 3e037678..abe9770a 100644 --- a/Oqtane.Client/Themes/Controls/TabControl.razor +++ b/Oqtane.Client/Themes/Controls/TabControl.razor @@ -3,11 +3,11 @@
- @foreach (TabPanel tabPanel in Pages) + @foreach (TabPanel tabPanel in TabPanels) { } @@ -20,24 +20,24 @@ [Parameter] public RenderFragment ChildContent { get; set; } - public TabPanel ActivePage { get; set; } - List Pages = new List(); + public TabPanel ActiveTabPanel { get; set; } + List TabPanels = new List(); - internal void AddPage(TabPanel tabPanel) + internal void AddTabPanel(TabPanel tabPanel) { - Pages.Add(tabPanel); - if (Pages.Count == 1) - ActivePage = tabPanel; + TabPanels.Add(tabPanel); + if (TabPanels.Count == 1) + ActiveTabPanel = tabPanel; StateHasChanged(); } - string GetButtonClass(TabPanel page) + string GetButtonClass(TabPanel tabPanel) { - return page == ActivePage ? "btn-primary" : "btn-secondary"; + return tabPanel == ActiveTabPanel ? "btn-primary" : "btn-secondary"; } - void ActivatePage(TabPanel page) + void ActivateTabPanel(TabPanel tabPanel) { - ActivePage = page; + ActiveTabPanel = tabPanel; } } diff --git a/Oqtane.Client/Themes/Controls/TabPanel.razor b/Oqtane.Client/Themes/Controls/TabPanel.razor index 964765d0..83bb34b4 100644 --- a/Oqtane.Client/Themes/Controls/TabPanel.razor +++ b/Oqtane.Client/Themes/Controls/TabPanel.razor @@ -1,7 +1,7 @@ @namespace Oqtane.Themes.Controls @inherits ThemeControlBase -@if (Parent.ActivePage == (TabPanel)(object)this) +@if (Parent.ActiveTabPanel == (TabPanel)(object)this) { @ChildContent } @@ -22,6 +22,6 @@ throw new ArgumentNullException(nameof(Parent), "TabPanel must exist within a TabControl"); base.OnInitialized(); - Parent.AddPage((TabPanel)(object)this); + Parent.AddTabPanel((TabPanel)(object)this); } }