Skip to content

Commit d58037b

Browse files
Recycle Bin improvements (Lombiq Technologies: COLI-1711) (#8890)
1 parent 8687ca0 commit d58037b

File tree

3 files changed

+38
-33
lines changed

3 files changed

+38
-33
lines changed

src/Orchard.Web/Modules/Orchard.AuditTrail/Controllers/RecycleBinController.cs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Web.Mvc;
55
using Orchard.AuditTrail.Helpers;
66
using Orchard.AuditTrail.Services;
7-
using Orchard.AuditTrail.Services.Models;
87
using Orchard.AuditTrail.ViewModels;
98
using Orchard.ContentManagement;
109
using Orchard.Environment.Extensions;
@@ -28,21 +27,19 @@ public class RecycleBinController : Controller
2827
private readonly IOrchardServices _services;
2928
private readonly IRecycleBin _recycleBin;
3029

31-
public RecycleBinController(IAuthorizer authorizer, IContentManager contentManager, INotifier notifier, IOrchardServices services, IRecycleBin recycleBin)
30+
public RecycleBinController(IOrchardServices services, IRecycleBin recycleBin)
3231
{
33-
_authorizer = authorizer;
34-
_contentManager = contentManager;
35-
_notifier = notifier;
32+
_authorizer = services.Authorizer;
33+
_contentManager = services.ContentManager;
34+
_notifier = services.Notifier;
3635
_services = services;
3736
_recycleBin = recycleBin;
38-
T = NullLocalizer.Instance;
39-
Logger = NullLogger.Instance;
4037
}
4138

42-
public Localizer T { get; set; }
43-
public ILogger Logger { get; set; }
39+
public Localizer T { get; set; } = NullLocalizer.Instance;
40+
public ILogger Logger { get; set; } = NullLogger.Instance;
4441

45-
public ActionResult Index(PagerParameters pagerParameters, AuditTrailOrderBy? orderBy = null)
42+
public ActionResult Index(PagerParameters pagerParameters)
4643
{
4744
if (!_authorizer.Authorize(Permissions.ViewAuditTrail))
4845
return new HttpUnauthorizedResult();
@@ -76,7 +73,7 @@ public ActionResult ExecuteAction(RecycleBinViewModel viewModel, PagerParameters
7673
ModelState.AddModelError("RecycleBinCommand", T("Please select an action to execute.").Text);
7774
}
7875

79-
if (viewModel.SelectedContentItems == null || !viewModel.SelectedContentItems.Any())
76+
if (viewModel.SelectedContentItems == null || !viewModel.SelectedContentItems.Any(item => item.Selected))
8077
{
8178
ModelState.AddModelError("SelectedContentItems", T("Please select one or more content items.").Text);
8279
}
@@ -108,10 +105,10 @@ private RecycleBinViewModel SetupViewModel(RecycleBinViewModel viewModel, PagerP
108105
{
109106
var pager = new Pager(_services.WorkContext.CurrentSite, pagerParameters);
110107
var removedContentItems = _recycleBin.List(pager.Page, pager.PageSize);
111-
var pagershape = _services.New.Pager(pager).TotalItemCount(removedContentItems.TotalItemCount);
108+
var pagerShape = _services.New.Pager(pager).TotalItemCount(removedContentItems.TotalItemCount);
112109

113110
viewModel.ContentItems = removedContentItems;
114-
viewModel.Pager = pagershape;
111+
viewModel.Pager = pagerShape;
115112

116113
return viewModel;
117114
}
@@ -143,7 +140,9 @@ private void DeleteContentItems(IEnumerable<int> selectedContentItems)
143140
var contentItemTitle = _contentManager.GetItemMetadata(contentItem).DisplayText;
144141
if (!_authorizer.Authorize(Core.Contents.Permissions.DeleteContent, contentItem))
145142
{
146-
_notifier.Error(T("You need to have permission to delete <strong>{0}</strong> to be able to permanently delete it.", contentItemTitle));
143+
_notifier.Error(
144+
T("You need to have permission to delete <strong>{0}</strong> to be able to permanently delete it.",
145+
contentItemTitle));
147146
continue;
148147
}
149148

@@ -162,4 +161,4 @@ private void DeleteContentItems(IEnumerable<int> selectedContentItems)
162161
}
163162

164163
}
165-
}
164+
}

src/Orchard.Web/Modules/Orchard.AuditTrail/Services/RecycleBin.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,12 @@ public IEnumerable<T> GetMany<T>(IEnumerable<int> contentItemIds, QueryHints hin
5757

5858
public ContentItem Restore(ContentItem contentItem)
5959
{
60-
var versions = contentItem.Record.Versions.OrderBy(x => x.Number).ToArray();
61-
var lastVersion = versions.Last();
60+
var lastVersion = contentItem.Record.Versions.OrderBy(x => x.Number).ToArray().Last();
6261

63-
if (lastVersion.Latest || lastVersion.Published)
64-
throw new InvalidOperationException(string.Format("Cannot restore content item with ID {0} ftom the recycle bin, since that item is not deleted", contentItem.Id));
65-
66-
return _contentManager.Restore(contentItem, VersionOptions.Restore(lastVersion.Number, publish: false));
62+
return lastVersion.Latest || lastVersion.Published
63+
? throw new InvalidOperationException(
64+
$"Cannot restore content item with ID {contentItem.Id} from the recycle bin, since that item is not deleted.")
65+
: _contentManager.Restore(contentItem, VersionOptions.Restore(lastVersion.Number, publish: false));
6766
}
6867

6968
private IEnumerable<T> LoadContentItems<T>(IQuery query, QueryHints hints = null) where T : class, IContent
@@ -82,7 +81,7 @@ private IQuery GetDeletedVersionsQuery(IEnumerable<int> contentItemIds = null)
8281
"select max(ContentItemVersionRecord.Id), ContentItemVersionRecord.ContentItemRecord.Id, max(ContentItemVersionRecord.Number) " +
8382
"from Orchard.ContentManagement.Records.ContentItemVersionRecord ContentItemVersionRecord ";
8483

85-
var filter = contentItemIds != null ? "where ContentItemVersionRecord.ContentItemRecord.Id in (:ids) " : default(string);
84+
var filter = contentItemIds != null ? "where ContentItemVersionRecord.ContentItemRecord.Id in (:ids) " : default;
8685

8786
var group =
8887
"group by ContentItemVersionRecord.ContentItemRecord.Id " +
@@ -99,4 +98,4 @@ private IQuery GetDeletedVersionsQuery(IEnumerable<int> contentItemIds = null)
9998
return query;
10099
}
101100
}
102-
}
101+
}

