fix #4976 - manage hierarchical path updates and page deletion
This commit is contained in:
parent
16477052e2
commit
90d2e0a40b
|
@ -26,14 +26,14 @@ else
|
||||||
<Header>
|
<Header>
|
||||||
<th style="width: 1px;"> </th>
|
<th style="width: 1px;"> </th>
|
||||||
<th style="width: 1px;"> </th>
|
<th style="width: 1px;"> </th>
|
||||||
<th>@SharedLocalizer["Name"]</th>
|
<th>@SharedLocalizer["Path"]</th>
|
||||||
<th>@Localizer["DeletedBy"]</th>
|
<th>@Localizer["DeletedBy"]</th>
|
||||||
<th>@Localizer["DeletedOn"]</th>
|
<th>@Localizer["DeletedOn"]</th>
|
||||||
</Header>
|
</Header>
|
||||||
<Row>
|
<Row>
|
||||||
<td><button type="button" @onclick="@(() => RestorePage(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
|
<td><button type="button" @onclick="@(() => RestorePage(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
|
||||||
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
|
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
|
||||||
<td>@context.Name</td>
|
<td>@context.Path</td>
|
||||||
<td>@context.DeletedBy</td>
|
<td>@context.DeletedBy</td>
|
||||||
<td>@context.DeletedOn</td>
|
<td>@context.DeletedOn</td>
|
||||||
</Row>
|
</Row>
|
||||||
|
@ -104,13 +104,26 @@ else
|
||||||
private async Task RestorePage(Page page)
|
private async Task RestorePage(Page page)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
var validated = true;
|
||||||
|
if (page.ParentId != null)
|
||||||
|
{
|
||||||
|
var parent = _pages.Find(item => item.PageId == page.ParentId);
|
||||||
|
validated = !parent.IsDeleted;
|
||||||
|
}
|
||||||
|
if (validated)
|
||||||
{
|
{
|
||||||
page.IsDeleted = false;
|
page.IsDeleted = false;
|
||||||
await PageService.UpdatePageAsync(page);
|
await PageService.UpdatePageAsync(page);
|
||||||
await logger.LogInformation("Page Restored {Page}", page);
|
await logger.LogInformation("Page Restored {Page}", page);
|
||||||
|
AddModuleMessage(Localizer["Success.Page.Restore"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
NavigationManager.NavigateTo(NavigateUrl());
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddModuleMessage(Localizer["Message.Page.Restore"], MessageType.Warning);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -125,9 +138,9 @@ else
|
||||||
{
|
{
|
||||||
await PageService.DeletePageAsync(page.PageId);
|
await PageService.DeletePageAsync(page.PageId);
|
||||||
await logger.LogInformation("Page Permanently Deleted {Page}", page);
|
await logger.LogInformation("Page Permanently Deleted {Page}", page);
|
||||||
|
AddModuleMessage(Localizer["Success.Page.Delete"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
NavigationManager.NavigateTo(NavigateUrl());
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -148,10 +161,10 @@ else
|
||||||
}
|
}
|
||||||
|
|
||||||
await logger.LogInformation("Pages Permanently Deleted");
|
await logger.LogInformation("Pages Permanently Deleted");
|
||||||
|
AddModuleMessage(Localizer["Success.Pages.Delete"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
HideProgressIndicator();
|
HideProgressIndicator();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
NavigationManager.NavigateTo(NavigateUrl());
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -169,6 +182,7 @@ else
|
||||||
pagemodule.IsDeleted = false;
|
pagemodule.IsDeleted = false;
|
||||||
await PageModuleService.UpdatePageModuleAsync(pagemodule);
|
await PageModuleService.UpdatePageModuleAsync(pagemodule);
|
||||||
await logger.LogInformation("Module Restored {Module}", module);
|
await logger.LogInformation("Module Restored {Module}", module);
|
||||||
|
AddModuleMessage(Localizer["Success.Module.Restore"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
@ -185,6 +199,7 @@ else
|
||||||
{
|
{
|
||||||
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
|
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
|
||||||
await logger.LogInformation("Module Permanently Deleted {Module}", module);
|
await logger.LogInformation("Module Permanently Deleted {Module}", module);
|
||||||
|
AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
@ -205,6 +220,7 @@ else
|
||||||
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
|
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
|
||||||
}
|
}
|
||||||
await logger.LogInformation("Modules Permanently Deleted");
|
await logger.LogInformation("Modules Permanently Deleted");
|
||||||
|
AddModuleMessage(Localizer["Success.Modules.Delete"], MessageType.Success);
|
||||||
await Load();
|
await Load();
|
||||||
HideProgressIndicator();
|
HideProgressIndicator();
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
|
|
|
@ -195,4 +195,25 @@
|
||||||
<data name="Modules.Heading" xml:space="preserve">
|
<data name="Modules.Heading" xml:space="preserve">
|
||||||
<value>Modules</value>
|
<value>Modules</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Message.Page.Restore" xml:space="preserve">
|
||||||
|
<value>You Cannot Restore A Page If Its Parent Is Deleted</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Page.Restore" xml:space="preserve">
|
||||||
|
<value>Page Restored Successfully</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Page.Delete" xml:space="preserve">
|
||||||
|
<value>Page Deleted Successfully</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Pages.Deleted" xml:space="preserve">
|
||||||
|
<value>All Pages Deleted Successfully</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Module.Restore" xml:space="preserve">
|
||||||
|
<value>Module Restored Successfully</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Module.Delete" xml:space="preserve">
|
||||||
|
<value>Module Deleted Successfully</value>
|
||||||
|
</data>
|
||||||
|
<data name="Success.Modules.Delete" xml:space="preserve">
|
||||||
|
<value>All Modules Deleted Successfully</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -474,4 +474,7 @@
|
||||||
<data name="User" xml:space="preserve">
|
<data name="User" xml:space="preserve">
|
||||||
<value>User</value>
|
<value>User</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Path" xml:space="preserve">
|
||||||
|
<value>Path</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -9,6 +9,8 @@ using System.Net;
|
||||||
using Oqtane.Enums;
|
using Oqtane.Enums;
|
||||||
using Oqtane.Infrastructure;
|
using Oqtane.Infrastructure;
|
||||||
using Oqtane.Repository;
|
using Oqtane.Repository;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
using Microsoft.AspNetCore.Diagnostics;
|
||||||
|
|
||||||
namespace Oqtane.Controllers
|
namespace Oqtane.Controllers
|
||||||
{
|
{
|
||||||
|
@ -279,18 +281,14 @@ namespace Oqtane.Controllers
|
||||||
// get current page permissions
|
// get current page permissions
|
||||||
var currentPermissions = _permissionRepository.GetPermissions(page.SiteId, EntityNames.Page, page.PageId).ToList();
|
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
|
// update page
|
||||||
if (currentPage.Path != page.Path)
|
UpdatePage(page, page.Path, newPath, deleted);
|
||||||
{
|
|
||||||
var urlMapping = _urlMappings.GetUrlMapping(page.SiteId, currentPage.Path);
|
|
||||||
if (urlMapping != null)
|
|
||||||
{
|
|
||||||
urlMapping.MappedUrl = page.Path;
|
|
||||||
_urlMappings.UpdateUrlMapping(urlMapping);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// get differences between current and new page permissions
|
// get differences between current and new page permissions
|
||||||
var added = GetPermissionsDifferences(page.PermissionList, currentPermissions);
|
var added = GetPermissionsDifferences(page.PermissionList, currentPermissions);
|
||||||
|
@ -320,6 +318,7 @@ namespace Oqtane.Controllers
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// permissions removed
|
// permissions removed
|
||||||
foreach (Permission permission in 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);
|
_syncManager.AddSyncEvent(_alias, EntityNames.Site, page.SiteId, SyncEventActions.Refresh);
|
||||||
|
|
||||||
// personalized page
|
// personalized page
|
||||||
|
@ -378,6 +376,39 @@ namespace Oqtane.Controllers
|
||||||
return page;
|
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<Permission> GetPermissionsDifferences(List<Permission> permissions1, List<Permission> permissions2)
|
private List<Permission> GetPermissionsDifferences(List<Permission> permissions1, List<Permission> permissions2)
|
||||||
{
|
{
|
||||||
var differences = new List<Permission>();
|
var differences = new List<Permission>();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user