diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index 4e4e2607..4b672b61 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -13,71 +13,71 @@ } else { - - - @if (!_pages.Where(item => item.IsDeleted).Any()) - { -
-

@Localizer["NoPage.Deleted"]

- } - else - { - -
-   -   - @SharedLocalizer["Name"] - @Localizer["DeletedBy"] - @Localizer["DeletedOn"] -
- + + + @if (!_pages.Where(item => item.IsDeleted).Any()) + { +
+

@Localizer["NoPage.Deleted"]

+ } + else + { + +
+   +   + @SharedLocalizer["Path"] + @Localizer["DeletedBy"] + @Localizer["DeletedOn"] +
+ - - @context.Name - @context.DeletedBy - @context.DeletedOn - -
-
- - } -
- - @if (!_modules.Where(item => item.IsDeleted).Any()) - { -
-

@Localizer["NoModule.Deleted"]

- } - else - { - -
-   -   - @Localizer["Page"] - @Localizer["Module"] - @Localizer["DeletedBy"] - @Localizer["DeletedOn"] -
- - - - @_pages.Find(item => item.PageId == context.PageId).Name - @context.Title - @context.DeletedBy - @context.DeletedOn - -
-
- - } -
-
+ + @context.Path + @context.DeletedBy + @context.DeletedOn +
+
+
+ + } +
+ + @if (!_modules.Where(item => item.IsDeleted).Any()) + { +
+

@Localizer["NoModule.Deleted"]

+ } + else + { + +
+   +   + @Localizer["Page"] + @Localizer["Module"] + @Localizer["DeletedBy"] + @Localizer["DeletedOn"] +
+ + + + @_pages.Find(item => item.PageId == context.PageId).Name + @context.Title + @context.DeletedBy + @context.DeletedOn + +
+
+ + } +
+
} @code { - private List _pages; - private List _modules; + private List _pages; + private List _modules; private int _pagePage = 1; private int _pageModule = 1; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; @@ -105,12 +105,25 @@ else { try { - page.IsDeleted = false; - await PageService.UpdatePageAsync(page); - await logger.LogInformation("Page Restored {Page}", page); - await Load(); - StateHasChanged(); - NavigationManager.NavigateTo(NavigateUrl()); + var validated = true; + if (page.ParentId != null) + { + var parent = _pages.Find(item => item.PageId == page.ParentId); + validated = !parent.IsDeleted; + } + if (validated) + { + page.IsDeleted = false; + await PageService.UpdatePageAsync(page); + await logger.LogInformation("Page Restored {Page}", page); + AddModuleMessage(Localizer["Success.Page.Restore"], MessageType.Success); + await Load(); + StateHasChanged(); + } + else + { + AddModuleMessage(Localizer["Message.Page.Restore"], MessageType.Warning); + } } catch (Exception ex) { @@ -125,9 +138,9 @@ else { await PageService.DeletePageAsync(page.PageId); await logger.LogInformation("Page Permanently Deleted {Page}", page); + AddModuleMessage(Localizer["Success.Page.Delete"], MessageType.Success); await Load(); StateHasChanged(); - NavigationManager.NavigateTo(NavigateUrl()); } catch (Exception ex) { @@ -148,10 +161,10 @@ else } await logger.LogInformation("Pages Permanently Deleted"); + AddModuleMessage(Localizer["Success.Pages.Delete"], MessageType.Success); await Load(); HideProgressIndicator(); StateHasChanged(); - NavigationManager.NavigateTo(NavigateUrl()); } catch (Exception ex) { @@ -169,6 +182,7 @@ else pagemodule.IsDeleted = false; await PageModuleService.UpdatePageModuleAsync(pagemodule); await logger.LogInformation("Module Restored {Module}", module); + AddModuleMessage(Localizer["Success.Module.Restore"], MessageType.Success); await Load(); StateHasChanged(); } @@ -185,6 +199,7 @@ else { await PageModuleService.DeletePageModuleAsync(module.PageModuleId); await logger.LogInformation("Module Permanently Deleted {Module}", module); + AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success); await Load(); StateHasChanged(); } @@ -205,6 +220,7 @@ else await PageModuleService.DeletePageModuleAsync(module.PageModuleId); } await logger.LogInformation("Modules Permanently Deleted"); + AddModuleMessage(Localizer["Success.Modules.Delete"], MessageType.Success); await Load(); HideProgressIndicator(); StateHasChanged(); diff --git a/Oqtane.Client/Resources/Modules/Admin/RecycleBin/Index.resx b/Oqtane.Client/Resources/Modules/Admin/RecycleBin/Index.resx index c45ee304..0e212ab8 100644 --- a/Oqtane.Client/Resources/Modules/Admin/RecycleBin/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/RecycleBin/Index.resx @@ -195,4 +195,25 @@ Modules + + You Cannot Restore A Page If Its Parent Is Deleted + + + Page Restored Successfully + + + Page Deleted Successfully + + + All Pages Deleted Successfully + + + Module Restored Successfully + + + Module Deleted Successfully + + + All Modules Deleted Successfully + \ No newline at end of file diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index b32eb955..a0078ea5 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -474,4 +474,7 @@ User + + Path + \ No newline at end of file diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index 97c303ac..e57091c7 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -9,6 +9,8 @@ using System.Net; using Oqtane.Enums; using Oqtane.Infrastructure; using Oqtane.Repository; +using System.Xml.Linq; +using Microsoft.AspNetCore.Diagnostics; namespace Oqtane.Controllers { @@ -279,18 +281,14 @@ namespace Oqtane.Controllers // get current page permissions var currentPermissions = _permissionRepository.GetPermissions(page.SiteId, EntityNames.Page, page.PageId).ToList(); - page = _pages.UpdatePage(page); + // preserve new path and deleted status + var newPath = page.Path; + var deleted = page.IsDeleted; + page.Path = currentPage.Path; + page.IsDeleted = currentPage.IsDeleted; - // save url mapping if page path changed - if (currentPage.Path != page.Path) - { - var urlMapping = _urlMappings.GetUrlMapping(page.SiteId, currentPage.Path); - if (urlMapping != null) - { - urlMapping.MappedUrl = page.Path; - _urlMappings.UpdateUrlMapping(urlMapping); - } - } + // update page + UpdatePage(page, page.Path, newPath, deleted); // get differences between current and new page permissions var added = GetPermissionsDifferences(page.PermissionList, currentPermissions); @@ -320,6 +318,7 @@ namespace Oqtane.Controllers }); } } + // permissions removed foreach (Permission permission in removed) { @@ -343,7 +342,6 @@ namespace Oqtane.Controllers } } - _syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Update); _syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh); // personalized page @@ -378,6 +376,39 @@ namespace Oqtane.Controllers return page; } + private void UpdatePage(Page page, string oldPath, string newPath, bool deleted) + { + var update = false; + if (oldPath != newPath) + { + var urlMapping = _urlMappings.GetUrlMapping(page.SiteId, page.Path); + if (urlMapping != null) + { + urlMapping.MappedUrl = newPath + page.Path.Substring(oldPath.Length); + _urlMappings.UpdateUrlMapping(urlMapping); + } + + page.Path = newPath + page.Path.Substring(oldPath.Length); + update = true; + } + if (deleted != page.IsDeleted) + { + page.IsDeleted = deleted; + update = true; + } + if (update) + { + _pages.UpdatePage(page); + _syncManager.AddSyncEvent(_alias, EntityNames.Page, page.PageId, SyncEventActions.Update); + } + + // update any children + foreach (var _page in _pages.GetPages(page.SiteId).Where(item => item.ParentId == page.PageId)) + { + UpdatePage(_page, oldPath, newPath, deleted); + } + } + private List GetPermissionsDifferences(List permissions1, List permissions2) { var differences = new List();