mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Incremental work on event details view.
This commit is contained in:
@@ -68,9 +68,12 @@ namespace Orchard.AuditTrail.Controllers {
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var record = _auditTrailManager.GetRecord(id);
|
||||
var recordShape = _displayBuilder.BuildDisplay(record, "Detail");
|
||||
var descriptor = _auditTrailManager.Describe(record.Event);
|
||||
var detailsShape = _displayBuilder.BuildDisplay(record, "Detail");
|
||||
var viewModel = new AuditTrailDetailsViewModel {
|
||||
Record = recordShape
|
||||
Record = record,
|
||||
Descriptor = descriptor,
|
||||
DetailsShape = detailsShape
|
||||
};
|
||||
return View(viewModel);
|
||||
}
|
||||
|
||||
@@ -101,9 +101,26 @@
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\EditorTemplates\Parts.AuditTrailSiteSettings.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-Created.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldAdded.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldRemoved.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-FieldSettingsUpdated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-PartSettingsUpdated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentPart-Removed.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-Created.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartAdded.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartRemoved.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-PartSettingsUpdated.SummaryAdmin.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-Removed.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-ContentType-TypeSettingsUpdated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-Role-PermissionAdded.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-Role-PermissionRemoved.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-Role-RoleCreated.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-Role-RoleRenamed.cshtml" />
|
||||
<Content Include="Views\AuditTrailEvent-User.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
|
||||
@@ -120,6 +137,7 @@
|
||||
<Compile Include="Controllers\AdminController.cs" />
|
||||
<Compile Include="Drivers\AuditTrailSiteSettingsPartDriver.cs" />
|
||||
<Compile Include="Models\AuditTrailEventRecordResult.cs" />
|
||||
<Compile Include="Providers\Content\ContentAuditTrailEventShapes.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailCategorySettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailEventSettingsViewModel.cs" />
|
||||
<Compile Include="ViewModels\AuditTrailSiteSettingsViewModel.cs" />
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.AuditTrail.Helpers;
|
||||
using Orchard.AuditTrail.Models;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.DisplayManagement.Descriptors;
|
||||
using Orchard.Environment;
|
||||
|
||||
namespace Orchard.AuditTrail.Providers.Content {
|
||||
public class ContentAuditTrailEventShapes : IShapeTableProvider {
|
||||
private readonly Work<IContentManager> _contentManager;
|
||||
public ContentAuditTrailEventShapes(Work<IContentManager> contentManager) {
|
||||
_contentManager = contentManager;
|
||||
}
|
||||
|
||||
public void Discover(ShapeTableBuilder builder) {
|
||||
builder.Describe("AuditTrailEvent").OnDisplaying(context => {
|
||||
var record = (AuditTrailEventRecord)context.Shape.Record;
|
||||
|
||||
if (record.Category != "Content" || context.ShapeMetadata.DisplayType != "Detail")
|
||||
return;
|
||||
|
||||
var eventData = (IDictionary<string, object>)context.Shape.EventData;
|
||||
var contentItemId = eventData.Get<int>("ContentItemId");
|
||||
var previousContentItemVersionId = eventData.Get<int>("PreviousContentItemVersionId");
|
||||
var contentItem = _contentManager.Value.Get(contentItemId);
|
||||
var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem);
|
||||
|
||||
context.Shape.ContentItem = contentItem;
|
||||
context.Shape.PreviousVersion = previousVersion;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,12 +22,14 @@ namespace Orchard.AuditTrail.Providers.Content {
|
||||
}
|
||||
|
||||
protected override void Updated(UpdateContentContext context) {
|
||||
// TODO: Update ContentManager to expose the previous version of the updated content item.
|
||||
RecordAuditTrail(ContentAuditTrailEventProvider.Saved, context.ContentItem, context.ContentItem.VersionRecord);
|
||||
var currentVersion = context.UpdatingItemVersionRecord;
|
||||
var previousVersion = GetPreviousVersion(currentVersion);
|
||||
RecordAuditTrail(ContentAuditTrailEventProvider.Saved, context.ContentItem, previousVersion);
|
||||
}
|
||||
|
||||
protected override void Published(PublishContentContext context) {
|
||||
RecordAuditTrail(ContentAuditTrailEventProvider.Published, context.ContentItem);
|
||||
var previousVersion = context.PreviousItemVersionRecord;
|
||||
RecordAuditTrail(ContentAuditTrailEventProvider.Published, context.ContentItem, previousVersion);
|
||||
}
|
||||
|
||||
protected override void Unpublished(PublishContentContext context) {
|
||||
@@ -38,6 +40,17 @@ namespace Orchard.AuditTrail.Providers.Content {
|
||||
RecordAuditTrail(ContentAuditTrailEventProvider.Removed, context.ContentItem);
|
||||
}
|
||||
|
||||
private ContentItemVersionRecord GetPreviousVersion(ContentItemVersionRecord currentVersion) {
|
||||
var number = currentVersion.Number;
|
||||
var previousVersion = default(ContentItemVersionRecord);
|
||||
|
||||
while (previousVersion == null) {
|
||||
var contentItem = _contentManager.Get(currentVersion.ContentItemRecord.Id, VersionOptions.Number(--number));
|
||||
previousVersion = contentItem != null ? contentItem.VersionRecord : default(ContentItemVersionRecord);
|
||||
}
|
||||
return previousVersion;
|
||||
}
|
||||
|
||||
private void RecordAuditTrail(string eventName, IContent content, ContentItemVersionRecord previousContentItemVersion = null) {
|
||||
var title = _contentManager.GetItemMetadata(content).DisplayText;
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace Orchard.AuditTrail.Services {
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}", displayType));
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent__{0}", record.Category));
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", displayType, record.Category));
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", record.Category, GetShortName(record.Event)));
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent__{0}__{1}", record.Category, GetShortName(record.Event)));
|
||||
metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}__{2}", displayType, record.Category, GetShortName(record.Event)));
|
||||
return auditTrailEventShape;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.audit-trail-record-details fieldset legend span {
|
||||
.audit-trail-event fieldset legend span {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
using Orchard.AuditTrail.Models;
|
||||
|
||||
namespace Orchard.AuditTrail.ViewModels {
|
||||
public class AuditTrailDetailsViewModel {
|
||||
public dynamic Record { get; set; }
|
||||
public AuditTrailEventRecord Record { get; set; }
|
||||
public AuditTrailEventDescriptor Descriptor { get; set; }
|
||||
public dynamic DetailsShape { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,21 @@
|
||||
@{
|
||||
Style.Include("admin.css");
|
||||
}
|
||||
<section class="audit-trail-details">
|
||||
@Display(Model.Record)
|
||||
@{
|
||||
var record = Model.Record;
|
||||
var descriptor = Model.Descriptor;
|
||||
}
|
||||
<section class="audit-trail-event">
|
||||
<fieldset>
|
||||
<legend>@descriptor.Name - <span>@descriptor.CategoryDescriptor.Name</span></legend>
|
||||
<div>
|
||||
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
|
||||
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
|
||||
@T(" | ")<span>@record.UserName</span>
|
||||
}
|
||||
</div>
|
||||
</fieldset>
|
||||
</section>
|
||||
<section class="audit-trail-event-details">
|
||||
@Display(Model.DetailsShape)
|
||||
</section>
|
||||
@@ -1,21 +1,16 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@using Orchard.AuditTrail.Models
|
||||
@using Orchard.ContentManagement
|
||||
@{
|
||||
var record = (AuditTrailEventRecord)Model.Record;
|
||||
var descriptor = (AuditTrailEventDescriptor) Model.Descriptor;
|
||||
var eventData = (IDictionary<string, object>)Model.EventData;
|
||||
var title = eventData.Get<string>("Title");
|
||||
var contentItemId = eventData.Get<int>("ContentItemId");
|
||||
var contentItemVersionNumber = eventData.Get<int>("ContentItemVersionNumber");
|
||||
var contentItem = (ContentItem) Model.ContentItem;
|
||||
var previousVersion = (ContentItem) Model.PreviousVersion;
|
||||
}
|
||||
<div class="audit-trail-record-details">
|
||||
<fieldset>
|
||||
<legend>@descriptor.Name - <span>@descriptor.CategoryDescriptor.Name</span></legend>
|
||||
<div>
|
||||
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
|
||||
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
|
||||
@T(" | ")<span>@record.UserName</span>
|
||||
}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@T("This version:")
|
||||
@Html.ItemEditLink(contentItem)
|
||||
</div>
|
||||
@if (previousVersion != null) {
|
||||
<div>
|
||||
@T("Previous version:")
|
||||
@Html.ItemEditLink(previousVersion)
|
||||
</div>
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Created the <strong>{0}</strong> content part.", contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,12 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
var contentFieldName = eventData.Get<string>("ContentFieldName");
|
||||
var contentFieldTypeName = eventData.Get<string>("ContentFieldTypeName");
|
||||
var contentDisplayName = eventData.Get<string>("ContentDisplayName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Added the <strong>{0}</strong> content field of type <strong>{1}</strong> to the <strong>{2}</strong> content part.", contentFieldName, contentFieldTypeName, contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
var contentFieldName = eventData.Get<string>("ContentFieldName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Removed the <strong>{0}</strong> content field from the <strong>{1}</strong> content part.", contentFieldName, contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
var contentFieldName = eventData.Get<string>("ContentFieldName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Settings for the <strong>{0}</strong> content field of the <strong>{1}</strong> content part were updated.", contentFieldName, contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Settings for the <strong>{0}</strong> content part were updated.", contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-part">
|
||||
@T("Removed the <strong>{0}</strong> content part.", contentPartName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
var contentTypeDisplayName = eventData.Get<string>("ContentTypeDisplayName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Created the <strong>{0}</strong> content type.", contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Added the <strong>{0}</strong> content part to the <strong>{1}</strong> content type.", contentPartName, contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Removed the <strong>{0}</strong> content part from the <strong>{1}</strong> content type.", contentPartName, contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
var contentPartName = eventData.Get<string>("ContentPartName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Settings for the <strong>{0}</strong> content part attached to the <strong>{1}</strong> content type were updated.", contentPartName, contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
var contentTypeDisplayName = eventData.Get<string>("ContentTypeDisplayName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Removed the <strong>{0}</strong> content type.", contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var contentTypeName = eventData.Get<string>("ContentTypeName");
|
||||
}
|
||||
|
||||
<section class="event-content-type">
|
||||
@T("Settings for the <strong>{0}</strong> content type were updated.", contentTypeName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var roleName = eventData.Get<string>("RoleName");
|
||||
var permissionName = eventData.Get<string>("PermissionName");
|
||||
}
|
||||
|
||||
<section class="event-role">
|
||||
@T("Added the <strong>{0}</strong> permission to the <strong>{1}</strong> role.", permissionName, roleName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var roleName = eventData.Get<string>("RoleName");
|
||||
var permissionName = eventData.Get<string>("PermissionName");
|
||||
}
|
||||
|
||||
<section class="event-role">
|
||||
@T("Removed the <strong>{0}</strong> permission from the <strong>{1}</strong> role.", permissionName, roleName)
|
||||
</section>
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var roleName = eventData.Get<string>("RoleName");
|
||||
}
|
||||
|
||||
<section class="event-role">
|
||||
@T("Created <strong>{0}</strong> role.", roleName)
|
||||
</section>
|
||||
@@ -0,0 +1,10 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var previousRoleName = eventData.Get<string>("PreviousRoleName");
|
||||
var newRoleName = eventData.Get<string>("NewRoleName");
|
||||
}
|
||||
|
||||
<section class="event-role">
|
||||
@T("Renamed <strong>{0}</strong> to <strong>{1}</strong>.", previousRoleName, newRoleName)
|
||||
</section>
|
||||
@@ -0,0 +1,9 @@
|
||||
@using Orchard.AuditTrail.Helpers
|
||||
@{
|
||||
var eventData = (IDictionary<string, object>) Model.EventData;
|
||||
var userName = eventData.Get<string>("UserName");
|
||||
}
|
||||
|
||||
<section class="event-user">
|
||||
<span>@userName</span>
|
||||
</section>
|
||||
@@ -1,15 +1,3 @@
|
||||
@using Orchard.AuditTrail.Models
|
||||
@{
|
||||
var record = (AuditTrailEventRecord)Model.Record;
|
||||
}
|
||||
<div class="audit-trail-record-details">
|
||||
<fieldset>
|
||||
<legend>@record.Event - <span>@record.Category</span></legend>
|
||||
<div>
|
||||
<span>@Display.DateTime(DateTimeUtc: record.CreatedUtc, CustomFormat: T("g"))</span>
|
||||
@if (!String.IsNullOrWhiteSpace(record.UserName)) {
|
||||
@T(" | ")<span>@record.UserName</span>
|
||||
}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
@{
|
||||
var model = Model;
|
||||
}
|
||||
Reference in New Issue
Block a user