src/Orchard.Web/Modules/Orchard.AuditTrail/Views/RecycleBin/Index.cshtml

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
1-
@using Orchard.AuditTrail.ViewModels
1+
@using Orchard.AuditTrail.ViewModels
22
@using Orchard.ContentManagement
33
@using Orchard.Core.Common.Models
44
@using Orchard.Localization.Services
5+
56
@model RecycleBinViewModel
7+
68
@{
79
Style.Include("audittrail-recycle-bin.css");
810
Script.Require("ShapesBase");
9-
Script.Include(("audittrail-recyclebin.js"));
11+
Script.Include("audittrail-recyclebin.js");
1012
Layout.Title = T("Audit Trail");
1113

1214
var contentItems = Model.ContentItems;
1315
var dateLocalizationServices = WorkContext.Resolve<IDateLocalizationServices>();
1416
}
17+
1518
<div id="recycle-bin">
1619
@Html.ValidationSummary()
17-
@using (Html.BeginFormAntiForgeryPost()) {
20+
@using (Html.BeginFormAntiForgeryPost())
21+
{
1822
<fieldset class="bulk-actions">
1923
<label>@T("Actions:")</label>
2024
<select name="RecycleBinCommand">
21-
<option></option>
22-
<option value="@RecycleBinCommand.Restore" data-unsafe-action="@T("Are you sure you want to restore the selected items?")" @if(Model.RecycleBinCommand == RecycleBinCommand.Restore){<text>selected="selected"</text>}>@T("Restore")</option>
25+
<option value="">@T("Choose action...")</option>
26+
<option value="@RecycleBinCommand.Restore" data-unsafe-action="@T("Are you sure you want to restore the selected items?")" @if (Model.RecycleBinCommand == RecycleBinCommand.Restore) { <text> selected="selected" </text> }>@T("Restore")</option>
2327
@**TODO: Decide wether or not to allow users to permanently delete items. Commented out for now.*@
2428
@*<option value="@RecycleBinCommand.Destroy" data-unsafe-action="@T("WARNING: This will PERMANENTLY delete the selected content items, including related content part records, never to be seen again. Are you sure you want to do this?")" @if (Model.RecycleBinCommand == RecycleBinCommand.Destroy) { <text> selected="selected" </text> }>@T("Remove Permanently ☠")</option>*@
2529
</select>
@@ -28,10 +32,12 @@
2832
<button type="submit" class="filter-apply-button" name="ExecuteActionButton" value="ExecuteActionButton">@T("Execute")</button>
2933
</div>
3034
<section class="recycle-bin-list-section">
31-
@if (!contentItems.Any()) {
35+
@if (!contentItems.Any())
36+
{
3237
<p class="info">@T("There are no records to display.")</p>
3338
}
34-
else {
39+
else
40+
{
3541
<table class="items">
3642
<thead>
3743
<tr>
@@ -44,17 +50,18 @@
4450
<tbody>
4551
@{
4652
var index = 0;
47-
foreach (var contentItem in contentItems) {
53+
foreach (var contentItem in contentItems)
54+
{
4855
var isSelected = Model.SelectedContentItems.Where(x => x.Id == contentItem.Id && x.Selected).Select(x => x.Id).Any();
4956
var commonPart = contentItem.As<CommonPart>();
5057
var removedText = commonPart != null ? dateLocalizationServices.ConvertToLocalizedString(commonPart.VersionModifiedUtc) : T("-").Text;
5158
var contentDisplayTextHtmlString = Html.ItemDisplayText(contentItem);
5259
var contentDisplayText = contentDisplayTextHtmlString != null ? contentDisplayTextHtmlString.ToString() : contentItem.ContentType;
53-
var contentDisplayUrl = Url.Action("Detail", "Content", new {id = contentItem.Id, version = contentItem.Version, area = "Orchard.AuditTrail"});
60+
var contentDisplayUrl = Url.Action("Detail", "Content", new { id = contentItem.Id, version = contentItem.Version, area = "Orchard.AuditTrail" });
5461
<tr>
5562
<td>
5663
<input type="hidden" name="SelectedContentItems[@index].Id" value="@contentItem.Id" />
57-
<input type="checkbox" name="SelectedContentItems[@index].Selected" value="true" @if(isSelected){<text>checked="checked"</text>} />
64+
<input type="checkbox" name="SelectedContentItems[@index].Selected" value="true" @if (isSelected) { <text> checked="checked" </text> } />
5865
</td>
5966
<td class="content-column"><a href="@contentDisplayUrl">@contentDisplayText</a></td>
6067
<td class="content-removed-column">@removedText</td>

0 commit comments

Comments
 (0)